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

MFC 實作 Office 2000 風格智慧型選單與停泊工具列完整整合指南

     編輯:VC++

效果預覽

支援 Office 2000 風格:

  • 智慧型選單:常用項目優先顯示,稀用項目摺疊隱藏,點擊雙箭頭展開。
  • 工具列停泊/浮動,支援拖曳排列。
  • MDI 子視窗索引標籤顯示。
  • 自繪選單項目(圖示、捷徑鍵、彈出指示)。

整合步驟(六步驟完成)

1. 資源字串表新增兩項

ID值說明
ID_SHOWFULL32792顯示完整選單
ID_INTMODE32794啟用/停用智慧模式

2. 加入 OffMenu 資料夾所有 .cpp/.h 至專案

3. 修改 MainFrm.h

#include "MDIFrmEx.h"
#include "ToolBarEx.h"

class CMainFrame : public CMDIFrameEx
{
    // ...
    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) return -1;
    // ...
}

5. 修改 MyApp.h

#include "WinAppEx.h"
class CTestMDIApp : public CWinAppEx { ... };

6. 修改 MyApp.cpp — 關鍵:使用 CMultiDocTemplateEx

BEGIN_MESSAGE_MAP(CTestMDIApp, CWinAppEx)
#include "DocTplEx.h"

BOOL CTestMDIApp::InitInstance()
{
    // ...
    CMainFrame* pMainFrame = new CMainFrame;
    if (!pMainFrame->LoadFrame(IDR_MAINFRAME)) return FALSE;
    m_pMainWnd = pMainFrame;

    UINT nID = IDR_MAINFRAME;
    CMultiDocTemplateEx* pDocTemplate = new CMultiDocTemplateEx(
        IDR_TESTMDTYPE,
        RUNTIME_CLASS(CTestMDIDoc),
        RUNTIME_CLASS(CChildFrame),
        RUNTIME_CLASS(CTestMDIView),
        &nID, 1);
    AddDocTemplate(pDocTemplate);

    CWinAppEx::InitInstance(); // 必須呼叫基類擴充初始化
    return TRUE;
}

進階客製化

覆寫 CMenuBar 兩個虛擬函式可完全控制智慧選單演算法:

// 累計使用計數
WORD CMenuBar::IncMenuUsage(CMenuEx* pParent, UINT pos, WORD curUsage);

// 決定是否灰顯/隱藏
BOOL CMenuBar::EvaluateIfGrayed(CMenuEx* pParent, UINT pos,
    WORD& curUsage, int iMed, int iRange);

若需在選單項目附加應用程式自訂資料,可使用 CMenuEx::GetExtraDataPtr(UINT)。

注意事項

  • 僅支援 MDI 架構;SDI 需自行修改 CMultiDocTemplateEx、CMDIFrameEx 等類別。
  • 專案需啟用 MFC 共用 DLL 或靜態連結一致。
  • 範例附帶完整 RC 資源,建議先編譯執行範例再移植至既有專案。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved