分享
 
 
 

如何对BCGControlBarPro进行换肤 (http://www.uipower.com/yyal.asp)

王朝asp·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

我们知道使用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_LargeColdImages, m_LargeColdImagesLocked);

CBCGPToolBarImages* pDisabledImages =

GetImageList (m_DisabledImages, m_DisabledImagesLocked, m_LargeDisabledImages, m_LargeDisabledImagesLocked);

CBCGPToolBarImages* pMenuImages = !m_bLocked ?

&m_MenuImages : &m_MenuImagesLocked;

CBCGPToolBarImages* pDisabledMenuImages = !m_bLocked ?

&m_DisabledMenuImages : &m_DisabledMenuImagesLocked;

BOOL bDrawImages = pImages->IsValid ();

//globalData.clrBtnFace

pHotImages->SetTransparentColor(GetDefaultSysColor(COLOR_BTNFACE));

BOOL bFadeInactiveImages = CBCGPVisualManager::GetInstance ()->IsFadeInactiveImage ();

CBCGPDrawState ds;

if (bDrawImages &&

!pHotImages->PrepareDrawImage (ds,

m_bMenuMode ? m_sizeMenuImage : GetImageSize (),

bFadeInactiveImages))

{

return;

}

CFont* pOldFont;

if (bHorz)

{

pOldFont = (CFont*) pDC->SelectObject (&globalData.fontRegular);

}

else

{

pOldFont = (CFont*) pDC->SelectObject (&globalData.fontVert);

}

if (pColdImages->GetCount () > 0)

{

CBCGPVisualManager::GetInstance ()->SetFadeInactiveImage (FALSE);

}

if (pColdImages->GetCount ())

{

CBCGPVisualManager::GetInstance ()->SetFadeInactiveImage (FALSE);

}

int iButton = 0;

for (POSITION pos = m_Buttons.GetHeadPosition (); pos != NULL; iButton ++)

{

CBCGPToolbarButton* pButton = (CBCGPToolbarButton*) m_Buttons.GetNext (pos);

if (pButton == NULL)

{

break;

}

ASSERT_VALID (pButton);

rect = pButton->Rect ();

CRect rectInter;

if (pButton->m_nStyle & TBBS_SEPARATOR)

{

BOOL bHorzSeparator = bHorz;

CRect rectSeparator; rectSeparator.SetRectEmpty ();

OnCalcSeparatorRect (pButton, rectSeparator, bHorz);

if (pButton->m_bWrap && bHorz)

{

bHorzSeparator = FALSE;

}

if (rectInter.IntersectRect (rectSeparator, rectClip) && !pButton->IsHidden())

{

DrawSeparator (pDC, rectSeparator, bHorzSeparator);

}

continue;

}

if (!rectInter.IntersectRect (rect, rectClip))

{

continue;

}

BOOL bHighlighted = FALSE;

BOOL bDisabled = (pButton->m_nStyle & TBBS_DISABLED) && !IsCustomizeMode ();

if (IsCustomizeMode () && !m_bLocked)

{

bHighlighted = FALSE;

}

else

{

if (m_bMenuMode)

{

bHighlighted = (iButton == m_iHighlighted);

}

else

{

bHighlighted = ((iButton == m_iHighlighted ||

iButton == m_iButtonCapture) &&

(m_iButtonCapture == -1 ||

iButton == m_iButtonCapture));

}

}

if (pDC->RectVisible(&rect))

{

BOOL bDrawDisabledImages = FALSE;

if (bDrawImages)

{

CBCGPToolBarImages* pNewImages = NULL;

if (pButton->m_bUserButton)

{

if (pButton->GetImage () >= 0)

{

pNewImages = m_pUserImages;

}

}

else

{

if (m_bMenuMode)

{

if (bDisabled && pDisabledMenuImages->GetCount () > 0)

{

bDrawDisabledImages = TRUE;

pNewImages = pDisabledMenuImages;

}

else if (pMenuImages->GetCount () > 0)

{

pNewImages = pMenuImages;

}

else

{

bDrawDisabledImages =

(bDisabled && pDisabledImages->GetCount () > 0);

pNewImages = bDrawDisabledImages ?

pDisabledImages : pHotImages;

}

}

else // Toolbar mode

{

bDrawDisabledImages =

(bDisabled && pDisabledImages->GetCount () > 0);

pNewImages = bDrawDisabledImages ?

pDisabledImages : pHotImages;

if (!bHighlighted && !bDrawDisabledImages &&

(pButton->m_nStyle & TBBS_PRESSED) == 0 &&

pColdImages->GetCount () > 0 &&

!pButton->IsDroppedDown ())

{

pNewImages = pColdImages;

}

}

}

if (bDrawImages && pNewImages != pImages && pNewImages != NULL)

{

pImages->EndDrawImage (ds);

pNewImages->SetTransparentColor (globalData.clrBtnFace);

pNewImages->PrepareDrawImage (ds,

m_bMenuMode ? m_sizeMenuImage : GetImageSize (), bFadeInactiveImages);

pImages = pNewImages;

}

}

DrawButton (pDC, pButton, bDrawImages ? pImages : NULL,

bHighlighted, bDrawDisabledImages);

}

}

//-------------------------------------------------------------

// Highlight selected button in the toolbar customization mode:

//-------------------------------------------------------------

if (m_iSelected >= m_Buttons.GetCount ())

{

m_iSelected = -1;

}

if (IsCustomizeMode () && m_iSelected >= 0 && !m_bLocked &&

m_pSelToolbar == this)

{

CBCGPToolbarButton* pSelButton = GetButton (m_iSelected);

ASSERT (pSelButton != NULL);

if (pSelButton != NULL && pSelButton->CanBeStored ())

{

CRect rectDrag1 = pSelButton->Rect ();

if (pSelButton->GetHwnd () != NULL)

{

rectDrag1.InflateRect (0, 1);

}

pDC->Draw3dRect(&rectDrag1, globalData.clrBtnText, globalData.clrBtnText);

rectDrag1.DeflateRect (1, 1);

pDC->Draw3dRect(&rectDrag1, globalData.clrBtnText, globalData.clrBtnText);

}

}

if (IsCustomizeMode () && m_iDragIndex >= 0 && !m_bLocked)

{

DrawDragMarker (pDC);

}

pDC->SelectObject (pOldFont);

if (bDrawImages)

{

pImages->EndDrawImage (ds);

}

if (m_bMemDC)

{

//--------------------------------------

// Copy the results to the on-screen DC:

//--------------------------------------

pDCPaint->BitBlt (rectClip.left, rectClip.top, rectClip.Width(), rectClip.Height(),

&dcMem, rectClip.left, rectClip.top, SRCCOPY);

dcMem.SelectObject(pOldBmp);

}

CBCGPVisualManager::GetInstance ()->SetFadeInactiveImage (bFadeInactiveImages);

}

};

#endif //_MYTOOLBAR_H_

5 Skin库的释放 int CBCGCBDotNetExampleApp::ExitInstance() { ExitSkin(); ....... }

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有