通常設定對話框及控件的前景色和背景色我們只需要在對話框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)); } }
出處:<http://support.microsoft.com/default.aspx?scid=kb;en-us;179909>
實現效果如下:
但是問題是,我想標簽右邊和子TAB窗體右邊灰色也繪制成紅色,怎么辦? 可以這樣解決:
針對標簽右邊為灰色,則可以調用SetColumnWidth設定子TAB的寬度,使之充滿整個TAB控件的寬度,在DrawItem中獲得的區域就能夠填充滿上面的寬度.
針對子TAB窗體右邊灰色,則可以調整子窗體對話框的寬度,因為使用SetDlgBkColor能夠將子窗體背景繪制成紅色.另外控件寬可能會調整, 則可以將子窗體的寬修改為按照TAB主控件寬來自動調整.
這是兩個比較簡單的辦法, 另外還想到和找到一些方法, 比如不設定標簽的寬,手動調用FillSolidRect在標簽右邊填充紅色背景, 又如為Tab添加背景圖片, OnInitDialog的時候創建ImageList后調用SetImageList, 然后在DrawItem中調用DrawImage實現背景的整個修改.
總之各有利弊, 只是越發覺得VC開發界面不夠簡潔快速.