2007-11-19 14:14:39 |
如何对 BCGControlBarPro 进行换肤 |
如何对 BCGControlBarPro 进行换肤 作者:阙海忠
效果图
本人使用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(); ....... } |