随着Windows 10的不断更新,UWP(Universal Windows Platform)控件因其现代化的UI和丰富的功能而受到开发者的青睐。然而,传统的Win32应用程序依然广泛使用,并且拥有庞大的用户基础。为了将UWP控件的现代感与Win32应用程序的兼容性结合起来,可以使用C++17/WinRT API来实现这一目标。本文将介绍如何在Win32应用程序中集成UWP控件,以及实现过程中的关键步骤。
要实现Win32应用程序与UWP控件的集成,首先需要确保开发环境满足以下要求:
在Win32应用程序中使用UWP控件之前,需要先初始化WinRT。这可以通过调用winrt::init_apartment
函数来实现。此外,还需要初始化WindowsXamlManager
,以便在应用程序中使用XAML。
winrt::init_apartment(apartment_type::single_threaded);
WindowsXamlManager windowsXamlManager = WindowsXamlManager::InitializeForCurrentThread();
通过DesktopWindowXamlSource
类,可以将UWP控件嵌入到Win32应用程序中。首先,需要创建一个DesktopWindowXamlSource
对象,然后将其与Win32窗口句柄关联。接下来,可以通过XAML定义控件,并将其加载到DesktopWindowXamlSource
对象中。
DesktopWindowXamlSource xs;
auto interopDetail = xs.as();
interopDetail->AttachToWindow(hh);
interopDetail->get_WindowHandle(&hwndDetailXamlIsland);
winrt::param::hstring str(LR"(
)");
winrt::Windows::Foundation::IInspectable ins = XamlReader::Load(str);
xs.Content(ins.as());
一旦UWP控件被加载到Win32应用程序中,就可以通过WinRT API与之交互。例如,可以通过as
函数将控件转换为特定的类型,然后调用其成员函数。此外,还可以使用WinRT事件处理机制来响应控件的事件。
Button butt = ins.as
UWPLib是一个将UWP控件表示为Win32控件的项目,它允许通过消息和通知与UWP控件进行交互。通过UWPLib,可以在Win32应用程序中创建UWP窗口,并使用WM_SETTEXT
消息加载XAML标记。
auto pv = LR"(
)";
SetWindowText(GetDlgItem(hh, 901), pv);
UWPLIB::UWPCONTROL* u = (UWPLIB::UWPCONTROL*)SendDlgItemMessage(hh, 901, UWPM_GET_CONTROL, 0, 0);
pivot = u->ins.as();