#include "stdafx.h" #include "Hyplink.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CHyperlinkStatic IMPLEMENT_DYNAMIC(CHyperlinkStatic, CStatic) BEGIN_MESSAGE_MAP(CHyperlinkStatic, CStatic) //{{AFX_MSG_MAP(CHyperlinkStatic) ON_WM_CTLCOLOR_REFLECT() ON_CONTROL_REFLECT(STN_CLICKED, OnClicked) ON_WM_MOUSEMOVE() ON_WM_PAINT() //}}AFX_MSG_MAP ON_MESSAGE(WM_MOUSELEAVE,OnMouseLeave) END_MESSAGE_MAP() CHyperlinkStatic::CHyperlinkStatic() { m_UnvisitedColor =URL_UNVISITED_COLOR; m_VisitedColor =URL_VISITED_COLOR; m_HighlitedColor =RGB(255,0,0); m_bHighlight =FALSE; m_bTrackLeave =FALSE; } void CHyperlinkStatic::SetLink(LPCTSTR lpstrNewLink) { m_strHyperlink = lpstrNewLink; } void CHyperlinkStatic::SetVisitedColor(COLORREF crVisitedColor) { m_VisitedColor = crVisitedColor; } void CHyperlinkStatic::SetUnvisitedColor(COLORREF crUnvisitedColor) { m_UnvisitedColor = crUnvisitedColor; } void CHyperlinkStatic::SetHighlitedColor(COLORREF crHighlitedColor) { m_HighlitedColor = crHighlitedColor; } int CHyperlinkStatic::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CStatic::OnCreate(lpCreateStruct) == -1) { return -1; } return 0; } HBRUSH CHyperlinkStatic::CtlColor(CDC* pDC, UINT nCtlColor) { HBRUSH hBrush = NULL; DWORD dwStyle = GetStyle(); if (!(dwStyle & SS_NOTIFY)) { ::SetWindowLong(m_hWnd, GWL_STYLE, dwStyle | SS_NOTIFY); } if ((dwStyle & 0xFF) >= SS_RIGHT) { if (!(HFONT)m_Font) { CFont *pFont = GetFont(); if(pFont) { LOGFONT Logfont; pFont->GetObject(sizeof(Logfont), &Logfont); Logfont.lfUnderline = TRUE; m_Font.CreateFontIndirect(&Logfont); } } pDC->SelectObject(&m_Font); pDC->SetTextColor(m_bVisited ? m_VisitedColor : m_UnvisitedColor); pDC->SetBkMode(TRANSPARENT); hBrush = (HBRUSH)::GetStockObject(HOLLOW_BRUSH); } return hBrush; } void CHyperlinkStatic::OnClicked() { if (m_strHyperlink.IsEmpty()) { GetWindowText(m_strHyperlink); } HINSTANCE Hinstance = ShellExecute(NULL, "open", m_strHyperlink, NULL, NULL, SW_SHOWNORMAL); if ((UINT)Hinstance > 32) { m_bVisited = TRUE; Invalidate(); } else { MessageBeep(0); } } void CHyperlinkStatic::OnMouseMove(UINT nFlags, CPoint point) { if (!m_bTrackLeave) { TRACKMOUSEEVENT TrackMouseEvent; TrackMouseEvent.cbSize = sizeof(TrackMouseEvent); TrackMouseEvent.hwndTrack = m_hWnd; TrackMouseEvent.dwFlags = TME_LEAVE; _TrackMouseEvent(&TrackMouseEvent); m_bTrackLeave = TRUE; m_bHighlight = TRUE; Invalidate(FALSE); UpdateWindow(); } } LPARAM CHyperlinkStatic::OnMouseLeave(WPARAM wp, LPARAM lp) { m_bTrackLeave = FALSE; if (m_bHighlight) { m_bHighlight = FALSE; Invalidate(FALSE); UpdateWindow(); } return 0; } void CHyperlinkStatic::OnPaint() { CString strText; CPaintDC MyDC(this); if (!(HFONT)m_Font) { CFont *pFont = GetFont(); if(pFont) { LOGFONT LogFont; pFont->GetObject(sizeof(LogFont), &LogFont); LogFont.lfUnderline = TRUE; m_Font.CreateFontIndirect(&LogFont); } } MyDC.SelectObject(&m_Font); MyDC.SetTextColor(m_bHighlight?m_HighlitedColor:(m_bVisited?m_VisitedColor:m_UnvisitedColor)); MyDC.SetBkMode(TRANSPARENT); GetWindowText(strText); MyDC.TextOut(0,0,strText); }