在Win32应用程序中集成UWP控件

随着Windows 10的不断更新,UWP(Universal Windows Platform)控件因其现代化的UI和丰富的功能而受到开发者的青睐。然而,传统的Win32应用程序依然广泛使用,并且拥有庞大的用户基础。为了将UWP控件的现代感与Win32应用程序的兼容性结合起来,可以使用C++17/WinRT API来实现这一目标。本文将介绍如何在Win32应用程序中集成UWP控件,以及实现过程中的关键步骤。

环境准备

要实现Win32应用程序与UWP控件的集成,首先需要确保开发环境满足以下要求:

  • Visual Studio 2017或更高版本。
  • Windows 10版本1903或更高。
  • 最新的Windows SDK(版本17763或更高)。
  • 链接库windowsapp.lib。

初始化WinRT

在Win32应用程序中使用UWP控件之前,需要先初始化WinRT。这可以通过调用winrt::init_apartment函数来实现。此外,还需要初始化WindowsXamlManager,以便在应用程序中使用XAML

winrt::init_apartment(apartment_type::single_threaded); WindowsXamlManager windowsXamlManager = WindowsXamlManager::InitializeForCurrentThread();

创建UWP控件

通过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控件交互

一旦UWP控件被加载到Win32应用程序中,就可以通过WinRT API与之交互。例如,可以通过as函数将控件转换为特定的类型,然后调用其成员函数。此外,还可以使用WinRT事件处理机制来响应控件的事件。

Button butt = ins.as

UWPLib项目

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();
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485