사용자가 최대화하려고 할 때마다 MFC 창 (CDialog
)을 전체 화면으로 만들려고합니다. 이 창은 OpenGL 컨텍스트로 사용됩니다. CDialog::OnSize
콜백 내부의 모든 작업을 시도하고 있습니다. 여기에 내가 사용하고 코드는 다음과 같습니다 나는 ModifyStyle()
호출을 주석하는 경우, 모든 창 스타일이 정상 유지 명백한 단서와 함께 잘 작동, 그래서의 상단에 표준 윈도우 제목 표시 줄이있다플릭커/데드 레인지가 MFC 창 최대화 문제를 야기 함
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 텍스처 중 하나로 바뀌 었습니다.
내가 사용하고있는 코드는 내 원래 코드보다 더 잘 작동하는 The Old New Thing에서 아래의 답변에서 Stefan이 연결 한 코드에서 변형되었습니다. 이 문제는 윈도우를 복원하려고 시도하기 전에 발생하기 때문에 윈도우 배치를 저장하는 코드를 삽입하지 않기로 결정한 (The Old New Thing 당) 것이 아니라고 가정합니다.
감사합니다. 코드가 원래의 노력보다 효과적이지만 작동하지 않습니다. 나는 원래의 글을 편집했다. 창을 최대화할지 여부에 대한 응답으로이 작업을 시도하는 것과 관련이 있는지는 알 수 없습니다. 생각? –
자신이 아닌 다른 창에 아티팩트가 생기면 심각한 메모리 문제 (자신이 소유하지 않은 메모리에 쓰기)가 있거나 틀린 DC를 사용하고있는 것입니다 (항상 자신의 창 DC를 사용하고, 데스크톱 DC). – Stefan
나는 내 자신의 DC만을 사용하고 있습니다. 나는 꽤 혼란스러워하는 포인터에 문제가 없다고 확신한다. 나는 부패가 내 코드보다 창문의 미친 깜박임과 관련이 있다고 믿는 경향이 더 큽니다. 두 호출을 모두 사용하면 윈도우가 폭 넓고 자주 크기가 조정됩니다 (크기를 변경한다고 가정 함). –