Я пытаюсь сделать окно 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()
, все работает нормально, с очевидным условием, что стиль окна остается нормальным, поэтому в верхней части экрана есть стандартная строка заголовка окна, от которой я хочу избавиться. Если я сохраню вызовы ModifyStyle()
и закомментирую вызовы SetWindowPos()
, строка заголовка и все остальное исчезнет, но у окна будет черная область в верхней части экрана, которая является точной высотой строки заголовка - как будто это зарезервировано. Если я не закомментирую ни одну из пар вызовов, как показано в коде выше, экран сильно мерцает. Я полагаю, что между черной областью, присутствующей и не присутствующей, мерцает взад-вперед, но трудно сказать. Это мерцание также приводит к повреждению видеопамяти, поскольку я получаю постоянные артефакты в заголовках окон (в разных приложениях, не меньше), и однажды изображение входа в систему в меню Пуск было заменено одной из моих текстур OpenGL.
Код, который я использую, адаптирован из кода, который Стефан связал в ответе ниже, из The Old New Thing , который работает лучше, чем мой оригинальный код. Я предполагаю, что эта проблема не возникает из-за моего решения не вставлять код для сохранения расположения окна (согласно «Старому новому»), потому что это происходит до того, как я попытаюсь восстановить окно.