星期六, 1月 03, 2009

[MFC] 全螢幕功能-開始工作列未消失

原因是OnGetMinMaxInfo這個函式沒有被OverRide,
,最好是用ClassWizard,不要用手動。因為很可能會沒有效果。
要重寫此函式的原因如下:

程序中有一個地方要說明一下,那就是OnGetMinMaxInfo函數的作用。你可以試一下,如果把這個函數去掉,則當你按下工具欄中的全屏顯示按鈕時,框架視圖確實變大了,但沒有想像的那樣實現全屏顯示,底邊留下一個狀態欄——一個有些發育不良的全屏顯示窗口。為什麼會這樣呢?經過調試後,發現問題出在WM_GETMINMAXINFO消息的處理上。在Windows中,無論什麼時候以何種方式改變窗口的尺寸或大小,是拖拽窗口邊緣也好,或是在代碼中調用改變窗口尺寸的函數也好,總之不管你用什麼方法,Windows都會首先發送WM_GETMINMAXINFO消息。這個消息的意思是說:「嘿,如果你要強迫我的尺寸變大或變小,就附上詳細的MINMAXINFO結構信息,否則我用默認值處理。」大多數應用程序都不用顯式處理這個 WM_GETMINMAXINFO消息(也就是說讓DefWindowProc窗口過程進行缺省處理),而Windows在進行缺省處理時是不會讓一個窗口視圖比屏幕還大的,所以我們會碰上前面講的那個問題。解決的方法是:不要讓Windows對WM_GETMINMAXINFO消息進行缺省處理,而是由我們自己處理,方法如下:

void CMainFrame::OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI) 
{
 if (m_bFullScreen)
 {
  lpMMI->ptMaxSize.y = m_FullScreenWindowRect.Height();
  lpMMI->ptMaxTrackSize.y = lpMMI->ptMaxSize.y;
  lpMMI->ptMaxSize.x = m_FullScreenWindowRect.Width();
  lpMMI->ptMaxTrackSize.x = lpMMI->ptMaxSize.x;
 }
 //CFrameWnd::OnGetMinMaxInfo(lpMMI);
}

沒有留言: