初次使用BCG库

From: http://blog.csdn.net/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并在创建工具条时指定。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值