看過徐景周寫過的一篇“程序界面多模式顯示的實現”,在一個應用程序中使程序擁有多種顯示模式,但是這個界面是由SDI的MFC文檔視圖結構實現,但是使用的代碼在MDI的多文檔/視圖中不能實現,通過MSDN我找到了一些實現 MDI 的多模式實現方法,不敢獨享,與大家分享 。
利用SDI和MDI實現這種多模式的顯示的應用程序,第一步首先要實現的是可以動態加載和銷毀菜單。對於SDI的應用程序,實現是比較簡單的,對於MDI的應用程序,實現則是有些麻煩,不過,這些都是可以做到的!呵,呵!
首先,要將SDI和MDI的AppWizard產生的菜單銷毀,一開始就不要產生菜單!看過《深入淺出MFC》了嗎!在 PreCreateWindow 函數中將菜單資源銷毀 ,另外要注意的地方就是不可以刪除資源中ID為 IDR_MAINFRAME 的菜單資源,這個很重要,否則會產生很多 MFC 的斷言錯誤:
// 對於SDI的 PreCreateWindow
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
cs.style &= ~FWS_ADDTOTITLE;
cs.style &= ~( WS_SIZEBOX | WS_MINIMIZEBOX | WS_MAXIMIZEBOX );
if ( cs.hMenu != NULL )
{
DestroyMenu( cs.hMenu );
cs.hMenu = NULL;
}
if( ! CFrameWnd::PreCreateWindow( cs ) )
return FALSE;
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return TRUE;
} 多文檔的開始銷毀菜單的方法:
首先保留 ID 為 IDR_MAINFRAME 的菜單資源,原因同上面一樣。跟著刪除菜單MDI子窗口的菜單資源,其ID為 (IDR_xxxTYPE) 的類型. 這樣做的原因是避免資源洩漏, (哪兒洩漏,我還沒有去查,MSDN上是這樣的描述) ,在MDI的窗口中,打開子窗口的時候,會發生菜單切換,這些是MFC的代碼自動實現的,所以我們現在就是把這些切換菜單的代碼去除。
// CMainFrame 中重載 LoadFrame
//
// virtual BOOL LoadFrame( UINT nIDResource,
// DWord dwDefaultStyle = WS_OVERLAPPEDWINDOW | FWS_ADDTOTITLE,
// CWnd* pParentWnd = NULL, CCreateContext* pContext = NULL );
BOOL CMainFrame::LoadFrame(UINT nIDResource, DWord dwDefaultStyle,
CWnd* pParentWnd, CCreateContext* pContext)
{
return CFrameWnd::LoadFrame(nIDResource,dwDefaultStyle,
pParentWnd,pContext);
}
// CMainFrame 中重載 OnCreateClIEnt, 實現禁止菜單切換
// virtual BOOL CMainFrame::OnCreateClIEnt(LPCREATESTRUCT lpcs,
// CCreateContext* /*pContext*/);
BOOL CMainFrame::OnCreateClIEnt(LPCREATESTRUCT lpcs,
CCreateContext* /*pContext*/)
{
return CreateClIEnt(lpcs,NULL);
}
// 添加以下代碼:
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
cs.style &= ~FWS_ADDTOTITLE;
cs.style &= ~( WS_SIZEBOX | WS_MINIMIZEBOX | WS_MAXIMIZEBOX );
if ( cs.hMenu != NULL )
{
DestroyMenu( cs.hMenu );
cs.hMenu = NULL;
}
if( ! CFrameWnd::PreCreateWindow( cs ) )
return FALSE;
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return TRUE;
}
以上的代碼分別實現了SDI和MDI一開始的銷毀了菜單資源!這樣就可以為SDI和MDI的多模式顯示作好了准備!利用 SetMenu 這 API 就可以實現動態加載菜單,呵,是不是很簡單!剩下的就是參考徐景周的代碼就行了。本文發表於http://bianceng.cn(編程入門網)
多文檔顯示的正常模式
多文檔顯示的簡單模式(單文檔與此相同)
多文檔顯示的簡潔模式(單文檔與此相同)