Luna's blog 月亮月亮酱

MFC中为控件设置鼠标状态

2018-10-11
MFC

MFC中自带的鼠标状态宏

MFC中为我们提供了以下的鼠标状态标识,通过这些标识我们可以获取到当前使用的鼠标的不同状态所显示的图标。

Value Meaning
IDC_APPSTARTING Standard arrow and small hourglass cursor.
IDC_ARROW Standard arrow cursor.
IDC_CROSS Crosshair cursor.
IDC_HAND Hand cursor.
IDC_HELP Arrow and question mark cursor.
IDC_IBEAM Ibeam cursor.
IDC_NO Slashed circle cursor.
IDC_SIZEALL Four-pointed arrow cursor pointing north, south, east, and west.
IDC_SIZENESW Double-pointed arrow cursor pointing northeast and southwest.
IDC_SIZENS Double-pointed arrow cursor pointing north and south.
IDC_SIZENWSE Double-pointed arrow cursor pointing northwest and southeast.
IDC_SIZEWE Double-pointed arrow cursor pointing west and east.
IDC_UPARROW Vertical arrow cursor.
IDC_WAIT Hourglass cursor.

参考资料 MSDN

设置鼠标指针的方法

需要用的到两个函数

HCURSOR WINAPI LoadCursor(
In_opt HINSTANCE hInstance, //如果调用自带的光标则为空
In LPCTSTR lpCursorName); //需要加载的指针

HCURSOR WINAPI SetCursor(
In_opt HCURSOR hCursor //要使用的指针,如果为NULL,则不显示指针
);

在控件中的使用方法

** 这里以一个MFC的控件派生类为例子,使得控件在鼠标内外显示不同的指针光标。** 一个简单的方法。

void CLinkButton::OnMouseMove(UINT nFlags, CPoint point)
{
	CBaseControl::OnMouseMove(nFlags,point);
	HCURSOR hCur  =  LoadCursor( NULL  , IDC_HAND ) ;
	SetCursor(hCur);
}
void CLinkButton::OnMouseLeave()
{
	HCURSOR hCur  =  LoadCursor( NULL  , IDC_ARROW ) ;
	SetCursor(hCur);
	CBaseControl::OnMouseLeave();
}

在鼠标移动的消息处理函数中将光标设置成所需要的,在鼠标移出的处理函数中将光标改回原来的,但是这还不够。 系统控件会调用OnSetCursor函数将我们的光标自动改回来,所以要重写一下SetCursor的消息函数,直接返回即可。

BOOL CLinkButton::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值

	return TRUE;
}

关于如何让控件能相应MouseLeave消息请参考另一篇文章,在此不做赘述。


Content