博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[界面]设定Tab Control控件的颜色
阅读量:5077 次
发布时间:2019-06-12

本文共 2334 字,大约阅读时间需要 7 分钟。

  通常设定对话框及控件的前景色和背景色我们只需要在对话框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开发界面不够简洁快速.

转载于:https://www.cnblogs.com/virqin/archive/2012/05/20/2510696.html

你可能感兴趣的文章
PAT-乙级-1003 我要通过!
查看>>
特征工程之特征表达
查看>>
POJ 3422 【最大费用】.cpp
查看>>
log4j使用
查看>>
hdu 4547(LCA)
查看>>
某app的安全性分析过程
查看>>
常量优化机制
查看>>
UIVIEW圆角和边框设置
查看>>
pcb过孔盖油
查看>>
两天笔记
查看>>
对TCP/IP协议的一些看法(10):TCP协议(2)
查看>>
IE下window.onresize被多次执行的解决
查看>>
多选框全选js
查看>>
Python学习第四天
查看>>
121. Best Time to Buy and Sell Stock(动态规划)
查看>>
oracle 修改表的sql语句
查看>>
OpenNI2安装
查看>>
[Leetcode] Valid Parentheses
查看>>
[8.1] Triple Step
查看>>
JAVA网络编程
查看>>