QQ登录

只需一步,快速开始

102上位机VC MFC标签控件CTabCtrl的自绘美化

[ 复制链接 ]

102上位机VC MFC标签控件CTabCtrl的自绘美化

102上位机VC MFC标签控件CTabCtrl的自绘美化

102上位机VC MFC标签控件CTabCtrl的自绘美化

功能展示

VC的控件都支持自绘效果进行界面美化,CTabCtrl控件也是可以自绘,我们当前例程实现标签控件自绘,设置字体及颜色,也可再进行DIY更多美化效果设置,效果如图;




要点提示

要实现控件的自绘,控件自身具备有自绘属性,标签控件自绘得具有TCS_OWNERDRAWFIXED属性;可以通过ModifyStyle(0,TCS_OWNERDRAWFIXED);设置属性;然后在DrawItem()函数中实现自绘效果;




实现功能
1.新建基于对话框的应用程序
2.从CTabCtrl派生自己的类class CTabCtrlEx : public CTabCtrl,添加变量  COLORREFm_crSelColour, m_crUnselColour; CFont   m_SelFont, m_UnselFont;并在构造函数中初始化 m_crSelColour     = RGB(0,0,255); m_crUnselColour   = RGB(250,00,00);

添加这些变量的设置函数
  1. void CTabCtrlEx::SetColours(COLORREF bSelColour, COLORREF bUnselColour)
  2. {
  3.         m_crSelColour = bSelColour;
  4.         m_crUnselColour = bUnselColour;
  5.         Invalidate();
  6. } void CTabCtrlEx::SetFonts(CFont* pSelFont, CFont* pUnselFont)
  7. {
  8.         ASSERT(pSelFont && pUnselFont);

  9.         LOGFONT lFont;
  10.         int nSelHeight, nUnselHeight;

  11.         m_SelFont.DeleteObject();
  12.         m_UnselFont.DeleteObject();

  13.         pSelFont->GetLogFont(&lFont);
  14.         m_SelFont.CreateFontIndirect(&lFont);
  15.         nSelHeight = lFont.lfHeight;
复制代码

  1.         pUnselFont->GetLogFont(&lFont);
  2.         m_UnselFont.CreateFontIndirect(&lFont);
  3.         nUnselHeight = lFont.lfHeight;

  4.         SetFont( (nSelHeight > nUnselHeight)? &m_SelFont : &m_UnselFont);
  5. }
  6. void CTabCtrlEx::SetFonts(int nSelWeight,   BOOL bSelItalic,   BOOL bSelUnderline,
  7.                                                   int nUnselWeight, BOOL bUnselItalic, BOOL bUnselUnderline)
  8. {
  9.         // Free any memory currently used by the fonts.
  10.         m_SelFont.DeleteObject();
  11.         m_UnselFont.DeleteObject();

  12.         // Get the current font
  13.         LOGFONT lFont;
  14.         CFont *pFont = GetFont();
  15.         if (pFont)
  16.                 pFont->GetLogFont(&lFont);
  17.         else {
  18.                 NONCLIENTMETRICS ncm;
  19.                 ncm.cbSize = sizeof(NONCLIENTMETRICS);
  20.                 VERIFY(SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS), &ncm, 0));
  21.                 lFont = ncm.lfMessageFont;
  22.         }

  23.         // Create the "Selected" font
  24.         lFont.lfWeight = nSelWeight;
  25.         lFont.lfItalic = bSelItalic;
  26.         lFont.lfUnderline = bSelUnderline;
  27.         m_SelFont.CreateFontIndirect(&lFont);

  28.         // Create the "Unselected" font
  29.         lFont.lfWeight = nUnselWeight;
  30.         lFont.lfItalic = bUnselItalic;
  31.         lFont.lfUnderline = bUnselUnderline;
  32.         m_UnselFont.CreateFontIndirect(&lFont);

  33.         SetFont( (nSelWeight > nUnselWeight)? &m_SelFont : &m_UnselFont);
  34. }
