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);
	
}