我正在尝试创建一个MFC窗口(A
CDialog
)每当用户试图将其最大化时,就全屏显示。该窗口正被用作OpenGL上下文。我在尝试做一切
CDialog::OnSize
回调。下面是我使用的代码:
void MyCDialogSubclass::OnSize(UINT action, int width, int height) {
CDialog::OnSize(action, width, height);
switch (action) {
case SIZE_MAXIMIZED:
if (GetStyle() & WS_OVERLAPPEDWINDOW) {
MONITORINFO screen;
screen.cbSize = sizeof(screen);
if (GetMonitorInfo(MonitorFromWindow(GetSafeHwnd(), MONITOR_DEFAULTTOPRIMARY), &screen)) {
ModifyStyle(WS_OVERLAPPEDWINDOW, 0, 0);
width = screen.rcMonitor.right - screen.rcMonitor.left;
height = screen.rcMonitor.bottom - screen.rcMonitor.top;
SetWindowPos(&wndTop, screen.rcMonitor.left, screen.rcMonitor.top, width, height, SWP_NOOWNERZORDER | SWP_FRAMECHANGED);
}
}
break;
case SIZE_MINIMIZED:
case SIZE_RESTORED:
if (!(GetStyle() & WS_OVERLAPPEDWINDOW)) {
ModifyStyle(0, WS_OVERLAPPEDWINDOW, 0);
SetWindowPos(NULL, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_NOOWNERZORDER | SWP_FRAMECHANGED);
}
break;
}
if (wglMakeCurrent(my_hdc, my_hglrc))
my_opengl_reshape_call(width, height);
wglMakeCurrent(NULL, NULL);
}
如果我评论
ModifyStyle()
调用时,一切都正常,明显的限制是窗口样式保持正常,所以屏幕顶部有一个标准的窗口标题栏,我想去掉它。如果我保持
修改字体()
电话和评论
SetWindowPos()
调用、标题栏和其他所有内容都会消失,但窗口在屏幕顶部有一个黑色区域,即标题栏的确切高度,就好像它被保留了一样。如上面代码所示,如果我不对两个调用中的任何一个进行注释,屏幕就会剧烈闪烁。我相信它在黑色区域存在和不存在之间来回闪烁,但很难分辨。这种闪烁也会损坏视频内存,因为我在窗口标题栏(至少在不同的应用程序中)中得到了持久的伪影,并且有一次,“开始”菜单中的登录图片被我的OpenGL纹理替换了。
我使用的代码是根据Stefan在下面的答案中链接的代码改编的,
The Old New Thing
这比我原来的代码更有效。我假设这个问题不是因为我决定不插入代码来保存窗口位置(根据旧的新东西),因为这在我尝试恢复窗口之前就发生了。