Office 2000風格的停泊、智能型菜單例子運行時圖像:
譯者注:
由於原文作者所提供例子代碼需使用附帶RC資源,經本人使用後覺得不夠通用,故將部分源碼修改並將文章翻譯。文中現在所附例子為我最近所作一抓圖程序的界面部分。不光Office 2000智能菜單噢!還包括多文檔視圖的TAB頁顯示,自繪制菜單等,詳情請參看附帶實例代碼。
在你的工程文件中使用Office 2000菜單的話(譯者:目前僅支持多文檔菜單修改,如果要改單文檔菜單界面的話,可對文件中的CMultiDocTemplateEx類、CMDIFrameEx類和CMDIFrameEx類進行修改,以適應單文檔界面。),請按下面步驟進行:
1、在資源裡的字符串表中新增二字符串:一、ID_SHOWFULL ,32792,顯示完全菜單。二、ID_INTMODE,32794,打開/禁止智能菜單模式。 2、將OffMenu文件夾中每一個.cpp和.h文件包含井你的工程文件中。 3、編輯工程文件中的 MainFrm.h (主框架頭文件) : 將原類的聲明從: class CMainFrame : public CMDIFrameWnd 改為: #include "MDIFrmEx.h" #include "ToolBarEx.h" class CMainFrame : public CMDIFrameEx 接著將類中的工具條類從 CToolBar 改為 CToolbarEx: CToolbar m_wndToolBar; 變量聲明為: CToolbarEx m_wndToolBar; 4、編輯工程文件中的 MainFrm.cpp (主框架文件): 改變其中消息映射從: IMPLEMENT_DYNAMIC(CMainFrame, CMDIFrameWnd) BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWnd) 變成: IMPLEMENT_DYNAMIC(CMainFrame, CMDIFrameEx) BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameEx) 接著將 CMainFrame::OnCreate 中的: if (CMDIFrameWnd::OnCreate(lpCreateStruct) == -1) 變為: if (CMDIFrameEx::OnCreate(lpCreateStruct) == -1) 5、編輯工程文件中 MyApp.h (應用類頭文件): 改變其中的類聲明從: class CTestMDIApp : public CWinApp 變為: #include "WinAppEx.h" class CTestMDIApp : public CWinAppEx 6、編輯工程文件中 MyApp.cpp (應用類文件): 將其中的消息映射從: BEGIN_MESSAGE_MAP(CTestMDIApp, CWinApp) 變為: #include "DocTplEx.h" BEGIN_MESSAGE_MAP(CTestMDIApp, CWinAppEx) 接著將 CMyApp::InitInstance() 中的下面代碼從: CMultiDocTemplate* pDocTemplate; pDocTemplate = new CMultiDocTemplate( IDR_TESTMDTYPE, RUNTIME_CLASS(CTestMDIDoc), // custom MDI child frame RUNTIME_CLASS(CChildFrame), RUNTIME_CLASS(CTestMDIView)); AddDocTemplate(pDocTemplate); // create main MDI Frame window CMainFrame* pMainFrame = new CMainFrame; if (!pMainFrame->LoadFrame(IDR_MAINFRAME)) return FALSE; m_pMainWnd = pMainFrame; 替換成: UINT nID; nID=IDR_MAINFRAME; // create main MDI Frame window CMainFrame* pMainFrame = new CMainFrame; if (!pMainFrame->LoadFrame(nID)) return FALSE; m_pMainWnd = pMainFrame; CMultiDocTemplateEx* pDocTemplate; pDocTemplate = new CMultiDocTemplateEx( IDR_TESTMDTYPE, RUNTIME_CLASS(CTestMDIDoc), // custom MDI child frame RUNTIME_CLASS(CChildFrame), RUNTIME_CLASS(CTestMDIView), &nID,1); AddDocTemplate(pDocTemplate); CWinAppEx::InitInstance(); 7、接下來就可以編釋並運行你的程序了。 如果你想自己掌控智能菜單的話,可直接重載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)來包含進這些數據。
本文示例代碼或素材下載