复制代码
3.添加PreSubclassWindow()实现自绘属性设置
  1. void CTabCtrlEx::PreSubclassWindow()
  2. {        
  3.         CTabCtrl::PreSubclassWindow();
  4.         ModifyStyle(0, TCS_OWNERDRAWFIXED);
  5. }
  6. 4.添加DrawItem()函数实现自绘效果
  7. void CTabCtrlEx::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
  8. {        
  9.         CRect rect = lpDrawItemStruct->rcItem;
  10.         int nTabIndex = lpDrawItemStruct->itemID;
  11.         if (nTabIndex < 0) return;
  12.         BOOL bSelected = (nTabIndex == GetCurSel());

  13.         char label[64];
  14.         TC_ITEM tci;
  15.         tci.mask = TCIF_TEXT|TCIF_IMAGE;
  16.         tci.pszText = label;     
  17.         tci.cchTextMax = 63;            
  18.         if (!GetItem(nTabIndex, &tci )) return;

  19.         CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
  20.         if (!pDC) return;
  21.         int nSavedDC = pDC->SaveDC();

  22.         // For some bizarre reason the rcItem you get extends above the actual
  23.         // drawing area. We have to workaround this "feature".
  24.         rect.top += ::GetSystemMetrics(SM_CYEDGE);

  25.         pDC->SetBkMode(TRANSPARENT);
  26.         pDC->FillSolidRect(rect, ::GetSysColor(COLOR_BTNFACE));

  27.         // Draw image
  28.         CImageList* pImageList = GetImageList();
  29.         if (pImageList && tci.iImage >= 0) {

  30.                 rect.left += pDC->GetTextExtent(_T(" ")).cx;                // Margin
复制代码
  1. // Get height of image so we
  2.                 IMAGEINFO info;
  3.                 pImageList->GetImageInfo(tci.iImage, &info);
  4.                 CRect ImageRect(info.rcImage);
  5.                 int nYpos = rect.top;

  6.                 pImageList->Draw(pDC, tci.iImage, CPoint(rect.left, nYpos), ILD_TRANSPARENT);
  7.                 rect.left += ImageRect.Width();
  8.         }

  9.         if (bSelected) {
  10.                 pDC->SetTextColor(m_crSelColour);
  11.                 pDC->SelectObject(&m_SelFont);
  12.                 rect.top -= ::GetSystemMetrics(SM_CYEDGE);
  13.                 pDC->DrawText(label, rect, DT_SINGLELINE|DT_VCENTER|DT_CENTER);
  14.         } else {
  15.                 pDC->SetTextColor(m_crUnselColour);
  16.                 pDC->SelectObject(&m_UnselFont);
  17.                 pDC->DrawText(label, rect, DT_SINGLELINE|DT_BOTTOM|DT_CENTER);
  18.         }

  19.         pDC->RestoreDC(nSavedDC);
  20. }
复制代码
5.自定义标签类的使用:在主对话框资源添加Tab控件,关联变量  CTabCtrlEx m_Tab;再添加两对话框资源,设置为子窗口属性,关联两个类,并在主对话框中添加两个类的变量,作为标签中显示的窗口内容,如我们例程为 CDlg1 m_Dlg1;CDlg1 m_Dlg2;
6.然后是这些变量的初始化 m_Tab.InsertItem(0,"设备参数",0); m_Tab.InsertItem(1,"工艺参数",1);
m_Dlg1.Create(IDD_DIALOG1,&m_Tab);m_Dlg2.Create(IDD_DIALOG2,&m_Tab); m_Dlg1.CenterWindow();
m_Dlg1.ShowWindow(SW_SHOW);

7.添加TCN_SELCHANGE的消息响应函数OnSelchangeTab1(),实现标签切换时,显示不同的窗口
  1. void CGkbc8Dlg::OnSelchangeTab1(NMHDR* pNMHDR, LRESULT* pResult)
  2. {
  3.         int nIndex = m_Tab.GetCurSel();
  4.         switch(nIndex)
  5.         {
  6.         case 0:
  7.                 {
  8.                         m_Dlg1.CenterWindow();
  9.                         m_Dlg1.ShowWindow(SW_SHOW);
  10.                         m_Dlg2.ShowWindow(SW_HIDE);
  11.                 }
  12.                 break;
  13.         case 1:
  14.                 {
  15.                         m_Dlg2.CenterWindow();
  16.                         m_Dlg2.ShowWindow(SW_SHOW);
  17.                         m_Dlg1.ShowWindow(SW_HIDE);
  18.                 }
  19.                 break;
  20.         default:
  21.                 break;
  22.         }
  23.         *pResult = 0;
  24. }

  25. <div style="text-align: center;"><b style="font-size: large; line-height: 1.5;">我们来演示功能实现的整个过程</b></div>
复制代码


请点击此处下载

请先注册会员后在进行下载

已注册会员,请先登录后下载

文件名称:102.上位机VC MFC标签控件CTabCtrl的自绘美化.rar 
文件大小:166.01 KB  售价:10金币
下载权限: 不限 以上或 VIP会员   [购买捐助会员]   [充值积分]   有问题联系我


  

您的支持是我们创作的动力!  

  

您可花点闲钱积分自助任意充值

  

成为VIP会员 全站资源任意下载永久更新!


回复

使用道具 举报

点击查看
快速回复 返回列表 客服中心 搜索