QQ登录

只需一步,快速开始

上位机MFC实现自绘的链接按钮

[ 复制链接 ]
效果演示

当前例程通过 自己编写一个集成类,实现一个自绘效果的链接按钮。
效果如下图

上位机MFC实现自绘的链接按钮

上位机MFC实现自绘的链接按钮

鼠标移动在按钮上,按钮出高亮显示,且显示出边框。
点击按钮后会打开链接,访问网站,访问邮箱的代码已在工程中屏蔽,可以根据需要使用。
源代码工程下载地址:
请点击此处下载

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

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

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



实现过程
当前例程是从CButton派生的一个新类CLinkButton
class CLinkButton : public CButton
对应的两个文件为LinkButton.cpp,LinkButton.h.
复制与导入到自己工程后就可以使用此类了。

1.新建自己的基于对话框工程,复制上位的两个文件到工程根据目录。
导入到自己的工程中,工程就多出一个新的类CLinkButton。

2.在主对话框类中包含头文件
#include "LinkButton.h"
添加一个按钮控件,与此类关联便可。

3.集成类中使用了一个手形的图标 资源IDC_HANDCUR,可以自己添加或复制例程的。
按钮控件自绘功能打开没有通过代码实现,所以要设置一个按钮属性,所有者绘制。
这样编辑就可以运行程序,查看效果了。
下面是两文件的源代码,可以直接复制使用。

  1. #if !defined(AFX_LINKBUTTON_H__37D871C6_C673_11D3_B3A5_001088028526__INCLUDED_)
  2. #define AFX_LINKBUTTON_H__37D871C6_C673_11D3_B3A5_001088028526__INCLUDED_

  3. #if _MSC_VER > 1000
  4. #pragma once
  5. #endif // _MSC_VER > 1000
  6. // LinkButton.h : header file
  7. //

  8. /////////////////////////////////////////////////////////////////////////////
  9. // CLinkButton window

  10. class CLinkButton : public CButton
  11. {
  12. // Construction
  13. public:
  14.         CLinkButton();

  15. // Attributes
  16. public:

  17. // Operations
  18. public:

  19. // Overrides
  20.         // ClassWizard generated virtual function overrides
  21.         //{{AFX_VIRTUAL(CLinkButton)
  22.         public:
  23.         virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
  24.         //}}AFX_VIRTUAL

  25. // Implementation
  26. public:
  27.         CFont fUnderline;
  28.         HCURSOR hHand;
  29.         bool bLBtnDown;
  30.         bool bHighlight;
  31.         virtual ~CLinkButton();

  32.         // Generated message map functions
  33. protected:
  34.         //{{AFX_MSG(CLinkButton)
  35.         afx_msg void OnMouseMove(UINT nFlags, CPoint point);
  36.         afx_msg BOOL OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message);
  37.         afx_msg void OnTimer(UINT nIDEvent);
  38.         afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
  39.         afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
  40.         afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
  41.         afx_msg BOOL OnEraseBkgnd(CDC* pDC);
  42.         //}}AFX_MSG

  43.         DECLARE_MESSAGE_MAP()
  44. };

  45. /////////////////////////////////////////////////////////////////////////////

  46. //{{AFX_INSERT_LOCATION}}
  47. // Microsoft Visual C++ will insert additional declarations immediately before the previous line.

  48. #endif // !defined(AFX_LINKBUTTON_H__37D871C6_C673_11D3_B3A5_001088028526__INCLUDED_)
