在VC中用CMenuXP使应用程序拥有Office XP风格的界面

随着Windows XP和Office XP的推出,兼具华美和清爽气质的Office XP界面风格也逐渐取代了Windows经典界面风格而成为了当前应用程序的流行“时装”,因而如何使自己的应用程序拥有Office XP风格的界面也成为了广大程序员感兴趣的问题。为此法国程序员Jean-Michel LE FOL针对于Visual C++编写了CMenuXP类,使用CMenuXP类就可以轻松使自己的应用程序拥有Office XP风格的界面。下面我就以详细介绍一下使用CMenuXP的步骤。

首先新建一个名叫“SDIXP”的单文档的MFC应用程序。在我们能使用CMenuXP之前,必须进行一下几步操作:

1.                将CMenuXP的源文件和头文件所在的文件夹(一般放在名叫“Tools”)放到SDIXP源文件的目录下。

 

2.                将Visual C++切换到“文件视图(FileView)”,加入CMenuXP的源文件和头文件。具体可以这样进行:在FileView的树状目录下,展开SDI files,在Source Files目录上点击右键,创建新目录(“New Folder…”),不妨取名叫“Tools”,再在Tools目录上点击右键,选择加入文件(“Add Files to Folder…”),将Tools文件夹下的所有源文件(*.cpp)全部加进来。同理,在文件视图的Header Files目录下新建一个叫做“Tool Headers”,再将Tools文件夹下的所有头文件(*.h)全部加到Tool Headers目录里。

 

 

3.                (1)在控制菜单的类的头文件(对于SDI程序通常是MainFrm.h)里加入所需要的CMenuXP类的头文件名:

              #include "Tools/MenuXP.h"
              #include "Tools/ToolBarXP.h"
              #include "Tools/StatusBarXP.h"
              #include "Tools/ComboBoxXP.h"
再在MainFrm.h里加入下面的宏:

              DECLARE_MENUXP()  
上述语句可以加在CMainFrame类声明里的宏定义“DECLARE_MESSAGE_MAP()”的后面。

 

(2)在控制菜单的类的源文件(MainFrm.cpp)里加入:

              IMPLEMENT_MENUXP(类名, 基类名);
                     对于SDI工程就是

              IMPLEMENT_MENUXP(CMainFrame, CFrameWnd);
   上述语句加在CMainFrame开头的“IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd)”后面。   

          

                     (3)接着继续在消息映射里如下加入:

              BEGIN_MESSAGE_MAP(className, baseClass)
              // ...
               ON_MENUXP_MESSAGES()   //加入这一行
              END_MESSAGE_MAP()
 

   (4)在继承于CWinApp的类(这里就是CSDIXPApp)中的InitInstance()函数里加入:

              CMenuXP::InitializeHook();
可以加在“AfxEnableControlContainer();”语句后面。

然后再为CSDIXPApp类重载ExitInstance()函数,可以在“类视图(ClassView)”里点右键加入。再在ExitInstance()函数里加入:

              CMenuXP::UninitializeHook();
 

     

 

以上步骤做完之后可以按F7编译一下,如果一切没有问题我们就可以开始使用CMenuXP来美化我们的菜单和工具栏了。

首先,我们来将菜单和菜单项XP化。这很简单,只要在CMainFrame:: OnCreate()函数里加入:

     CMenuXP::UpdateMenuBar(this);
     CMenuXP::SetXPLookNFeel(this);
就OK了。现在你编译运行一下,看看你的程序菜单是不是改头换面了?

如果你想为自己菜单项定制图标,我们可以用CMenuXP::SetMenuItemImage (UNIT nID, HIMAGELIST hImgList, int nIndex)函数来实现。为此,我们新建一个菜单“水果”和菜单项“苹果”(ID设置为ID_MENUITEM_APPLE),打开ClassWizard为ID_MENUITEM_APPLE添加消息处理函数OnMenuitemApple()。然后再导入一个位图资源“APPLE.bmp”,其ID设置为IDB_APPLE。

接着我们为CMainFrame添加CImageList类型的成员变量m_imgList,再在CMainFrame:: OnCreate()函数的“CMenuXP::SetXPLookNFeel (this);”后面加入:

     m_imgList.Create(IDB_APPLE, 0, 0, RGB(192,192,192));
     CMenuXP::SetMenuItemImage(ID_MENUITEM_APPLE, m_imgList, 0);
其中m_imgList.Create()函数中的第2,3个参数是位图文件的图像拷贝的左上角坐标,最后一个参数是图像的背景色。建议使用16×16的位图。SetMenuItemImage()函数的最后一个参数指的是m_imgList的中元素的索引,这里因为m_imgList.只包含一个位图,故取零。编译后运行,看看“水果|苹果”菜单项前面是不是多了一个苹果的图标?

下面我们在将使工具栏和状态栏XP化,这个更加easy了。只要将CMainFrame类声明中的

     CStatusBar  m_wndStatusBar;
     CToolBar    m_wndToolBar;
变成

     CStatusBarXP  m_wndStatusBar;
     CToolBarXP    m_wndToolBar;
就搞定了!不信,你编译运行一下看看,^_*

CMenuXP还可以将按钮和下拉列表框变成Office XP风格的。为此我们新建一个对话框IDD_APPLE。OK和Cancel按钮保持不动,我们只增添一个下拉列表框控件IDC_COMBO1。然后按Ctrl+W打开ClassWizard为该对话框新建一个CAppleDlg类。再在ClassWizard中的Member Variable里为IDC_COMBO1添加Control类型的变量m_cmbx1。接着为CAppleDlg重载OnInitDialog()用以初始化控件:

     BOOL CAppleDlg::OnInitDialog()
{
     CDialog::OnInitDialog();
     m_cmbx1.AddString("红苹果");
     m_cmbx1.AddString("青苹果");
     return TRUE;
}
然后在“苹果”菜单项的消息处理函数中使苹果对话框弹出:

  &nb
sp;  void CMainFrame::OnMenuitemApple()

{
     // TODO: Add your command handler code here
     CAppleDlg dialog;
     dialog.DoModal();
}
如果这时编译运行,就会看到打开“水果|苹果”菜单项后弹出一个对话框,但上面的控件还不是Office XP风格的,下面我们就着手使其XP化,其实这同样也是很easy的!

 

先在AppleDlg.h文件中包含"Tools/ComboBoxXP.h"和"Tools/ButtonXP.h",再找到定义m_cmbx1的位置,将

     CComboBox m_cmbx1;
变成

     CComboBoxXP m_cmbx1;
这样下拉列表框就有XP风格了,不信你编译运行试试。关于OK和Cancel按钮就稍微特殊一点,因为它们是直接用IDOK和IDCANCEL标识的默认按钮,但为了使它们XP化,我们还是得为这两个按钮添加控制变量。因此,在CAppleDlg类的声明中添加:

     CButtonXP m_btnOK;
     CButtonXP m_btnCancel;
再在CAppleDlg::DoDataExchange()函数中添加数据交换:

     DDX_Control(pDX, IDOK, m_btnOK);
     DDX_Control(pDX, IDCANCEL, m_btnCancel);
这样,OK和Cancel按钮也都XP化了。大家编译运行一下,看看效果怎么样。

 

总之,使用Jean-Michel LE FOL的CMenuXP给用Visual C++开发的应用程序换上Office XP风格的界面还是很不错的,操作起来也比较简便。唯一不足的就是其他许多控件,如文本框等还是没有Office XP风格,这就期待着原作者以及我们大家继续完善CMenuXP类。


VC6界面类编程小实例\A Drag and Drop List Control.doc ...................\MFC窗口位置管理详细分析及实例.doc ...................\Toolbar制作菜单条过程详解.doc ...................\VC++6.0定制窗口的方法.doc ...................\VC++中MFC窗口对象的清除.doc ...................\VC++任务栏提示区图标的实现.doc ...................\VC++动态加入和删除菜单的方法.doc ...................\VC++环境下浮动工具条的编程.doc ...................\VC++环境下菜单和工具栏的动态修改技术.doc ...................\VC中如何捕获和释放鼠标.doc ...................\VC控件 TreeCtrl 与 ListCtrl 演示.doc ...................\VC界面编程总结.doc ...................\VC编程中如何在界面上实现3D文字.doc ...................\VC编程实现IE风格界面.doc ...................\VC编程实现IE风格界面之叙述.doc ...................\VC设计分割视图通用创建框架.doc ...................\VC通用控件编程之CImageList控件.doc ...................\Visual C++中位图按钮的新颖设计.doc ...................\Visual C++中实现对图像数据的读取显示.doc ...................\Visual C++中的图形特技.doc ...................\Visual C++模态对话框消息处理机制的分析.doc ...................\Visual C++窗体设计技巧集.doc ...................\Visual C++窗口标题改变的几种方法.doc ...................\Windows 界面设计:拉帘按钮设计.doc ...................\XListBox-自画条目背景和文字颜色的listbox控件.doc ...................\XP风格控件界面库.doc ...................\一个功能强大的MFC界面处理扩展库:CJ60Lib.doc ...................\一个屏幕捕捉的例子.doc ...................\一段使窗口透明的代码(仅适用于2000).doc ...................\一种漂亮的自绘菜单.doc ...................\为CListBox加上智能水平滚动条.doc ...................\为列表控件添加水平滚动条.doc ...................\为对话框程序添加工具条和状态栏.doc ...................\从资源中加载皮肤, 使用免费界面库 AppFace For VC 0.2 美化您的软件.doc ...................\位图文件读写综述.doc ...................\使用CRectTracker类进行对象动态定位.doc ...................\使用CTabCtrl控件实现属性页功能.doc ...................\使用测试优先方法开发用户界面.doc ...................\关于内存DC绘图防止屏幕闪烁说明.doc ...................\创建有个性的对话框之MFC篇.doc ...................\利用VC编程在界面上实现3D文字.doc ...................\利用钩子实现菜单阴影效果.doc ...................\制作 MSN、QQ 的消息提示窗口.doc ...................\单文档与多视的实现方法.doc ...................\图像平滑滚动效果的VC实现.doc ...................\在(CListView)列表视图中添加右键菜单.doc ...................\在ATL Browser Helper对象中使用WTL TreeView.doc ...................\在SDI MDI程序的工具条上加入漂亮的标题头.doc ...................\在VC++6.0开发中实现全屏显示.doc ...................\在VC下显示JPEG、GIF格式图像的一种简便方法.doc ...................\在VC中用CMenuXP使应用程序拥有Office XP风格界面.doc ...................\在VC中透明浮动按键的实现.doc ...................\在Windows95,98中实现苹果窗口界面.doc ...................\在单文档中添加系统菜单项.doc ...................\在单文档程序中动态切换多个窗体.doc ...................\在对话框上加超链接.doc ...................\在类VC界面实现中加入目录树.doc ...................\在视图中同步显示鼠标的位置.doc ...................\如何创建一个不规则形状的窗口.doc ...................\如何创建无模式对话框.doc ...................\如何创建有模式对话框.doc ...................\如何制作弹出式菜单.doc ...................\如何在VC中改变控件的背景色.doc ...................\如何在状态条中加入图像.doc ...................\如何模拟《WORD》的窗口形式.doc ...................\如何编写类似于Word97的工具栏.doc ...................\如何隐藏显示在任务栏中的对话框程序.doc ...................\实现带阴影弹出的窗口.doc ...................\实现真正的Windows屏幕保护程序.doc ...................\对CXPStyleButtonST的改造.doc ...................\对话框隐藏的几种方法.doc ...................\带有菜单的EDIT控件实现.doc ...................\平面、带图片的按钮.doc ...................\扩展COleDropTarget类来支持任意窗口拖放.doc ...................\拖拉机客户端任务书.doc ...................\数据库开发之窗体编程.doc ...................\文档与视图的建立和关联.doc ...................\无闪烁刷屏技术的实现.doc ...................\显示作为窗口或对话框背景的位图.doc ...................\最简单的界面增强库EasySkin.doc ...................\树视控件在多文档中的使用.doc ...................\根据文本串的长度改变窗口的大小.doc ...................\用MFC对话框做无闪烁图片重绘.doc ...................\用SDK实现分隔条.doc ...................\用VC++制作有滚动字幕效果的软件封面.doc ...................\用VC设计托盘图标程序.doc ...................\用Visual C++实现带阴影弹出窗口的技术.doc ...................\用户界面设计的技巧与技术.doc ...................\百叶窗式面板组.doc ...................\窗口类的诞生.doc ...................\类似Vc和Outlook的界面.doc ...................\编程打开特殊的系统窗口.doc ...................\自绘菜单的实现.doc ...................\自绘边框窗口.doc ...................\让对话框显示背景图.doc ...................\谈VC++中的Progress控件的使用.doc
//所有的菜单(包括顶层框架菜单与弹出式菜单)项均会触发OnInitMenu函数,分以下几种情况: // 一 顶层框架菜单:就是文件,编辑等这种菜单,框架菜单在主窗口显示后并不会自动调用OnInitMenu函数, // 必须手动设置框架菜单的自绘标志,否则在主窗口显示后框架菜单仍然为非自绘状态 // 二 系统菜单:这种情况比较特殊,需要注意,分以下几种情况: // (1) 主窗口显示时在标题栏上点右键弹出的菜单,此时进入到OnInitMenu函数中后,通过遍历发现 // 这些菜单项仍然是框架菜单项,也就是文件,编辑等,而不是最小化,最大化等系统菜单。 // (2) 主窗口未最小化时(不管主窗口是前台窗口还是非前台窗口),在任务栏的程序按钮上点右键弹出的菜单, // 此时进入到OnInitMenu函数中后,通过遍历发现这些菜单项仍然是框架菜单项,也就是文件,编辑等,而不是最小化,最大化等系统菜单。 // (3) 主窗口最化小时,在任务栏的程序按钮上点右键弹出的菜单,此时进入到OnInitMenu函数中后,发现该菜单才是系统菜单,最小化,最大化等。 // 三 弹出式菜单:所有弹出式菜单都会触发OnInitMenu函数处理 //因为框架菜单已经在OnInitMenu函数之前进行了强制设置自绘标志,所以这里不再考虑是否将框架菜单进行过滤掉,当进入到ModifyMenuStyle函数中后,会发现该 //菜单已经设置了自绘标志,就不再处理了。 //这里只判断是否系统菜单,并对其进行过滤,不自绘系统菜单。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值