当前位置: 首页 > 图文教程 > 开发语言 > VC++ > Office 2000 风格的停泊、智能型菜单

VC++
在类VC的界面实现中加入目录树
软件换肤技术在 BCB 中的实现
利用非模窗口生成MDI介面
报表输出轻松搞定
Windows 中不规则窗体的编程实现
解说Win32的窗口子类化
使用测试优先方法开发用户界面
一个简单的登录对话框的实现
一个简单的日记本程序
从资源中加载皮肤
一个在RichEdit中添加表情图象的类
ActiveSkin 4.3 软件换肤在VC中的实现
一种另类“关于(About)”对话框的动态显示方法
对话框打印预览及打印
关于如何换肤、子类化的解决方案
制作 MSN、QQ 的消息提示窗口
如何对 BCGControlBarPro 进行换肤
定制个性化的对话框窗口类
改变窗口中的光标形状
更新MFC中的视图,跟踪.NET Framework中的事件

VC++ 中的 Office 2000 风格的停泊、智能型菜单


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-30   浏览: 83 ::
收藏到网摘: n/a


Office 2000风格的停泊、智能型菜单
编译:徐景周/(原著:Piero Viano)

下载演示源码

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 CWinAppEx6、编辑工程文件中 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)
    第一个函数用来添加当前菜单条有用法。第二个函数决定当前菜单条是否灰