复制代码

  1. #include "stdafx.h"
  2. #include "resource.h"                // main symbols
  3. #include "LinkButton.h"

  4. #ifdef _DEBUG
  5. #define new DEBUG_NEW
  6. #undef THIS_FILE
  7. static char THIS_FILE[] = __FILE__;
  8. #endif

  9. /////////////////////////////////////////////////////////////////////////////
  10. // CLinkButton

  11. CLinkButton::CLinkButton()
  12. {
  13.         bHighlight = bLBtnDown = false;
  14.         hHand = AfxGetApp()->LoadCursor(IDC_HANDCUR);
  15. }

  16. CLinkButton::~CLinkButton()
  17. {
  18.         if (fUnderline.GetSafeHandle()) fUnderline.DeleteObject();
  19. }


  20. BEGIN_MESSAGE_MAP(CLinkButton, CButton)
  21.         //{{AFX_MSG_MAP(CLinkButton)
  22.         ON_WM_MOUSEMOVE()
  23.         ON_WM_SETCURSOR()
  24.         ON_WM_TIMER()
  25.         ON_WM_CREATE()
  26.         ON_WM_LBUTTONUP()
  27.         ON_WM_LBUTTONDOWN()
  28.         ON_WM_ERASEBKGND()
  29.         //}}AFX_MSG_MAP
  30. END_MESSAGE_MAP()

  31. /////////////////////////////////////////////////////////////////////////////
  32. // CLinkButton message handlers

  33. void CLinkButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
  34. {
  35.         // 获取一个CDC指针
  36.         CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);

  37.         //定义按钮区域并初始化
  38.         CRect rect(lpDrawItemStruct->rcItem);

  39.         //设置背景模式
  40.         COLORREF oc = pDC->GetTextColor();
  41.         int iObk = pDC->SetBkMode(TRANSPARENT);

  42.         //初始化按钮状态
  43.         UINT state = lpDrawItemStruct->itemState;

  44.         CFont * pOldFont = NULL;

  45.         int iYOffset = 0, iXOffset = 0;

  46.         CString strText;
  47.         GetWindowText(strText);

  48.         rect.top  += iYOffset;
  49.         rect.left += iXOffset;


  50.         if (state & ODS_DISABLED)
  51.         {               
  52.                 //按钮置灰(DISABLED)
  53.                 CBrush grayBrush;
  54.                 grayBrush.CreateSolidBrush (GetSysColor (COLOR_GRAYTEXT));
  55.                 CSize sz = pDC->GetTextExtent(strText);
  56.                 int x = rect.left + (rect.Width() - sz.cx)/2;
  57.                 int y = rect.top + (rect.Height() - sz.cy)/2;
  58.                 rect.top  += 2;
  59.                 rect.left += 2;
  60.                 pDC->SetTextColor(GetSysColor(COLOR_3DHIGHLIGHT));
  61.                 pDC->DrawText(strText, rect, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
  62.                 rect.top  -= 2;
  63.                 rect.left -= 2;
  64.                 pDC->SetTextColor(GetSysColor(COLOR_GRAYTEXT));
  65.                 pDC->DrawText(strText, rect, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
  66.         }
  67.         else
  68.         {
  69.                 if (bHighlight)//光标在按钮上
  70.                 {
  71.                         if (state & ODS_SELECTED)
  72.                         {
  73.                                 //按下按钮
  74.                                 pDC->Draw3dRect(rect,GetSysColor(COLOR_3DSHADOW), GetSysColor(COLOR_3DHILIGHT));
  75.                         }
  76.                         else
  77.                         {
  78.                                 //未按下按钮
  79.                                 pDC->Draw3dRect(rect,GetSysColor(COLOR_3DHILIGHT),GetSysColor(COLOR_3DSHADOW));
  80.                         }
  81.                         //字体颜色
  82.                         pDC->SetTextColor(RGB(0,0,255));

  83.                         //加下画线(也可以用其他字体)
  84.                         if (fUnderline.GetSafeHandle() == NULL)
  85.                         {
  86.                                 CFont * pFont = GetFont();
  87.                                 ASSERT(pFont);
  88.                                 LOGFONT lf;
  89.                                 pFont->GetLogFont(&lf);
  90.                                 lf.lfUnderline = TRUE;
  91.                                 fUnderline.CreateFontIndirect(&lf);               
  92.                         }

  93.                         pOldFont = pDC->SelectObject(&fUnderline);
  94.                 }
  95.                 else pDC->SetTextColor(GetSysColor(COLOR_BTNTEXT));

  96.                 pDC->DrawText(strText, rect, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
  97.                 if (pOldFont) pDC->SelectObject(pOldFont);
  98.         }
  99. }


  100. void CLinkButton::OnMouseMove(UINT nFlags, CPoint point)
  101. {
  102.         //设置一个定时器
  103.         SetTimer(1,10,NULL);
  104.        
  105.         CButton::OnMouseMove(nFlags, point);
  106. }

  107. BOOL CLinkButton::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
  108. {
  109.         if (bHighlight)
  110.         {
  111.                 ::SetCursor(hHand);
  112.                 return true;
  113.         }
  114.        
  115.         return CButton::OnSetCursor(pWnd, nHitTest, message);
  116. }

  117. void CLinkButton::OnTimer(UINT nIDEvent)
  118. {
  119.         static bool pPainted = false;
  120.         POINT pt;
  121.         GetCursorPos(&pt);
  122.         CRect rect;
  123.         GetWindowRect (rect);
  124.         if (bLBtnDown)       
  125.         {               
  126.                 KillTimer (1);
  127.                 if (pPainted) InvalidateRect (NULL);               
  128.                 pPainted = FALSE;               
  129.                 return;       
  130.         }

  131.         if (!rect.PtInRect (pt))       
  132.         {               
  133.                 bHighlight = false;
  134.                 KillTimer (1);

  135.                 if (pPainted)                       
  136.                         InvalidateRect(NULL);

  137.                 pPainted = false;
  138.                 return;       
  139.         }
  140.         else
  141.         {
  142.                 bHighlight = true;
  143.                 if (!pPainted)
  144.                 {
  145.                         pPainted = true;
  146.                         InvalidateRect(NULL);
  147.                 }
  148.         }

  149.         CButton::OnTimer(nIDEvent);
  150. }

  151. int CLinkButton::OnCreate(LPCREATESTRUCT lpCreateStruct)
  152. {
  153.         if (CButton::OnCreate(lpCreateStruct) == -1)
  154.                 return -1;
  155.        
  156.         CFont * pFont = GetFont();
  157.         ASSERT(pFont);

  158.         LOGFONT lf;
  159.         pFont->GetLogFont(&lf);
  160.         lf.lfUnderline = TRUE;

  161.         fUnderline.CreateFontIndirect(&lf);
  162.        
  163.         return 0;
  164. }

  165. void CLinkButton::OnLButtonUp(UINT nFlags, CPoint point)
  166. {
  167.         bLBtnDown = false;
  168.         if (bHighlight)       
  169.         {
  170.                 bHighlight = false;
  171.                 InvalidateRect(NULL);
  172.         }
  173.        
  174.         CButton::OnLButtonUp(nFlags, point);
  175. }

  176. void CLinkButton::OnLButtonDown(UINT nFlags, CPoint point)
  177. {
  178.         bLBtnDown = true;
  179.                
  180.         //打开网页
  181.         char szURL[80];
  182.         strcpy(szURL,"https://www.gkbc8.com");
  183.         ShellExecute(NULL,
  184.                                 "open",
  185.                                  szURL,
  186.                                  NULL,
  187.                                  NULL,
  188.                                  SW_SHOWNORMAL);
  189.         /*打开邮件
  190.         char szMailAddress[80];
  191.         strcpy(szMailAddress,"mailto:zxn@hq.cninfo.net");
  192.         ShellExecute(NULL,
  193.                                 "open",
  194.                                  szMailAddress,
  195.                                  NULL,
  196.                                  NULL,
  197.                                  SW_SHOWNORMAL);*/

  198.         CButton::OnLButtonDown(nFlags, point);
  199. }

  200. BOOL CLinkButton::OnEraseBkgnd(CDC* pDC)
  201. {
  202.         COLORREF cr = GetSysColor(COLOR_3DFACE);
  203.         int r = GetRValue(cr);
  204.         int g = GetGValue(cr);
  205.         int b = GetBValue(cr);
  206.         if (r > 1) r -= 2;
  207.         if (g > 1) g -= 2;
  208.         if (r < 3 && g < 3 && b < 253) b += 2;
  209.         COLORREF cr1 = RGB(r,g,b);
  210.         CRect rc;
  211.         GetClientRect(rc);
  212.         pDC->FillSolidRect(rc, cr1);
  213.        
  214.         return CButton::OnEraseBkgnd(pDC);
  215. }
复制代码
  

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

  

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

  

QQ联系我

微信扫扫联系我

  

  

上位机VC MFC程序开发精典实例大全源码与视频讲解配套下载408例

  

经历1年的编程与录制点击进入查看

  

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

  

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

  

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



回复

使用道具 举报

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