[界面]设定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开发界面不够简洁快速.

posted @ 2012-05-20 18:14  virqin  阅读(8127)  评论(0编辑  收藏  举报