From: http://blog.youkuaiyun.com/jcily/article/details/3821244
大约在3天前的晚上,换了工具条的图片,想美化一下,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并在创建工具条时指定。