Jcily  
个人博客转到www.0oco0.com

大约在2009年01月时候,想美化一下工具条,MFC的CToolBar不支持更高位的位图,也懒得自己处理,所以使用BCG库的CBCGPToolBar.


照着库提供的例子,把程序框架换的支持了BCG,大体的代码替换步骤如下:
1.stdafx.h中加包含语句#include <BCGCBProInc.h>


2.CXXXApp多继承一个CBCGPWorkspace,形如:
 class CXXXApp : public CWinApp, public CBCGPWorkspace
 {...};
 然后在其实现中,构造时调用这个CBCGPWorkspace的构造函数,形如:
 CXXXApp::CXXXApp():CBCGPWorkspace (TRUE)
 {...}


 在InitInstance()成员函数中,加入如下代码:
BOOL CXXXApp::InitInstance()
{
...
 SetRegistryKey(_T("应用程序向导生成的本地应用程序"));
 LoadStdProfileSettings();
 SetRegistryBase (_T("Settings1"));
 InitContextMenuManager();
 InitKeyboardManager();
...
}


 还要重写ExitInstance()成员函数,这一点居然BCG的官网文章"GettingStart"没有提到,而其提供的例子程序却都有
int CXXXApp::ExitInstance()
{
 BCGCBProCleanUp();
 return CWinApp::ExitInstance();
}


3.替换CMainFrame基类为CBCGPMDIFrameWnd,替换CChildFrm基类为CBCGPMDIChildWnd,当然实现中的相关基类调用也要替换。


4.MainFrame中定义菜单条CBCGPMenuBar m_wndMenuBar;,把默认工具条和状态条的类类型分别替换成CBCGPToolBar和

CBCGPStatusBar,然后在OnCreate中创建菜单条,如下:
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
 if (!m_wndMenuBar.Create (this))
 {
  TRACE0("Failed to create menubar\n");
  return -1;      // fail to create
 }
 m_wndMenuBar.SetBarStyle(m_wndMenuBar.GetBarStyle() | CBRS_SIZE_DYNAMIC);
...}
至此就完成了原有程序支持BCG了。

 

事实上,我程序的工具条不只一个,并且其他的工具条的创建代码是直接COPY的MFC向导生成的那个,这导致我替换BCG库的工具条后,老是出现工具条的布局错乱,每次打开程序,工具条都会多出一个空白,就这样一个问题,让我浪费了三个晚上试了各种办法,最后是查出是非常弱智的原因。原来又是COPY代码带来的问题,m_wndToolBar.CreateEx(...)参数的最后一个是指定工具条的窗口ID,MFC框架生成的默认工具条的创建代码中此参数使用的默认参数,一般此参数确实可以缺省,但BCG库会在注册表中记录工具条的位置等信息,BCG是以ID在注册表中对工具进行标识的,因此多个相同ID的工具条,在程序再次启动时BCG自动读注册信息,并设置工具条位置时候就会出现错乱。因此,在资源ID定义中为此工具栏定义一个窗口ID并在创建工具条时指定。

posted on 2009-05-29 23:26  Jcily  阅读(3306)  评论(4编辑  收藏  举报