当前位置: 首页 > 图文教程 > 开发语言 > VC++ > 如何对 BCGControlBarPro 进行换肤

VC++
几个数字信号处理算法程序
简易软盘镜像工具的实现及操作系统编写初步
教你使用正则表达式
C++ 扩展和嵌入 Python
拷贝构造和赋值操作符,C#和本机 C++ 代码的互用性
精通VC与Matlab联合编程(六)
精通VC与Matlab联合编程(五)
一个排序用的C++函数模板
浅析VC与MATLAB联合编程
C++编译器如何实现异常处理
文件重定义冲突的分析与解决
一步一步实现MFC扩展DLL中导出类和对话框
C宏:智者的利刃,愚者的恶梦!
引用的作用
《UTF-8与GB2312之间的互换》的改进
程序风格的要素-C++风格指南
VC+6.0实现文本串的自由拆分
怎样给串行化类分配版本号(可配置版本模式)
在常规的编程任务中使用新的 <tuple> 库
使用 typedef 抑制劣质代码

VC++ 中的 如何对 BCGControlBarPro 进行换肤


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-30   浏览: 68 ::
收藏到网摘: n/a

如何对 BCGControlBarPro 进行换肤

作者:阙海忠

  • 下载 BCGPro6.4:(该版本是 BCGControlBar Professional v6.40 Retail 专业零售版,官方发布日期是2003-04-28)
  • 下载可执行文件:(Release, Skin++ Dll, BCG Dll)
  • 下载源代码

效果图



图一

  我们知道使用VC开发大型的应用系统时,都会碰到一个界面设计和风格布局的问题。如果一切都重头开始设计和编写的话,将会是巨大的工作量。在短时间内很难写出一个比较健壮功能强大的界面系统出来。对软件项目进度也带来了不可预测的风险。在这种形势下BCG库就应运而生了。目前BCG可以做出诸如Visual Studio .Net 2003 ,Outlook等大型界面系统。几乎可以满足目前市场上绝大多数管理信息系统的界面要求。在我所看到的很多ERP,GSP等的MIS软件公司,都在采用BCG系统。该库非常稳定和易用。
  随着 Mircorsoft WindowsXP 系统的推出,计算机世界已经进入个性化时代。用户对界面系统提出更高一层的要求。尽管BCG本身自带了Skin工程,但那个工程的功能还是非常弱的。主要表现在:

  1. 不能对标题栏,滚动条和 Windows 系统标准的窗口换肤;
  2. 没有丰富的界面元素提供下载。

  本人使用Skin++库(www.uipower.com),在BCG的例子中作了几处改动后,BCG就拥有了动态换肤的功能。
  我们在这里以BCGCBDotNetExample为例:

1、Skin头文件的包含在StdAfx.h中包含Skin库的头文件。

	#include "SkinPlusPlus.h"
2、Skin库的加载:
BOOL CBCGCBDotNetExampleApp::InitInstance(){	......	InitializeSkin(_T("XPCorona.ssk"));	......}
3、让BCG重新取下系统色:
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct){	..................	-----------------	// Create menu bar:	//-----------------	if (!m_wndMenuBar.Create (this))	{	TRACE0("Failed to create menubar\n");	return -1; // fail to create	}	m_wndMenuBar.SendMessage(WM_SYSCOLORCHANGE,0,0);	..................}
4、工具条图标的透明色问题;
  从CBCGPToolBar派生一个子类CMyBCGPToolBar,在该子类中覆盖CBCGPToolBar的 virtual void DoPaint(CDC* pDCPaint)。这里主要处理工具条图标的透明色问题。
  凡是使用CBCGPToolBar的地方全部替换成CMyBCGPToolBar。这样你的工具条就有了和皮肤一致的皮肤色。而不是Windows的系统色。代码如下:
#ifndef _MYTOOLBAR_H_#define _MYTOOLBAR_H_#include "stdafx.h"class CMyBCGPToolBar : public CBCGPToolBar{public: virtual void DoPaint(CDC* pDCPaint) { ASSERT_VALID(this); ASSERT_VALID(pDCPaint); CRect rectClip; pDCPaint->GetClipBox (rectClip); BOOL bHorz = GetCurrentAlignment () & CBRS_ORIENT_HORZ ? TRUE : FALSE; CRect rectClient; GetClientRect (rectClient); CDC* pDC = pDCPaint; BOOL m_bMemDC = FALSE; CDC dcMem; CBitmap bmp; CBitmap* pOldBmp = NULL; if (dcMem.CreateCompatibleDC (pDCPaint) && bmp.CreateCompatibleBitmap (pDCPaint, rectClient.Width (), rectClient.Height ())) { m_bMemDC = TRUE; pOldBmp = dcMem.SelectObject (&bmp); pDC = &dcMem; if ((GetStyle () & TBSTYLE_TRANSPARENT) == 0) { CBCGPVisualManager::GetInstance ()->OnFillBarBackground (pDC, this, rectClient, rectClip); } } OnFillBackground (pDC); pDC->SetTextColor (globalData.clrBtnText); pDC->SetBkMode (TRANSPARENT); CRect rect; GetClientRect(rect); if (bHorz) { rect.bottom = rect.top + GetRowHeight (); } else { rect.right = rect.left + GetColumnWidth (); } CBCGPToolBarImages* pImages = GetImageList (m_Images, m_ImagesLocked, m_LargeImages, m_LargeImagesLocked); CBCGPToolBarImages* pHotImages = pImages; CBCGPToolBarImages* pColdImages = GetImageList(m_ColdImages, m_ColdImagesLocked, m_La