Как создать классическое окно приложения Win32 с помощью WinRT?

Каков эквивалент C ++ WinRT для того, что в Win32 API будет регистрировать класс окна, создавать окно и затем поддерживать его в рабочем состоянии с помощью цикла перекачки сообщений?

В настоящее время я просматриваю и читаю документацию по WinRT, потому что хотел узнать, как делать все то, что я делал в Win32, современным способом C ++.

Мой опыт до сих пор был ужасным, и я просто признаю, что не понимаю.

Я пробовал это, но поскольку я не работаю в контейнере, кажется, что CoreWindow для потока еще не создан.

    int WINAPI wWinMain(HINSTANCE, HINSTANCE, LPWSTR, int)
    {
        winrt::init_apartment(winrt::apartment_type::single_threaded);
        winrt::Windows::UI::Core::CoreWindow window = winrt::Windows::UI::Core::CoreWindow::GetForCurrentThread();

        window.Activate();

        auto dispatcher = window.Dispatcher();

        using DispatcherOptions = winrt::Windows::UI::Core::CoreProcessEventsOption;
        const DispatcherOptions options = DispatcherOptions::ProcessUntilQuit;

        dispatcher.ProcessEvents(options);
    }

person vlind    schedule 04.07.2019    source источник
comment
Обычно winrt инициализируется многопоточным. Я не знаю, есть ли у однопоточного соединения какое-то предназначение. О твоей первой строчке.   -  person AnArrayOfFunctions    schedule 04.07.2019
comment
Если вы ищете библиотеку C ++, которая поможет вам в написании классического настольного приложения Win32, ознакомьтесь с реализацией Windows Библиотеки (WIL). Хотя C ++ / WinRT предлагает некоторые оболочки ресурсов для объектов Win32 в своем заголовке winrt / base.h, теперь этот заголовок создается. Вы можете сгенерировать его и для классического настольного приложения Win32, но я не уверен, как это сработает. Учитывая ограниченные возможности, которые он предлагает для программирования Win32, я бы, вероятно, просто выбрал WIL.   -  person IInspectable    schedule 05.07.2019
comment
Хотя большинство функций и API Win32 и UWP со временем стало легче комбинировать и сопоставлять, оконные системы по-прежнему являются исключением. Win32 CreateWindow, HWND и т. Д. Можно использовать только непосредственно из Win32 / настольных приложений / приложений с полным доверием, тогда как UWP CoreWindow / AppWindow можно использовать только из приложений UWP. Хотя вы можете использовать большинство API-интерфейсов WinRT из приложений Win32, API-интерфейсы WinRT для прямого управления Win32 HWND отсутствуют, вы бы просто использовали те же плоские API-интерфейсы C, как всегда (или некоторую оболочку, такую ​​как WIL, которая была предложена)   -  person Max Strini    schedule 31.07.2019


Ответы (2)


C ++ / WinRT - это современный C ++ способ использования среды выполнения Windows (также известный как WinRT) API. Эти API-интерфейсы являются производными от IInspectable, который в свою очередь является производным от IUnknown. Кроме winrt::com_ptr для COM-объектов, он не предлагает ничего особенного для классических Win32 API.

Вы, безусловно, можете использовать C ++ / WinRT для использования API среды выполнения Windows из классического приложения Win32, но для классических программ Win32 не существует такой вещи, как «CoreWindow». Все Windows::UI::CoreWindow связано с приложениями универсальной платформы Windows (UWP).

См. Microsoft Docs

person Chuck Walbourn    schedule 05.07.2019
comment
Итак, в этом примере настраивается окно пользовательского интерфейса XAML в цикле рабочего стола Win32? - person Chuck Walbourn; 06.07.2019
comment
Это тоже возможно, но здесь используется API Windows.UI.Composition для рендеринга настольного приложения в стиле Win32 с HWND и циклом сообщений. - person Kenny Kerr; 08.07.2019
comment
@ChuckWalbourn Действительно ли имеет смысл включать ‹base.h› только для того, чтобы использовать winrt::com_ptr для использования таких вещей COM, как DX, WASAPI и никаких других WinRT API. Каково текущее состояние (2020 г.) приложений Win32 и C ++ / WinRT? Могут ли они безопасно использовать WinRT API и могут ли такие приложения поддерживаться на классическом рабочем столе без ограничений, а также упаковываться и распространяться как приложения Магазина Windows. Я полностью потерял представление о том, что происходит в настоящее время. - person Zingam; 01.02.2020

C ++ / WinRt был разработан для поддержки проектируемых API, написанных с использованием системы типов Windows Runtime. К ним относятся API-интерфейсы Windows.UI.XAML и Winodws.UI.Composition. Однако эти API-интерфейсы разработаны для приложений в стиле UWP и имеют очень ограниченную возможность взаимодействия с классическими API-интерфейсами Win32.

Возможно, вам пригодятся библиотеки заголовков WIL. У него нет полных современных оболочек для C ++, которые вы получаете с C ++ / WinRT, но вы обнаружите, что библиотеки имеют интеллектуальные оболочки и различные вспомогательные средства для многих конструкций Win32. Вы можете найти документацию здесь.

person Ben Kuhn    schedule 06.07.2019