程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> 關於VC++ >> VC程序界面多模式顯示

VC程序界面多模式顯示

編輯:關於VC++

看過徐景周寫過的一篇“程序界面多模式顯示的實現”,在一個應用程序中使程序擁有多種顯示模式,但是這個界面是由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 就可以實現動態加載菜單,呵,是不是很簡單!剩下的就是參考徐景周的代碼就行了。

多文檔顯示的正常模式

多文檔顯示的簡單模式(單文檔與此相同)

多文檔顯示的簡潔模式(單文檔與此相同)

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved