VC程式介面多模式顯示

來源:互聯網
上載者:User

看過徐景周寫過的一篇“程式介面多模式顯示的實現”,在一個應用程式中使程式擁有多種顯示模式,但是這個介面是由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;
}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.