在 WPF 浮动撕下选项卡中承载 Win32 窗口

本文关键字:Win32 窗口 选项 WPF | 更新日期: 2023-09-27 18:34:00

我目前正在WPF中托管Win32 OSG(基于OpenGL构建(控件。我正在使用 telerik 对接库。当窗格与主窗口停靠时,一切正常。但是,当我撕下选项卡时,不会在撕下选项卡中重新创建 OSG 图形

我正在子类化HwndHost它使用 CreateWindowEx 创建本机 Win32 主机并返回本机句柄(请参阅下面的代码(。然后,我将该句柄传递给由用户控件承载的本机 OSG 代码。

    // inside my ControlHost class which derives from HwndHost
    protected override HandleRef BuildWindowCore(HandleRef hwndParent)
    {
        hwndControl = IntPtr.Zero;
        hwndHost = IntPtr.Zero;
        hwndHost = CreateWindowEx(0, "MDIClient", "",
                                  WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN,
                                  0, 0,
                                  hostHeight, hostWidth,
                                  hwndParent.Handle,
                                  (IntPtr)HOST_ID,
                                  IntPtr.Zero,
                                  0);
        return new HandleRef(this, hwndHost);
    }
调试

到上述方法时,正如预期的那样,当选项卡停靠在主窗口中时,hwndParent.handle参数是 WPF 主窗口的句柄。但是,当我拉出选项卡并使其成为浮动选项卡时,hwndParent.handle属性是我在 Spy++ 中找不到的值。根据 Spy++ 的浮动选项卡"hwnd"值与上述方法生成的值相同。我怀疑这可能是OSG图形不显示的原因。

我的问题是:

  1. 我知道在 WPF 中,只有一个与每个 Window 对象关联的 HWND,但是这如何与停靠库中的浮动面板一起工作?浮动面板实际上是作为基础对象的窗口还是用户控件?

  2. 知道为什么我的本机OSG图形没有显示在浮动撕下选项卡上吗?它是否与传入的父句柄有关?

在 WPF 浮动撕下选项卡中承载 Win32 窗口

默认情况下,RadDocking 控件使用透明 WPF 窗口来显示其工具窗口,并且作为 WPF 的平台限制,您不能在此类透明窗口中显示任何非 WPF 内容。您可以做的是通过将 ToolWindow 的 RadWindowInteropHelper.AllowTransparency attach 属性设置为 False 来使窗口不透明。这可以使用自定义的Generated ItemsFactory来实现。请参考此论坛主题作为示例项目。

问候米罗斯拉夫·涅迪亚尔科夫,泰勒里克团队。