Office 2000風(fēng)格的停泊、自動(dòng)選擇型菜單
發(fā)表時(shí)間:2023-08-04 來源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]譯者:徐景周(原著:Piero Viano)下載演示源碼(http://www.vckbase.com/vckbase/vckbase12/vc/ctrls/menu_07/1207099.htm)...
譯者:徐景周(原著:Piero Viano)
下載演示源碼(http://www.vckbase.com/vckbase/vckbase12/vc/ctrls/menu_07/1207099.htm)
(譯者注:由于原文作者所提供例子代碼需使用附帶RC資源,經(jīng)本人使用后覺得不夠通用,故將部分源碼修改并將文章翻譯。文中現(xiàn)在所附例子為我最近所作一抓圖程序的界面部分。不光Office 2000智能菜單噢!還包括多文檔視圖的TAB頁(yè)顯示,自繪制菜單等,詳情請(qǐng)參看附帶實(shí)例代碼。我的EMAIL是:jingzhou_xu@163.net ~O~)
在你的工程文件中使用Office 2000菜單的話(譯者:目前僅支持多文檔菜單修改,如果要改單文檔菜單界面的話,可對(duì)文件中的CMultiDocTemplateEx類、CMDIFrameEx類和CMDIFrameEx類進(jìn)行修改,以適應(yīng)單文檔界面。),請(qǐng)按下面步驟進(jìn)行:
在資源里的字符串表中新增二字符串:一、ID_SHOWFULL ,32792,顯示完全菜單。二、ID_INTMODE,32794,打開/禁止智能菜單模式。
將OffMenu文件夾中每一個(gè).cpp和.h文件包含井你的工程文件中。
編輯工程文件中的 MainFrm.h (主框架頭文件) :
將原類的聲明從:
class CMainFrame : public CMDIFrameWnd
改為:
#include "MDIFrmEx.h"
#include "ToolBarEx.h"
class CMainFrame : public CMDIFrameEx
接著將類中的工具條類從 CToolBar 改為 CToolbarEx:
CToolbar m_wndToolBar;
變成:
CToolbarEx m_wndToolBar;
編輯工程文件中的 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)
變?yōu)?
if (CMDIFrameEx::OnCreate(lpCreateStruct) == -1)
編輯工程文件中 MyApp.h (應(yīng)用類頭文件):
改變其中的類聲明從:
class CTestMDIApp : public CWinApp
變?yōu)椋?br>
#include "WinAppEx.h"
class CTestMDIApp : public CWinAppEx
編輯工程文件中 MyApp.cpp (應(yīng)用類文件):
將其中的消息映射從:
BEGIN_MESSAGE_MAP(CTestMDIApp, CWinApp)
變?yōu)椋?br>
#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();
接下來就可以編釋并運(yùn)行你的程序了。
如果你想自己掌控智能菜單的話,可直接重載CmenuBar類中的下面涵數(shù)既可:
WORD CMenuBar::IncMenuUsage(CMenuEx *pParent,
UINT pos,
WORD curusage)
BOOL CMenuBar::EvaluateIfGrayed(CMenuEx *pParent,
UINT pos,
WORD &curusage,
int iMed,
int iRange)
第一個(gè)涵數(shù)用來添加當(dāng)前菜單條有用法。第二個(gè)涵數(shù)決定當(dāng)前菜單條是否灰色顯示,它也可用來修改當(dāng)前菜單條的用法。如果你想在菜單中存儲(chǔ)應(yīng)用程序中定義的數(shù)據(jù)的話,可用CMenuEx::GetExtraDataPtr(UINT)來包含進(jìn)這些數(shù)據(jù)。