2010-04-15 4 views
0

사용자가 최대화하려고 할 때마다 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 당) 것이 아니라고 가정합니다.

답변

1

전체 화면이되도록하려면 창을 최대화하지 마십시오. 대신 this approach을 사용하십시오.

+0

감사합니다. 코드가 원래의 노력보다 효과적이지만 작동하지 않습니다. 나는 원래의 글을 편집했다. 창을 최대화할지 여부에 대한 응답으로이 작업을 시도하는 것과 관련이 있는지는 알 수 없습니다. 생각? –

+0

자신이 아닌 다른 창에 아티팩트가 생기면 심각한 메모리 문제 (자신이 소유하지 않은 메모리에 쓰기)가 있거나 틀린 DC를 사용하고있는 것입니다 (항상 자신의 창 DC를 사용하고, 데스크톱 DC). – Stefan

+0

나는 내 자신의 DC만을 사용하고 있습니다. 나는 꽤 혼란스러워하는 포인터에 문제가 없다고 확신한다. 나는 부패가 내 코드보다 창문의 미친 깜박임과 관련이 있다고 믿는 경향이 더 큽니다. 두 호출을 모두 사용하면 윈도우가 폭 넓고 자주 크기가 조정됩니다 (크기를 변경한다고 가정 함). –

관련 문제