如何更改CPropertySheet的背景色

如何更改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!

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值