MFC想要实现鼠标光标在指定区域内能够改变其形状,变成十字,有下列两种方法可以实现,方法二更加好用。
方法一:
需要对消息响应函数进行处理,这里要的是鼠标移动时变成十字,因此对OnMouseMove的消息进行处理,在消息处理函数内添加以下代码,实现鼠标光标改变的效果。
void CInnovpowerUAVDlg::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CPoint point1;
CRect pRect;
GetClientRect(pRect);//获取屏幕的矩形大小
//先获取鼠标相对于屏幕的坐标
GetCursorPos(&point1);
//之后把当前鼠标在屏幕上的坐标转化为相对于窗体rect的坐标
ScreenToClient(&point1);
CRect rect;
GetDlgItem(IDC_STATICIMAGE)->GetWindowRect(&rect);//获得指定控件的矩形大小
ScreenToClient(&rect);//最后把当前鼠标在窗体上的坐标转化为相对于控件rect的坐标
if (rect.PtInRect(point1))//判断鼠标光标是否在指定控件区域内
{
/* ::SetCursor(::LoadCursor(NULL, IDC_CROSS));*/
HCURSOR cursor = LoadCursor(NULL,IDC_CROSS);
::SetCursor(cursor);//将光标设置成十字
SetClassLong(this->GetSafeHwnd(),
GCL_HCURSOR,
(LONG)LoadCursor(NULL, IDC_CROSS));//使光标在该区域不再闪烁
}
else
{
SetClassLong(this->GetSafeHwnd(),
GCL_HCURSOR,
(LONG)LoadCursor(NULL, IDC_ARROW));//光标离开该区域恢复默认箭头形状
}
}
方法二:
需要对WM_SETCURSOR消息进行处理,添加消息处理函数OnSetCursor(),在函数内进行如下操作。
BOOL CItemDlg::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CPoint p;
CRect pRect;
GetClientRect(pRect);
//先获取鼠标相对于屏幕的坐标
GetCursorPos(&p);
//最后把当前鼠标的坐标转化为相对于rect的坐标
ScreenToClient(&p);
CRect rect;
GetDlgItem(IDC_STATICIMAGE)->GetWindowRect(&rect);
ScreenToClient(&rect);
if (rect.PtInRect(p))
{
//在指定控件区域设置鼠标光标样式为十字
SetCursor(LoadCursor(NULL, IDC_CROSS));
return TRUE;
}
else
{
//鼠标光标离开指定区域恢复为箭头样式显示
SetCursor(LoadCursor(NULL, IDC_ARROW));
return TRUE;
}
return __super::OnSetCursor(pWnd, nHitTest, message);
}