//从我的新浪博客搬过来
如何更改CPropertySheet的背景色? 当然这里指的是包括改CPropertyPage和标签的背景颜色.
(1)改CPropertyPage的背景色: 1)创建一个CPropertyPage的子类: class COwnerDrawPropPage : public CPropertyPage; 2)处理它的WM_ERASEBKGND 和 WM_CTLCOLOR消息: BOOL COwnerDrawPropPage::OnEraseBkgnd(CDC* pDC) { CRect rectClient(0,0,0,0); GetClientRect(&rectClient); CBrush brush; brush.CreateSolidBrush(BACKCOLOR_BLUE); pDC->FillRect( &rectClient, &brush); return TRUE; //return CPropertyPage::OnEraseBkgnd(pDC); } HBRUSH COwnerDrawPropPage::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { // HBRUSH hbr = CPropertyPage::OnCtlColor(pDC, pWnd, nCtlColor); // return hbr; pDC->SetBkColor(BACKCOLOR_BLUE); pDC->SetBkMode(TRANSPARENT); HBRUSH hbrushBack = ::CreateSolidBrush(BACKCOLOR_BLUE); return hbrushBack; } 3)把所有属性页的父类都改为COwnerDrawPropPage.这样就改了属性页的颜色. (2)改CPropertySheet的背景色, 这里包括两方面: 客户区的颜色, 标签的颜色. 1)改客户区的颜色跟改属性页的一样: HBRUSH CMyPropertySheet::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { // HBRUSH hbr = CPropertySheet::OnCtlColor(pDC, pWnd, nCtlColor); // return hbr; pDC->SetBkColor(BACKCOLOR_BLUE); pDC->SetBkMode(TRANSPARENT); HBRUSH hbrushBack = ::CreateSolidBrush(BACKCOLOR_BLUE); return hbrushBack; } BOOL CMyPropertySheet::OnEraseBkgnd(CDC* pDC) { CRect rectClient(0,0,0,0); GetClientRect(&rectClient); CBrush brush; brush.CreateSolidBrush(BACKCOLOR_BLUE); pDC->FillRect( &rectClient, &brush); return TRUE; //return CPropertySheet::OnEraseBkgnd(pDC); } 2)改标签的就有一定难度了. 先从CTabCtrl派生一个COwnerDrawTabCtrl, 处理其WM_ERASEBKGND消息. 然后再实现其DrawItem方法,注意不是WM_DRAWITEM!! 而是 void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) . BOOL COwnerDrawTabCtrl::OnEraseBkgnd(CDC* pDC) { CRect rectClient(0,0,0,0); GetClientRect(&rectClient); pDC->FillRect( &rectClient, &m_brushBK); return TRUE; //return CTabCtrl::OnEraseBkgnd(pDC); } void COwnerDrawTabCtrl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) { TCHAR szTabText[64]={0}; TC_ITEM tci; tci.mask = TCIF_TEXT; tci.pszText = szTabText; tci.cchTextMax = sizeof(szTabText)-1; GetItem( lpDrawItemStruct->itemID, &tci); CDC *pDC = CDC::FromHandle(lpDrawItemStruct->hDC); pDC->FillRect( &lpDrawItemStruct->rcItem, &m_brushBK); pDC->SetBkColor( BACKCOLOR_BLUE); if ((lpDrawItemStruct->itemState & ODS_SELECTED) && (lpDrawItemStruct->itemAction & (ODA_SELECT | ODA_DRAWENTIRE))) { //Make the color of text of the selected tab to be BLUE. pDC->SetTextColor(RGB( 17, 139, 1)); } //! 文字的位置可能的偏移 pDC->TextOut(lpDrawItemStruct->rcItem.left+4, lpDrawItemStruct->rcItem.top+4, tci.pszText, lstrlen(tci.pszText)); } 现在, 万里长征就已经完成了一大截了,最后一步是为CMyPropertySheet 加入一个 COwnerDrawTabCtrl 成员变量, 然后在OnInitDialog() 加入子类化代码: BOOL CMyPropertySheet::OnInitDialog() { BOOL bResult = CPropertySheet::OnInitDialog(); //! 省略原有代码 //! Jasmine 2011-11-08 m_tabOwnerDraw.SubclassWindow( GetTabControl()->m_hWnd); m_tabOwnerDraw.ModifyStyle(0,TCS_OWNERDRAWFIXED); return bResult; } 这样就把用CPropertySheet和CPropertyPage实现的属性框的背景颜色改好. Have a good time!标签:BLUE,CPropertySheet,return,更改,lpDrawItemStruct,背景色,rectClient,pDC From: https://www.cnblogs.com/wsk3q/p/16964646.html