如何修改CTabCtrl Header的背景色?

1、提出需求:CTabCtrl Header默认是灰色,需要将它改成指定的颜色,比如白色或蓝色,效果如下:

2、解决方法:在OnDrawItem中重绘Header。下面以VC6.0 为例说明。

步骤1:从CTabCtrl中派生出子类CTabSheet;

步骤2:在子类CTabSheet重载DrawItem。具体方法:

(1)在头文件中声明,virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);

(2)在CPP文件中实现DrawItem,源码如下:

 1 void CTabSheet::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
 2 {
 3     //CBrush brushBK(BK_COLOR);
 4     CBrush brushBK(RGB(0,0,255));
 5 
 6     char szTabText[100];
 7     UINT bkColor;
 8     CBrush *cbr;
 9     TC_ITEM tci;
10     LOGBRUSH m_LogBrush;
11 
12     cbr = &brushBK;
13     cbr->GetLogBrush(&m_LogBrush);
14     bkColor = m_LogBrush.lbColor;
15     //TRACE("item:%d/n",lpDrawItemStruct->itemID);
16     memset(szTabText, '/0', sizeof(szTabText));
17     tci.mask = TCIF_TEXT;
18     tci.pszText = szTabText;
19     tci.cchTextMax = sizeof(szTabText)-1;
20 
21     GetItem(lpDrawItemStruct->itemID, &tci);
22     FillRect(lpDrawItemStruct->hDC,&lpDrawItemStruct->rcItem,*cbr);
23     ::SetBkColor(lpDrawItemStruct->hDC,bkColor);
24     TextOut(lpDrawItemStruct->hDC,
25         lpDrawItemStruct->rcItem.left+5, 
26         lpDrawItemStruct->rcItem.top+5, 
27         tci.pszText,
28         lstrlen(tci.pszText));
29 }

步骤3:注册WM_DRAWITEM消息和相关处理函数。具体方法如下:

(1)在头文件中声明 afx_msg void OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct);

(2)在CPP文件中,注册WM_DRAWITEM消息。

1 BEGIN_MESSAGE_MAP(CTabSheet, CTabCtrl)
2     //{{AFX_MSG_MAP(CTabSheet)
3     ON_WM_DRAWITEM()
4     //}}AFX_MSG_MAP
5 END_MESSAGE_MAP()

(3)实现消息处理函数OnDrawItem。

1 void CTabSheet::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)
2 {
3     // TODO: Add your message handler code here and/or call default
4     DrawItem(lpDrawItemStruct);
5 }

步骤4:修改Tabl Contrl的属性,Styles选择Owner draw fixed,如下图所示:

 

3、常见问题

(1)没有收到WM_DRAWITEM消息。原因:Tabl Contrl的属性,Styles未选择Owner draw fixed;

(2)接收到WM_DRAWITEM消息后,Header颜色未修改。原因:未重载DrawItem函数;

posted @ 2019-11-20 20:03  大欢哥  阅读(756)  评论(0)    收藏  举报