首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> VC 教學

Office 2000 風格停泊與智能菜單:MFC 實現完整指南

     編輯:VC 教學

專案背景與特性

本文提供一套完整的 Office 2000 風格菜單與工具欄解決方案,包含:

  • 智能菜單(常用項目優先顯示,完整菜單延遲展開)
  • 可停泊工具欄與菜單欄
  • 多文檔介面(MDI)子視圖標籤頁顯示
  • 自繪菜單項目(圖標、快捷鍵、狀態)

示例程序截圖:

運行截圖1
運行截圖2

譯者說明

原作者代碼依賴特定 RC 資源,通用性不足。譯者重構了核心代碼,移除資源依賴,並翻譯為中文文檔。附帶示例為一個抓圖工具的界面部分,展示了所有功能點。

接入現有工程步驟(針對 MDI 應用)

  1. 資源字符串表 新增兩項:
    • ID_SHOWFULL = 32792,標題「顯示完整菜單」
    • ID_INTMODE = 32794,標題「啟用/禁用智能菜單模式」
  2. 加入源文件:將 OffMenu 目錄下所有 .cpp、.h 加入專案。
  3. 修改 MainFrm.h:
    #include "MDIFrmEx.h"
    #include "ToolBarEx.h"
    
    class CMainFrame : public CMDIFrameEx  // 原為 CMDIFrameWnd
    {
        CToolBarEx m_wndToolBar;           // 原為 CToolBar
        // ...
    };
    
  4. 修改 MainFrm.cpp:
    IMPLEMENT_DYNAMIC(CMainFrame, CMDIFrameEx)
    BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameEx)
    // ...
    
    int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
    {
        if (CMDIFrameEx::OnCreate(lpCreateStruct) == -1)  // 原為 CMDIFrameWnd
            return -1;
        // ...
    }
    
  5. 修改 MyApp.h:
    #include "WinAppEx.h"
    class CTestMDIApp : public CWinAppEx  // 原為 CWinApp
    
  6. 修改 MyApp.cpp:
    #include "DocTplEx.h"
    BEGIN_MESSAGE_MAP(CTestMDIApp, CWinAppEx)
    
    BOOL CTestMDIApp::InitInstance()
    {
        // ... 原有代碼替換為:
        UINT nID = IDR_MAINFRAME;
        CMainFrame* pMainFrame = new CMainFrame;
        if (!pMainFrame->LoadFrame(nID)) return FALSE;
        m_pMainWnd = pMainFrame;
    
        CMultiDocTemplateEx* pDocTemplate = new CMultiDocTemplateEx(
            IDR_TESTMDTYPE,
            RUNTIME_CLASS(CTestMDIDoc),
            RUNTIME_CLASS(CChildFrame),
            RUNTIME_CLASS(CTestMDIView),
            &nID, 1);
        AddDocTemplate(pDocTemplate);
    
        CWinAppEx::InitInstance();  // 必須調用基類擴展初始化
        return TRUE;
    }
    
  7. 編譯運行:完成上述修改即可編譯運行,獲得 Office 2000 風格界面。

進階定製:掌控智能菜單行為

若需自定義菜單項使用統計與灰顯邏輯,可重載 CMenuBar 類的虛擬函數:

// 累加菜單項使用計數
virtual WORD IncMenuUsage(CMenuEx *pParent, UINT pos, WORD curusage);

// 決定菜單項是否灰顯,可修改使用計數
virtual BOOL EvaluateIfGrayed(CMenuEx *pParent, UINT pos, WORD &curusage, int iMed, int iRange);

若需在菜單項附加應用層數據,可使用 CMenuEx::GetExtraDataPtr(UINT) 獲取擴展數據指針。

單文檔界面(SDI)適配提示

本庫當前僅直接支持 MDI。若需用於 SDI,請參考修改 CMultiDocTemplateEx、CMDIFrameEx、CMDIFrameEx(應為 CFrameWndEx 類)以適配單文檔架構。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved