posts - 311, comments - 0, trackbacks - 0, articles - 0
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理
 上次给大家介绍了Visual C++ 2008 的Feature Pack的界面库新特性。今天给大家介绍一下,怎样用Feature Pack把您现有的Visual C++ 程序界面修改得漂亮些。

      所需的修改环境:
      Visual C++ 2008  (Team Suite版Express版都可以,但必须是英文版,否则Feature Pack不支持)
      正确的安装了Visual C++ 2008 Feature Pack beta
      您要修改的Visual C++ 的程序源代码工程

      具备了以上三点就可以开始进行修改操作了。但是有一点提请注意,那就是您程序中是否用到了MS C++ 9.0 编译器不再支持的语法特性?如果有,那很不幸,我个人不推荐您升级您的程序界面,毕竟程序运行的稳定性才是最重要的。为了漂亮的界面修改已经测试过并稳定运行的代码,可不是一个明智的选择。

      下面我就用一个Visual C++的入门Demo Scribble 来修改。这个Scribble您可以在MSDN网站上下载到,但请您注意,我给出的这个下载工程是VS2005 for x64的。下载后,您需要进行以下改动:
       1) 将Scribble工程属性中,C/C++编译器的Treat Warnings as error 关闭,否则您的工程将会因为一个Warning没有解决,导致整个程序编译失败。如图:
        

      2) 编译时,将Target 改为Win32;

      罗嗦了这么多,开始修改吧!

      第一步: 请确定CScribbleApp::InitialInstance() 方法中已经调用了AfxOleInit();
      第二步: 在stdafx.h文件中加入 #include"afxcontrolbars.h" ,这头文件包含了Feature Pack新增的界面类声明;
      第三步:修改CScribbleApp类继承的父类,由CWinApp改为CWinAppEx;这个CWinAppEx类比CWinApp添加了很多的功能,说个简单的,CWinAppEx提供了一个SetRegistryBase方法,这个方法可以用来设定当前App所使用的注册表的根。
      第四步:修改主框架类,将CMainFrame的父类由CMDIFrameWnd改为CMDIFrameWndEx;这个修改设计到类声明、IMPLEMENT_DYNAMIC宏、MESSAGE_MAP宏、OnCreate函数等调用到静态方法的地方、以及其它等等。最好是直接用Replace all文本替换掉;
      第五步:将CMDIChildWnd类替换为CMDIChildWndEx,主框架换了,子窗体也要换;
      第六步:替换CTooBar为CMFCTooBar,替换CStatusBar为CMFCStatusBar;就是修改一下m_wndStatusBar和m_wndToolBar两个变量的声明处;
      第七步:替换CMainFrame::OnCreate()函数中m_wndToolBar 和m_wndStatusBar停靠的相关代码;将Set/Get BarStyle改为Set/Get PaneStyle 也是文本替换一下,很简单。将DockControlBar(&m_wndStatusBar);改为DockPane(&m_wndStatusBar);
      完成以上七步,基本改造就算完成了。但是如果您现在编译您的程序,您会发现Scribble界面基本上没有任何改变。下面的才是更重要的,我们要添加RibbonBar了:

      第一步:在CMainFrame类中声明一个CMFCRibbonBar类型的变量m_wndRibbonBar。这个变量就代表Office2007界面里面那个替代了菜单的东东;
      第二步:在CMainFrame类中声明一个CMFCRibbonApplicationButton的变量m_MainButton。这个变量代表了Office2007界面左上角那个Home按钮;
      第三步:在CMainFrame::OnCreate函数中添加代码。首先是创建RibbonBar对象,老规矩:
      if(!m_wndRibbonBar.Create(this))
      {
          return -1;
      }
      第四步:设定m_MainButton对象:
      m_MainButton.SetImage(……);   //设定图标
      m_MainButton.SetToolTipText(……); //设定提示文本
      m_MainButton.SetText(……);   //设定按钮文本
      第五步:在CMainFrame::OnCreate函数中添加代码,通过RibbonBar对象添加一个Category:
      CMFCRibbonMainPanel *pMainPanel = m_wndRibbonBar.AddMainCategory(_T("File"));
      这实际上就类似于创建了一个名为File的主菜单项;
      第六步:给这个Panel添加按钮(其实就是子菜单项):
      pMainPanel->Add(new CMFCRibbonButton(ID_FILE_OPEN,_T("打开")));
      ……
      第七步:
      在CMainFrame::OnCreate()函数的最后部分,添加代码设定当前界面的风格:
      CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerOffice2007));
      CMFCVisualManagerOffice2007::SetStyle(CMFCVisualManagerOffice2007::Office2007Luna_Blue);
      代码的第一行用来设定可视化管理器为Office2007类型,可供选择的还有OfficXP、Office2003、VS2005 三种,换句话说,我们可以将我们的程序界面修改为Office2007、Office2003、OfficeXP、VS2005四种风格;
      代码的第二行用来设定Office2007界面的色调;
      完成以上步骤后,就可以编译运行啦,看看界面是不是改变了呢?
      修改前:
      

      修改后:
      

      我没有找到比较好看的图标,也没有把菜单都实现出来,仅仅是作为一个演示。相信在美工的帮助下,我们的MFC程序界面一定会漂亮起来的。

      说到最后,我要提醒大家一下,发布程序前,已经要静态链接MFC的库。在现在VC8.0 的RTM尚不普及的情况下,就别指望您的用户安装部署了支持Feature Packe的FTM库了。粗粗看了一下,一个用向导生成的支持Feature Pack的Application(是的,安装了Feature Pack在用AppWizard生新程序的时候,就可以指定Feature Pack支持了),什么代码都不加,静态编译一般在6M-8M之间(还算可以接受的说)。