Office 2000 引入的智能選單(常用項優先顯示、完整選單延遲展開)與停泊工具列極具代表性。本文提供一套移植自開源專案的類別庫,支援 MDI 架構下的智能選單、Tab 頁文檔視圖、自繪選單等功能,並說明整合步驟。

ID_SHOWFULL (32792, "顯示完整選單")、ID_INTMODE (32794, "開啟/關閉智能模式")。OffMenu 資料夾下所有 .h/.cpp 加入專案。#include "MDIFrmEx.h"#include "ToolBarEx.h"class CMainFrame : public CMDIFrameExCToolBarEx m_wndToolBar;IMPLEMENT_DYNAMIC(CMainFrame, CMDIFrameEx)BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameEx)if (CMDIFrameEx::OnCreate(lpCreateStruct) == -1)#include "WinAppEx.h"class CTestMDIApp : public CWinAppEx#include "DocTplEx.h"BEGIN_MESSAGE_MAP(CTestMDIApp, CWinAppEx)InitInstance,改用 CMultiDocTemplateEx 並呼叫 CWinAppEx::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();若需自行控制選單項使用率與灰顯判斷,可覆寫 CMenuBar 兩個虛擬函數:
WORD IncMenuUsage(CMenuEx* pParent, UINT pos, WORD curUsage);
BOOL EvaluateIfGrayed(CMenuEx* pParent, UINT pos, WORD& curUsage, int iMed, int iRange);
亦可透過 CMenuEx::GetExtraDataPtr(UINT) 附加應用層資料。
原碼僅針對 MDI,若需 SDI 請自行修改 CMultiDocTemplateEx、CMDIFrameEx、CMDIChildWndEx 相關類別以適配 CFrameWnd 架構。
附帶範例為一抓圖程式介面部分,包含 Tab 頁視圖、自繪選單等完整功能,請參考原始碼深入研究。