📄 hyperlinkbutton.cpp
字号:
// HyperLinkButton.cpp : implementation file
//
#include "stdafx.h"
#include "test1.h"
#include "HyperLinkButton.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CHyperLinkButton
CHyperLinkButton::CHyperLinkButton()
{
m_bMouseOver = m_bLBtnDown = FALSE;
m_hCurHand = AfxGetApp()->LoadCursor(IDC_HANDCUR);
m_bHighlight=TRUE;
}
CHyperLinkButton::~CHyperLinkButton()
{
}
BEGIN_MESSAGE_MAP(CHyperLinkButton, CButton)
//{{AFX_MSG_MAP(CHyperLinkButton)
ON_WM_CREATE()
ON_WM_ERASEBKGND()
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONUP()
ON_WM_MOUSEMOVE()
ON_WM_TIMER()
ON_WM_SETCURSOR()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CHyperLinkButton message handlers
int CHyperLinkButton::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CButton::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: Add your specialized creation code here
CFont *pFont = GetFont();
ASSERT(pFont);
LOGFONT lf;
pFont->GetLogFont(&lf);
lf.lfUnderline = TRUE;
m_fontUnderline.CreateFontIndirect(&lf);
return 0;
}
void CHyperLinkButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
// TODO: Add your code to draw the specified item
CDC * pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
CRect rect(lpDrawItemStruct->rcItem);
pDC->SetBkMode(TRANSPARENT);
UINT nBtnState = lpDrawItemStruct->itemState;
CFont *pOldFont = NULL;
CString strText;
GetWindowText(strText);
if(nBtnState & ODS_DISABLED)
{
CBrush brush;
brush.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(m_bMouseOver)
{
if(nBtnState & 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(m_fontUnderline.GetSafeHandle()==NULL)
{
CFont *pFont = GetFont();
ASSERT(pFont);
LOGFONT lf;
pFont->GetLogFont(&lf);
lf.lfUnderline = TRUE;
m_fontUnderline.CreateFontIndirect(&lf);
}
pOldFont = pDC->SelectObject(&m_fontUnderline);
}
else
pDC->SetTextColor(GetSysColor(COLOR_BTNTEXT));
pDC->DrawText(strText,rect,DT_CENTER | DT_VCENTER | DT_SINGLELINE);
if(pOldFont)
pDC->SelectObject(pOldFont);
}
}
BOOL CHyperLinkButton::OnEraseBkgnd(CDC* pDC)
{
// TODO: Add your message handler code here and/or call default
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);
}
void CHyperLinkButton::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
m_bLBtnDown = TRUE;
CButton::OnLButtonDown(nFlags, point);
}
void CHyperLinkButton::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
m_bLBtnDown = FALSE;
if(m_bHighlight)
{
m_bHighlight = FALSE;
InvalidateRect(NULL);
}
CButton::OnLButtonUp(nFlags, point);
}
void CHyperLinkButton::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
SetTimer(1,10,NULL);
CButton::OnMouseMove(nFlags, point);
}
void CHyperLinkButton::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
static BOOL bPainted = FALSE;
POINT pt;
GetCursorPos(&pt);
CRect rect;
GetWindowRect(rect);
if(m_bLBtnDown)
{
KillTimer(1);
if(bPainted)
InvalidateRect(NULL);
bPainted = FALSE;
return;
}
if(!rect.PtInRect(pt))
{
m_bMouseOver = FALSE;
KillTimer(1);
if(bPainted)
InvalidateRect(NULL);
bPainted = FALSE;
return;
}
else
{
m_bMouseOver = TRUE;
InvalidateRect(NULL);
}
CButton::OnTimer(nIDEvent);
}
BOOL CHyperLinkButton::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
// TODO: Add your message handler code here and/or call default
if(m_bMouseOver)
{
::SetCursor(m_hCurHand);
return true;
}
return CButton::OnSetCursor(pWnd, nHitTest, message);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -