在WPF浮动撕下选项卡中托管Win32窗口

时间:2012-05-11 03:12:57

标签: c# wpf winapi

我目前正在WPF中托管Win32 OSG(基于OpenGL构建)控件。我正在使用telerik库。当窗格与MainWindow对接时,一切正常。但是,当我撕下标签时, 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 MainWindow的句柄。但是,当我拉出标签并且它变成浮动标签时,hwndParent.handle属性是我用Spy ++找不到的值。根据Spy ++的浮动标签'hwnd`值与上述方法生成的相同。我怀疑这可能是OSG图形没有显示的原因。

我的问题是:

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

  2. 为什么我的原生OSG图形没有显示在浮动撕下标签上?它是否与传入的父句柄有关?

1 个答案:

答案 0 :(得分:4)

RadDocking控件默认使用透明WPF窗口显示其ToolWindows,并且作为WPF的平台限制,您无法在此类透明窗口中显示任何非WPF内容。你可以做的是通过将ToolWindow的RadWindowInteropHelper.AllowTransparency附加属性设置为False来使窗口不透明。这可以使用自定义的GeneratedItemsFactory来实现。请参考this forum thread作为示例项目。

此致 Miroslav Nedyalkov, Telerik团队。