使用双缓冲窗口时,我遇到的问题是,当我将父窗口全屏显示时(仅使用the method in this answer覆盖整个屏幕,或使用带有CDS_FULLSCREEN的ChangeDisplaySettings都显示问题),任何子窗口它没有绘制/可见。但是,仅当窗口具有焦点/是活动窗口时才会发生这种情况。很长一段时间(2年多),我一直在反对这个问题,并且终于开始关心这个问题了。
具体设置:
- 这是一个OpenGL窗口,双缓冲
- 在绘制子项并且两者都接收WM_PAINT消息之前绘制父项
- 通过简单地使窗口的设备上下文绘制当前图形,在WM_PAINT BeginPaint / EndPaint对之外完成绘图。但是,旧版本的代码确实将所有绘图限制在Begin- / EndPaint内部,我遇到了同样的问题。
- 全屏时的父窗口样式,由WinSpy ++给出(与我在代码中请求的内容一致):WS_OVERLAPPEDWINDOW,WS_VISIBLE,WSCLIPSIBLINGS,WS_CLIPCHILDREN(虽然标题已删除by this method且确实不存在,但似乎winspy没有&#39 ;显示此),没有活动的WS_EX样式
- 子窗口:WS_CHILD,WS_VISIBLE,WSCLIPSIBLINGS,WS_CLIPCHILDREN,no WS_EX
- 代码处理WM_SETFOCUS:我的窗口proc的返回值的DefWindowProc(),SetActiveWindow(),UpdateWindow()
- 代码处理WM_KILLFOCUS:只有我的窗口proc的返回值的DefWindowProc()
- WM_ACTIVATE传递给DefWindowProc()。
- 至少在Windows 7和8上看到过这个问题,有各种版本的MSVC和Windows SDK。
- 我可以添加任何其他信息吗?
最后,这涉及到FreeGLUT的代码,如果您想要查看问题,请尝试在svn trunk中使用resizer demo。启动演示后,按c打开子窗口,然后按f使全屏显示。