Win 10 1709上的视口问题

时间:2017-11-13 08:28:26

标签: c++ opengl adobe-illustrator

我正在使用hotdoor框架处理Adobe Illustrator的插件,因此我对窗口创建\ init进程没有任何深入的访问权限。话虽这么说,我一直在使用openGL在我的插件中渲染一些图形。我从一个小部件中检索了CWnd并用它来初始化openGL上下文,如下所示:

CWnd *pWnd = frame.platformWidget();
HWND mHwnd = pWnd->GetSafeHwnd();
HDC mHdc = pWnd->GetDC()->m_hDC;
//set pixel format etc
HGLRC mHglrc = wglCreateContext(mHdc);
wglMakeCurrent(mHdc, mHglrc);

然后我把我的update \ draw循环挂钩到一个计时器。它工作正常。但是在Win10 1709更新后,渲染的图形从我的窗口消失了。首先我检查了上下文,看起来很好。在绘制后将上下文转储到图像文件会产生正确的图像,其大小和内容对应于我期望在视口中看到的内容。所以我只能假设窗口生命周期在1709更新后以某种方式发生了变化,但阅读更新说明并没有给我任何关于我的图形无效的线索。现在我甚至不确定我应该调查哪个方向,所以任何建议都是受欢迎的。

更新: 我做了一些实验。我已经尝试为窗口小部件获取Windows native proc的处理程序并稍微修改它,以便在WM_PAINT的情况下使用默认的winproc,在所有其他情况下使用旧的处理程序。

std::map<HWND, LONG_PTR> oldHandlerMap;

typedef LRESULT (*WndProcType)(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);

LRESULT CALLBACK WndProcTst (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    if(message == WM_PAINT)
    {
        return DefWindowProc(hwnd, message, wParam, lParam) ;
    }
    WndProcType oldHandlerPtr = (WndProcType)oldHandlerMap[hwnd];
    return CallWindowProc((WNDPROC)oldHandlerPtr, hwnd, message, wParam, lParam);
}

void RehookWinProc(const hdi::core::CustomWidget& parent) 
{
    CWnd *pWnd = parent.platformWidget();
    HWND tmpHwnd = pWnd->GetSafeHwnd();
    LONG_PTR oldHandler = GetClassLongPtr(tmpHwnd, GCLP_WNDPROC);
    oldHandlerMap[tmpHwnd] = oldHandler;
    SetWindowLongPtr(tmpHwnd, GWLP_WNDPROC, (LONG_PTR)WndProcTst);
}

现在我可以看到图形,但所有与小部件相关的回调,如鼠标按下,鼠标按下等都消失了。仍在努力解决这个问题。

0 个答案:

没有答案