我正在使用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);
}
现在我可以看到图形,但所有与小部件相关的回调,如鼠标按下,鼠标按下等都消失了。仍在努力解决这个问题。