基本思路是 处理OnPaint()消息。在OnPaint中绘制客户端的区域,然后绘制每个Item。
由于标准的 SysTabContrl32 中, tab 选项卡和下面的区域都属于 TabContrl的ClientRect. 需要对每选项卡单独绘制。
下面是处理OnPaint的代码:
case WM_PAINT: { CRect lRect; lpTabCtrl->GetClientRect( &lRect ); CPaintDC ldc( CTabCtrl::FromHandle(hwnd) ); CMemDC lMemDC( &ldc, &lRect ); lMemDC.FrameRect( &lRect , &CBrush(RGB(233,0,123)) ); lRect.DeflateRect(1,1,1,1); lMemDC.FillRect( &lRect , &CBrush(RGB(233,233,123)) ); // 绘制子项 { for (int index=0; index < lpTabCtrl->GetItemCount(); index ++) { CRect lItemRect; lpTabCtrl->GetItemRect(index, &lItemRect); lItemRect.DeflateRect(1,0,0,0); // 绘制背景 if ( index == lpTabCtrl->GetCurSel() ) { // 对当前选择的Item lItemRect.OffsetRect(1,1); lMemDC.FillRect(&lItemRect, & CBrush( RGB(255, 222, 23)) ); }else { //普通Item lMemDC.FillRect(&lItemRect, & CBrush( RGB(222, 123, 0) )); } // 绘制文本 vector<char> lvc(500); memset( &lvc[0], 0 , 500 ); TCITEMA item; item.mask = TCIF_TEXT|TCIF_STATE; item.pszText = &lvc[0]; item.cchTextMax = 500; item.iImage = -1; lpTabCtrl->GetItem(index,& item); string lstrText; lstrText.assign(&lvc[0]); lMemDC.SetBkMode(TRANSPARENT); CFont *lFont = lpTabCtrl->GetParent()->GetFont(); CFont *lOldFont = lMemDC.SelectObject(lFont); lMemDC.DrawText(lstrText.c_str(), lItemRect, DT_VCENTER|DT_CENTER|DT_SINGLELINE ); lMemDC.SelectObject(lOldFont); } } } break;
效果如下:
还没有试验 重载 DrawItem 什么效果??