如何修改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函数;


浙公网安备 33010602011771号