HiperLink
//HiperLink.H #ifndef __HYPERLINK_H__ #define __HYPERLINK_H__ #if _MSC_VER >= 1000 #pragma once #endif // _MSC_VER >= 1000 ///////////////////////////////////////////////////////////////////////////// // CHyperLink window class AFX_EXT_CLASS CHyperLink : public CStatic { // Construction/destruction public: CHyperLink(); virtual ~CHyperLink(); // Attributes public: CString m_strWebsite; // Operations public: BOOL SetCursor(HCURSOR hCursor); void SetInfo(LPTSTR sMailAddr,LPTSTR sName, LPTSTR sBadTips); // Overrides // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CHyperLink) protected: virtual void PreSubclassWindow(); //}}AFX_VIRTUAL // Protected attributes protected: COLORREF m_crLinkColour; COLORREF m_crHoverColour; BOOL m_bOverControl; HCURSOR m_hLinkCursor; CFont m_Font; CString m_MailAddr; CString m_ShowName; CString m_BadTips; // Generated message map functions protected: //{{AFX_MSG(CHyperLink) afx_msg HBRUSH CtlColor(CDC* pDC, UINT nCtlColor); afx_msg BOOL OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message); afx_msg void OnMouseMove(UINT nFlags, CPoint point); //}}AFX_MSG afx_msg void OnClicked(); DECLARE_MESSAGE_MAP() }; ///////////////////////////////////////////////////////////////////////////// //{{AFX_INSERT_LOCATION}} // Microsoft Developer Studio will insert additional declarations immediately before the previous line. #endif
//HyperLink.CPP // HyperLink.cpp : implementation file #include "..\stdafx.h" #include "HiperLink.h" #include "..\Resource.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CHyperLink CHyperLink::CHyperLink() { m_crLinkColour = RGB( 0, 0, 238 ); m_crHoverColour = RGB( 255, 0, 255 ); m_bOverControl = FALSE; } CHyperLink::~CHyperLink() { m_Font.DeleteObject(); } BEGIN_MESSAGE_MAP(CHyperLink, CStatic) //{{AFX_MSG_MAP(CHyperLink) ON_CONTROL_REFLECT(STN_CLICKED, OnClicked) ON_WM_CTLCOLOR_REFLECT() ON_WM_SETCURSOR() ON_WM_MOUSEMOVE() //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CHyperLink message handlers void CHyperLink::OnClicked() { CString strURL(m_MailAddr); //GetWindowText( strMailAddress ); // 装配成 URL 地址 //strURL.Format( _T("mailto:%s"), (LPCTSTR)m_MailAddr); // 调用 ShellExecute() 执行邮件发送 int iRet = (int)ShellExecute( NULL, _T("open"), (LPCTSTR)strURL, NULL, NULL, SW_SHOW ); if (iRet <= HINSTANCE_ERROR && MessageBox(_T("提示:发送邮件失败!\n系统未安装邮件处理程序,或未设置缺省的邮件处理程序!!\n\n是否打开我的头条号:音符的尾巴?"), _T("哎哟,发不了邮件!"), MB_YESNO) == IDYES) { int iRet2 = (int)ShellExecute( NULL, _T("open"), _T("https://www.toutiao.com/c/user/64659995094/"), NULL, NULL, SW_SHOW ); if( iRet2 <= HINSTANCE_ERROR ) AfxMessageBox(_T("打开失败!\n系统未安装浏览器,或未设置缺省的浏览器!!\n\n"), MB_OK | MB_ICONEXCLAMATION ); } } HBRUSH CHyperLink::CtlColor(CDC* pDC, UINT nCtlColor) { ASSERT(nCtlColor == CTLCOLOR_STATIC); if( m_bOverControl ) pDC->SetTextColor(m_crHoverColour); else pDC->SetTextColor(m_crLinkColour); pDC->SetBkMode( TRANSPARENT ); return (HBRUSH)GetStockObject( NULL_BRUSH ); } void CHyperLink::OnMouseMove(UINT nFlags, CPoint point) { CStatic::OnMouseMove(nFlags, point); if( m_bOverControl ) { CRect rc; GetClientRect( &rc ); if( !rc.PtInRect(point) ) { m_bOverControl = FALSE; ReleaseCapture(); RedrawWindow(); return; } } else { m_bOverControl = TRUE; RedrawWindow(); SetCapture(); } } BOOL CHyperLink::OnSetCursor(CWnd* /*pWnd*/, UINT /*nHitTest*/, UINT /*message*/) { ::SetCursor( m_hLinkCursor ); return TRUE; } void CHyperLink::PreSubclassWindow() { // 要求得到 STN_CLICKED 通知消息 DWORD dwStyle = GetStyle(); ::SetWindowLong( GetSafeHwnd(), GWL_STYLE, dwStyle | SS_NOTIFY); // 设置字体下划线 LOGFONT lf; GetFont()->GetLogFont( &lf ); lf.lfUnderline = TRUE; m_Font.CreateFontIndirect( &lf ); SetFont( &m_Font ); CStatic::PreSubclassWindow(); } void CHyperLink::SetInfo(LPTSTR sMailAddr, LPTSTR sName, LPTSTR sBadTips) { m_MailAddr = sMailAddr; m_ShowName = sName; m_BadTips = sBadTips; } BOOL CHyperLink::SetCursor(HCURSOR hCursor) { m_hLinkCursor = hCursor; return TRUE; }