响应了WM_SetCursor消息,这时, 改变鼠标形状的代码必须在这个消息里处理,在其他地方使用SetCursor已经不起作用了。
这个消息处理函数包含三个参数:
|
---|
afx_msg BOOL OnSetCursor( CWnd* pWnd, UINT nHitTest, UINT message ); |
pWnd 是消息处理者的窗口,一般NULL 表示当前对话框
nHitTest 鼠标处于窗口的哪一部分
我们可以使用pWnd->GetDlgCtrlID() 来获得当前鼠标所在位置的控件ID
比如,我们要想每个控件上的鼠标形状都不一样 ,怎么写呢? 可以用如下方式实现:
BOOL CShowImageDlg::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
switch (pWnd->GetDlgCtrlID())
{
case IDC_MOVE:
SetCursor(LoadCursor(NULL,IDC_HAND));
break;
case IDC_CSTATIC_PICTURE:
SetCursor((HCURSOR)::LoadImage(NULL,"res//XiangPi.ico",IMAGE_ICON,20,20,LR_LOADFROMFILE));
break;
......
Default:
SetCursor(LoadCursor(NULL,IDC_ARROW));
break;
}
return CDialog::OnSetCursor(pWnd, nHitTest, message);
}
需注意的是: CStaic控件的属性Notify 必须要设置为TRUE 才能使得 当鼠标在 CStatic上时改变形状。
但是,当CStatic的属性Notify设置为TRUE时,其父窗口也就是包含这个控件的对话框就不能响应鼠标消息了,比如:不能响应左键按下消息 鼠标移动消息等。
有没有办法,既能使得光标可以改变形状,又能响应鼠标消息呢?
网上查时,很多人都说自己写一个继承自CStaic的类,在新类中处理鼠标消息,但是我只想修改鼠标形状,却还要再写个类,实在是有些麻烦。
有好的办法? 有。
方法是: 利用::GetCursorPos(pointPos); 获得光标所在的位置,然后判断光标是否在控件内
BOOL CShowImageDlg::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CPoint pos;
::GetCursorPos(&pos);
if(m_erase)
{
if(m_bControlUnit){
m_image.ScreenToClient(&pos);
if (m_unitTracker.HitTest(pos)>=0) // 橡皮筋类
{
SetCursor((HCURSOR)::LoadImage(NULL,"res//XiangPi.ico",IMAGE_ICON,20,20,LR_LOADFROMFILE));
return TRUE;
}
}else{
m_image.ScreenToClient(&pos);
if (m_RectTracker.HitTest(pos)>=0)
{
SetCursor((HCURSOR)::LoadImage(NULL,"res//XiangPi.ico",IMAGE_ICON,20,20,LR_LOADFROMFILE));
return TRUE;
}
}
}
}
参考资料:
http://hi.baidu.com/%D7%B2%B5%BD%D6%ED%C9%ED%C9%CF%C1%CB/blog/item/fc9b1d2a9268f1f3e6cd4099.html
http://topic.csdn.net/u/20080224/17/2b244ad8-3bf0-4481-83e4-030a415788fc.html
http://topic.csdn.net/u/20100519/17/3ee4c6a0-0f69-4334-8f34-c7db04066bc7.html
http://hi.baidu.com/nie_ok/blog/item/1d3c620f491416e9aa6457e3.html
http://topic.csdn.net/t/20030729/21/2086728.html
http://topic.csdn.net/u/20080208/13/17159a0a-7400-4f26-9e57-3aa81b0847d4.html