工控编程吧
标题:
上位机MFC实现自绘的链接按钮
[打印本页]
作者:
qq263946146
时间:
2019-7-16 17:51
标题:
上位机MFC实现自绘的链接按钮
效果演示
当前例程通过 自己编写一个集成类,实现一个自绘效果的链接按钮。
效果如下图
(, 下载次数: 0)
上传
点击文件名下载附件
鼠标移动在按钮上,按钮出高亮显示,且显示出边框。
点击按钮后会打开链接,访问网站,访问邮箱的代码已在工程中屏蔽,可以根据需要使用。
源代码工程下载地址:
(, 下载次数: 0)
上传
点击文件名下载附件
实现过程
当前例程是从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);
}
复制代码
[weixinlianxi]1[/weixinlianxi]
[MFC408]1[/MFC408][note]2[/note]
欢迎光临 工控编程吧 (https://www.gkbc8.com/)
Powered by Discuz! X3.4