[界面]設定Tab Control控件的顏色


  通常設定對話框及控件的前景色和背景色我們只需要在對話框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開發界面不夠簡潔快速.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM