效果演示
当前例程通过 自己编写一个集成类,实现一个自绘效果的链接按钮。
效果如下图
上位机MFC实现自绘的链接按钮
鼠标移动在按钮上,按钮出高亮显示,且显示出边框。
点击按钮后会打开链接,访问网站,访问邮箱的代码已在工程中屏蔽,可以根据需要使用。
源代码工程下载地址:
实现过程
当前例程是从CButton派生的一个新类CLinkButton
class CLinkButton : public CButton
对应的两个文件为LinkButton.cpp,LinkButton.h.
复制与导入到自己工程后就可以使用此类了。
1.新建自己的基于对话框工程,复制上位的两个文件到工程根据目录。
导入到自己的工程中,工程就多出一个新的类CLinkButton。
2.在主对话框类中包含头文件
#include "LinkButton.h"
添加一个按钮控件,与此类关联便可。
3.集成类中使用了一个手形的图标 资源IDC_HANDCUR,可以自己添加或复制例程的。
按钮控件自绘功能打开没有通过代码实现,所以要设置一个按钮属性,所有者绘制。
这样编辑就可以运行程序,查看效果了。
下面是两文件的源代码,可以直接复制使用。
- #if !defined(AFX_LINKBUTTON_H__37D871C6_C673_11D3_B3A5_001088028526__INCLUDED_)
- #define AFX_LINKBUTTON_H__37D871C6_C673_11D3_B3A5_001088028526__INCLUDED_
- #if _MSC_VER > 1000
- #pragma once
- #endif // _MSC_VER > 1000
- // LinkButton.h : header file
- //
- /////////////////////////////////////////////////////////////////////////////
- // CLinkButton window
- class CLinkButton : public CButton
- {
- // Construction
- public:
- CLinkButton();
- // Attributes
- public:
- // Operations
- public:
- // Overrides
- // ClassWizard generated virtual function overrides
- //{{AFX_VIRTUAL(CLinkButton)
- public:
- virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
- //}}AFX_VIRTUAL
- // Implementation
- public:
- CFont fUnderline;
- HCURSOR hHand;
- bool bLBtnDown;
- bool bHighlight;
- virtual ~CLinkButton();
- // Generated message map functions
- protected:
- //{{AFX_MSG(CLinkButton)
- afx_msg void OnMouseMove(UINT nFlags, CPoint point);
- afx_msg BOOL OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message);
- afx_msg void OnTimer(UINT nIDEvent);
- afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
- afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
- afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
- afx_msg BOOL OnEraseBkgnd(CDC* pDC);
- //}}AFX_MSG
- DECLARE_MESSAGE_MAP()
- };
- /////////////////////////////////////////////////////////////////////////////
- //{{AFX_INSERT_LOCATION}}
- // Microsoft Visual C++ will insert additional declarations immediately before the previous line.
- #endif // !defined(AFX_LINKBUTTON_H__37D871C6_C673_11D3_B3A5_001088028526__INCLUDED_)
复制代码
- #include "stdafx.h"
- #include "resource.h" // main symbols
- #include "LinkButton.h"
- #ifdef _DEBUG
- #define new DEBUG_NEW
- #undef THIS_FILE
- static char THIS_FILE[] = __FILE__;
- #endif
- /////////////////////////////////////////////////////////////////////////////
- // CLinkButton
- CLinkButton::CLinkButton()
- {
- bHighlight = bLBtnDown = false;
- hHand = AfxGetApp()->LoadCursor(IDC_HANDCUR);
- }
- CLinkButton::~CLinkButton()
- {
- if (fUnderline.GetSafeHandle()) fUnderline.DeleteObject();
- }
- BEGIN_MESSAGE_MAP(CLinkButton, CButton)
- //{{AFX_MSG_MAP(CLinkButton)
- ON_WM_MOUSEMOVE()
- ON_WM_SETCURSOR()
- ON_WM_TIMER()
- ON_WM_CREATE()
- ON_WM_LBUTTONUP()
- ON_WM_LBUTTONDOWN()
- ON_WM_ERASEBKGND()
- //}}AFX_MSG_MAP
- END_MESSAGE_MAP()
- /////////////////////////////////////////////////////////////////////////////
- // CLinkButton message handlers
- void CLinkButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
- {
- // 获取一个CDC指针
- CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
- //定义按钮区域并初始化
- CRect rect(lpDrawItemStruct->rcItem);
- //设置背景模式
- COLORREF oc = pDC->GetTextColor();
- int iObk = pDC->SetBkMode(TRANSPARENT);
- //初始化按钮状态
- UINT state = lpDrawItemStruct->itemState;
- CFont * pOldFont = NULL;
- int iYOffset = 0, iXOffset = 0;
- CString strText;
- GetWindowText(strText);
- rect.top += iYOffset;
- rect.left += iXOffset;
- if (state & ODS_DISABLED)
- {
- //按钮置灰(DISABLED)
- CBrush grayBrush;
- grayBrush.CreateSolidBrush (GetSysColor (COLOR_GRAYTEXT));
- CSize sz = pDC->GetTextExtent(strText);
- int x = rect.left + (rect.Width() - sz.cx)/2;
- int y = rect.top + (rect.Height() - sz.cy)/2;
- rect.top += 2;
- rect.left += 2;
- pDC->SetTextColor(GetSysColor(COLOR_3DHIGHLIGHT));
- pDC->DrawText(strText, rect, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
- rect.top -= 2;
- rect.left -= 2;
- pDC->SetTextColor(GetSysColor(COLOR_GRAYTEXT));
- pDC->DrawText(strText, rect, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
- }
- else
- {
- if (bHighlight)//光标在按钮上
- {
- if (state & ODS_SELECTED)
- {
- //按下按钮
- pDC->Draw3dRect(rect,GetSysColor(COLOR_3DSHADOW), GetSysColor(COLOR_3DHILIGHT));
- }
- else
- {
- //未按下按钮
- pDC->Draw3dRect(rect,GetSysColor(COLOR_3DHILIGHT),GetSysColor(COLOR_3DSHADOW));
- }
- //字体颜色
- pDC->SetTextColor(RGB(0,0,255));
- //加下画线(也可以用其他字体)
- if (fUnderline.GetSafeHandle() == NULL)
- {
- CFont * pFont = GetFont();
- ASSERT(pFont);
- LOGFONT lf;
- pFont->GetLogFont(&lf);
- lf.lfUnderline = TRUE;
- fUnderline.CreateFontIndirect(&lf);
- }
- pOldFont = pDC->SelectObject(&fUnderline);
- }
- else pDC->SetTextColor(GetSysColor(COLOR_BTNTEXT));
- pDC->DrawText(strText, rect, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
- if (pOldFont) pDC->SelectObject(pOldFont);
- }
- }
- void CLinkButton::OnMouseMove(UINT nFlags, CPoint point)
- {
- //设置一个定时器
- SetTimer(1,10,NULL);
-
- CButton::OnMouseMove(nFlags, point);
- }
- BOOL CLinkButton::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
- {
- if (bHighlight)
- {
- ::SetCursor(hHand);
- return true;
- }
-
- return CButton::OnSetCursor(pWnd, nHitTest, message);
- }
- void CLinkButton::OnTimer(UINT nIDEvent)
- {
- static bool pPainted = false;
- POINT pt;
- GetCursorPos(&pt);
- CRect rect;
- GetWindowRect (rect);
- if (bLBtnDown)
- {
- KillTimer (1);
- if (pPainted) InvalidateRect (NULL);
- pPainted = FALSE;
- return;
- }
- if (!rect.PtInRect (pt))
- {
- bHighlight = false;
- KillTimer (1);
- if (pPainted)
- InvalidateRect(NULL);
- pPainted = false;
- return;
- }
- else
- {
- bHighlight = true;
- if (!pPainted)
- {
- pPainted = true;
- InvalidateRect(NULL);
- }
- }
- CButton::OnTimer(nIDEvent);
- }
- int CLinkButton::OnCreate(LPCREATESTRUCT lpCreateStruct)
- {
- if (CButton::OnCreate(lpCreateStruct) == -1)
- return -1;
-
- CFont * pFont = GetFont();
- ASSERT(pFont);
- LOGFONT lf;
- pFont->GetLogFont(&lf);
- lf.lfUnderline = TRUE;
- fUnderline.CreateFontIndirect(&lf);
-
- return 0;
- }
- void CLinkButton::OnLButtonUp(UINT nFlags, CPoint point)
- {
- bLBtnDown = false;
- if (bHighlight)
- {
- bHighlight = false;
- InvalidateRect(NULL);
- }
-
- CButton::OnLButtonUp(nFlags, point);
- }
- void CLinkButton::OnLButtonDown(UINT nFlags, CPoint point)
- {
- bLBtnDown = true;
-
- //打开网页
- char szURL[80];
- strcpy(szURL,"https://www.gkbc8.com");
- ShellExecute(NULL,
- "open",
- szURL,
- NULL,
- NULL,
- SW_SHOWNORMAL);
- /*打开邮件
- char szMailAddress[80];
- strcpy(szMailAddress,"mailto:zxn@hq.cninfo.net");
- ShellExecute(NULL,
- "open",
- szMailAddress,
- NULL,
- NULL,
- SW_SHOWNORMAL);*/
- CButton::OnLButtonDown(nFlags, point);
- }
- BOOL CLinkButton::OnEraseBkgnd(CDC* pDC)
- {
- COLORREF cr = GetSysColor(COLOR_3DFACE);
- int r = GetRValue(cr);
- int g = GetGValue(cr);
- int b = GetBValue(cr);
- if (r > 1) r -= 2;
- if (g > 1) g -= 2;
- if (r < 3 && g < 3 && b < 253) b += 2;
- COLORREF cr1 = RGB(r,g,b);
- CRect rc;
- GetClientRect(rc);
- pDC->FillSolidRect(rc, cr1);
-
- return CButton::OnEraseBkgnd(pDC);
- }
复制代码 如果您认可,可联系功能定制! 如果您着急,充值会员可直接联系发您资料!
上位机VC MFC程序开发精典实例大全源码与视频讲解配套下载408例 经历1年的编程与录制点击进入查看
|