通常设定对话框及控件的前景色和背景色我们只需要在对话框APP InitInstance中调用 SetDialogBkColor就能实现设定颜色,但Tab Control不行,从微软提供的帮助查到通过实现WM_DRAWITEM消息处理, 如果接收到Tab控件的绘制,则取得Tab控件的DC, 通过DC修改标签区域的背景色和前景色.代码如下:
void CMFCTabCtrlDlg::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpdis) { CDialog::OnDrawItem(nIDCtl, lpdis); char szTabText[100]; RECT rect; UINT bkColor; CBrush *cbr; TC_ITEM tci; CTabCtrl *pTabCtrl = (CTabCtrl *)GetDlgItem(IDC_TAB1); if (pTabCtrl->m_hWnd == lpdis->hwndItem) { // which tab? switch (lpdis->itemID) { case 0: cbr = &m_brRed; bkColor = RED; break; case 1: cbr = &m_brYellow; bkColor = YELLOW; break; case 2: cbr = &m_brMagenta; bkColor = MAGENTA; break; case 3: cbr = &m_brWhite; bkColor = WHITE; break; case 4: cbr = &m_brBlue; bkColor = BLUE; break; } memset(szTabText, '\0', sizeof(szTabText)); tci.mask = TCIF_TEXT; tci.pszText = szTabText; tci.cchTextMax = sizeof(szTabText)-1; pTabCtrl->GetItem(lpdis->itemID, &tci); CDC *dc = CDC::FromHandle(lpdis->hDC); dc->FillRect(&lpdis->rcItem, cbr); dc->SetBkColor(bkColor); TextOut(lpdis->hDC, lpdis->rcItem.left, lpdis->rcItem.top, tci.pszText, lstrlen(tci.pszText)); } }
出处:<>
实现效果如下:
但是问题是,我想标签右边和子TAB窗体右边灰色也绘制成红色,怎么办? 可以这样解决:
针对标签右边为灰色,则可以调用SetColumnWidth设定子TAB的宽度,使之充满整个TAB控件的宽度,在DrawItem中获得的区域就能够填充满上面的宽度.
针对子TAB窗体右边灰色,则可以调整子窗体对话框的宽度,因为使用SetDlgBkColor能够将子窗体背景绘制成红色.另外控件宽可能会调整, 则可以将子窗体的宽修改为按照TAB主控件宽来自动调整.
这是两个比较简单的办法, 另外还想到和找到一些方法, 比如不设定标签的宽,手动调用FillSolidRect在标签右边填充红色背景, 又如为Tab添加背景图片, OnInitDialog的时候创建ImageList后调用SetImageList, 然后在DrawItem中调用DrawImage实现背景的整个修改.
总之各有利弊, 只是越发觉得VC开发界面不够简洁快速.