QQ登录

只需一步,快速开始

上位机VC MFC自绘实现3D文本按钮

[ 复制链接 ]

上位机VC MFC自绘实现3D文本按钮

上位机VC MFC自绘实现3D文本按钮

例程通过从CButton派生,通过自绘方式实现3维文本按钮效果;
实现也非常简单
可以自己从CButton派生类C3DTextBtn
依次编写函数代码
DrawItem,
OnEraseBkgnd
PreSubclassWindow

  1. void C3DTextBtn::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) {
  2.      CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
  3.      ASSERT_VALID(pDC);
  4.      CRect rectClient = lpDrawItemStruct->rcItem;
  5.      Draw(pDC,rectClient, lpDrawItemStruct->itemState);
  6. }

  7. void C3DTextBtn::Draw(CDC* pDC, const CRect& rect, UINT state) {
  8.         CString text; GetWindowText(text);
  9.         int l = text.GetLength();
  10.         CRect rectClient = rect;
  11.        
  12.         // get font from control
  13.         CFont* pFont = GetFont();
  14.        
  15.         // ensure we have a valid height and width and select the font
  16.         LOGFONT logfont;
  17.         pFont->GetObject(sizeof(LOGFONT),&logfont);
  18.         if (logfont.lfHeight == 0) logfont.lfHeight = 20;
  19.         logfont.lfWidth = 0;     // 0 so it will be calculated
  20.         logfont.lfWeight = 1000;
  21.         logfont.lfEscapement = logfont.lfOrientation = 0;
  22.         CFont tryfont; VERIFY(tryfont.CreateFontIndirect(&logfont));
  23.         CFont* pFontOld = pDC->SelectObject(&tryfont);
  24.        
  25.         // get the control size and adjust font width & height accordingly
  26.         if (m_bUse3D) rectClient.DeflateRect(3,3);
  27.         CSize textSizeClient = pDC->GetTextExtent(text,l);
  28.         if (rectClient.Width()*textSizeClient.cy >
  29.                 rectClient.Height()*textSizeClient.cx) {
  30.                 logfont.lfHeight = ::MulDiv(logfont.
  31.                         lfHeight,rectClient.Height(),textSizeClient.cy);
  32.         } else {
  33.                 logfont.lfHeight = ::MulDiv(logfont.
  34.                         lfHeight,rectClient.Width(),textSizeClient.cx);
  35.         }
  36.         logfont.lfHeight--; // fudge factor
  37.         if (m_bUse3D) rectClient.InflateRect(3,3);
  38.        
  39.         // create adjusted font and select
  40.         CFont font; font.CreateFontIndirect(&logfont);
  41.         pDC->SelectObject(&font);
  42.         textSizeClient = pDC->GetTextExtent(text,l);
  43.        
  44.         int minx = rectClient.left+(rectClient.Width()-textSizeClient.cx)/2;
  45.         int miny = rectClient.top+(rectClient.Height()-textSizeClient.cy)/2;
  46.        
  47.         int oldBkMode = pDC->SetBkMode(TRANSPARENT);
  48.         COLORREF textcol = ::GetSysColor((state & ODS_FOCUS) ? COLOR_GRAYTEXT
  49.                 : COLOR_BTNTEXT);
  50.         COLORREF oldTextColor = pDC->SetTextColor(textcol);
  51.        
  52.         int cx = minx;
  53.         int cy = miny;
  54.         if (m_bUse3D) {
  55.                 int s = (state & ODS_SELECTED) ? -1 : +1;
  56.                 cx += 3; cy += 3;
  57.                
  58.                 // draw 3D highlights
  59.                 pDC->SetTextColor(::GetSysColor(COLOR_3DDKSHADOW));
  60.                 pDC->TextOut(cx-s*2,cy+s*2,text);
  61.                 pDC->TextOut(cx+s*2,cy-s*2,text);
  62.                 pDC->TextOut(cx+s*2,cy+s*2,text);
  63.                 pDC->SetTextColor(::GetSysColor(COLOR_3DHILIGHT));
  64.                 pDC->TextOut(cx+s*1,cy-s*2,text);
  65.                 pDC->TextOut(cx-s*2,cy+s*1,text);
  66.                 pDC->TextOut(cx-s*2,cy-s*2,text);
  67.                 pDC->SetTextColor(::GetSysColor(COLOR_3DSHADOW));
  68.                 pDC->TextOut(cx-s*1,cy+s*1,text);
  69.                 pDC->TextOut(cx+s*1,cy-s*1,text);
  70.                 pDC->TextOut(cx+s*1,cy+s*1,text);
  71.                 pDC->SetTextColor(::GetSysColor(COLOR_3DLIGHT));
  72.                 pDC->TextOut(cx,cy-s*1,text);
  73.                 pDC->TextOut(cx-s*1,cy,text);
  74.                 pDC->TextOut(cx-s*1,cy-s*1,text);
  75.                 pDC->SetTextColor(textcol);
  76.         }
  77.         // draw the text
  78.         pDC->TextOut(cx,cy,text);
  79.        
  80.         // restore DC
  81.         pDC->SetTextColor(oldTextColor);
  82.         pDC->SetBkMode(oldBkMode);
  83.         pDC->SelectObject(pFontOld);
  84. }

  85. BOOL C3DTextBtn::OnEraseBkgnd(CDC*) {
  86.      return true;  
  87. }
复制代码
有了自己编写的类后,就是关联与使用
#include "3DTextBtn.h"
        C3DTextBtn        m_Btn;

实现很简单,入门的朋友要项目源代码可直接下载附件,内有编译好的程序与源代码
请点击此处下载

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

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

文件名称:上位机VC MFC自绘实现3D文本按钮.rar 
文件大小:216.43 KB  售价:10金币
下载权限: 不限 以上或 VIP会员   [购买捐助会员]   [充值积分]   有问题联系我


  

如果您认可,可联系功能定制!

  

如果您着急,充值会员可直接联系发您资料!

  

QQ联系我

微信扫扫联系我

  

回复

使用道具 举报

快速回复 返回列表 客服中心 搜索