2010-04-15 21 views
0

我試圖讓MFC窗口(CDialog)每當用戶試圖使其最大化時全屏顯示。該窗口正在用作OpenGL上下文。我正在嘗試執行CDialog::OnSize回調中的所有內容。下面是我使用的代碼:閃爍/死區問題最大化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()電話,一切工作正常,與窗口樣式保持正常的明顯的條件,所以有橫跨頂部的標準窗口標題欄我想擺脫的屏幕。如果我保留ModifyStyle()調用並註釋掉SetWindowPos()調用,標題欄和其他所有內容都會消失,但窗口沿着屏幕頂部有一個黑色區域,即標題欄的確切高度 - 就好像它正在保留一樣。如果我不註釋掉任何一對電話,如上面的代碼所示,屏幕會劇烈閃爍。我相信它在黑色區域存在與不存在之間來回閃爍,但很難說清楚。這種閃爍也會損壞視頻內存,因爲我在窗口標題欄中(在不同的應用程序中,不會少於)獲得持久的工件,並且一次,開始菜單中的登錄圖片被替換爲我的OpenGL紋理之一。

我正在使用的代碼是從Stefan在下面的答案中鏈接的代碼改編而來的,這些代碼從The Old New Thing開始,它比我的原始代碼工作得更好。我假設這個問題並不是由於我決定不插入代碼來保存窗口放置(按照舊的新事物),因爲這發生在我嘗試恢復窗口之前。

回答

1

如果您希望窗口全屏,請不要最大化窗口。 改爲使用this approach

+0

謝謝,該代碼工作比我原來的努力更好,但它沒有完全工作。我編輯了我原來的帖子。我無法判斷它是否與嘗試這樣做以響應窗口最大化有關。思考? – 2010-04-16 22:04:48

+0

如果您在其他窗口上獲取的工件超出了您自己的工作範圍,則可能是存在嚴重的內存問題(寫入您不屬於自己的內存),或者更可能使用了錯誤的DC(始終使用您自己的窗口DC,桌面dc)。 – Stefan 2010-04-17 08:04:42

+0

我絕對只使用我自己的DC。我很確定我沒有指針變得困惑的問題。我更傾向於認爲腐敗與瘋狂的窗口閃爍有關,而不是直接與我的代碼有關。我不知道爲什麼這兩個調用都會導致窗口劇烈而頻繁地調整自身大小(我假設它正在調整大小)。 – 2010-04-19 16:03:41