www.gusucode.com > 小巧的VC++词法分析器源程序-源码程序 > 小巧的VC++词法分析器源程序-源码程序\code\Link.cpp
// Download by http://www.NewXing.com #include "stdafx.h" #include "link.h" #define TIP_ID 1 CLink::CLink() { m_bOver = false; m_hLinkCursor=NULL; //初值设置为NULL,这样如果没有在程序中设置该值,就会使用默认的手形光标 } CLink::~CLink() {} ///////////////////////////////////////////////////////////////////////////// BOOL CLink::DestroyWindow() { KillTimer(1); return CStatic::DestroyWindow(); } BOOL CLink::PreTranslateMessage(MSG* pMsg) { m_ToolTip.RelayEvent(pMsg); return CStatic::PreTranslateMessage(pMsg); } void CLink::PreSubclassWindow() { DWORD dwStyle = GetStyle(); //修改属性,使之可接受消息 ::SetWindowLong(GetSafeHwnd(), GWL_STYLE, dwStyle | SS_NOTIFY); SetDefaultCursor(); //设置默认光标为手形光标 CRect rect; GetClientRect(rect); m_ToolTip.Create(this); m_ToolTip.SetDelayTime(100); m_ToolTip.SetMaxTipWidth(200); m_ToolTip.AddTool(this, "", rect, TIP_ID); CStatic::PreSubclassWindow(); } BEGIN_MESSAGE_MAP(CLink, CStatic) //{{AFX_MSG_MAP(CLink) ON_WM_CTLCOLOR_REFLECT() ON_WM_SETCURSOR() ON_WM_MOUSEMOVE() ON_WM_TIMER() //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// HBRUSH CLink::CtlColor(CDC* pDC, UINT nCtlColor) { if (m_bOver) pDC->SetTextColor(RGB(255, 0, 0)); else pDC->SetTextColor( RGB( 0, 0, 238)); pDC->SetBkMode(TRANSPARENT); //设置背景是透明的 return (HBRUSH)GetStockObject(NULL_BRUSH); } void CLink::OnMouseMove(UINT nFlags, CPoint point) { m_bOver = true; Invalidate(); SetTimer(1, 100, NULL); //设置一个定时器,用于设置鼠标离开时的颜色 CStatic::OnMouseMove(nFlags, point); } void CLink::OnTimer(UINT nIDEvent) { CPoint pt(::GetMessagePos()); ScreenToClient(&pt); CRect rc; GetClientRect(rc); if (!rc.PtInRect(pt)) { m_bOver = false; KillTimer(1); Invalidate(); } CStatic::OnTimer(nIDEvent); } BOOL CLink::OnSetCursor(CWnd* /*pWnd*/, UINT /*nHitTest*/, UINT /*message*/) { if (m_hLinkCursor) //如果设置了光标,就使用新设置的 光标 { ::SetCursor(m_hLinkCursor); return true; } return false; } ///////////////////////////////////////////////////////////////////////////// void CLink::SetToolTipText(CString str) { m_ToolTip.UpdateTipText(str,this,TIP_ID); } void CLink::SetLinkCursor(HCURSOR hCursor) { m_hLinkCursor = hCursor; if (m_hLinkCursor == NULL) SetDefaultCursor(); } void CLink::SetDefaultCursor() //从winhlp32.exe中提取手形光标,用做默认的光标 { CString str; ::GetWindowsDirectory(str.GetBuffer(MAX_PATH), MAX_PATH); str.ReleaseBuffer(); str += _T("\\winhlp32.exe"); HMODULE hModule = ::LoadLibrary(str); if (hModule) { HCURSOR hHandCursor = ::LoadCursor(hModule, MAKEINTRESOURCE(106)); if (hHandCursor) m_hLinkCursor =CopyCursor(hHandCursor); } FreeLibrary(hModule); }