zoukankan      html  css  js  c++  java
  • [界面]设定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开发界面不够简洁快速.

  • 相关阅读:
    在不同的浏览器下FORM及它的小伙伴们默认样式的CSS属性值是不全然一致
    思考博客园的机器人攻击,想到我们可能也需要开启iptables
    大数据量的Mysql数据库备份策略
    win7或win2008系统中,出现【已停止工作,联机检查解决方案并关闭该程序,关闭程序】解决方法!
    Mysql的碎片查看与处理
    "个性化空间"性能优化方案设计初步
    假期结束后的工作安排
    GZIP压缩占用CPU大吗?
    媒体云平台
    关于二级缓存的设计思路
  • 原文地址:https://www.cnblogs.com/virqin/p/2510696.html
Copyright © 2011-2022 走看看