响应了WM_SetCursor消息,如何改变鼠标形状

  响应了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;
		 }
	  }
  }
}

2022年补充:

长期改变鼠标形状:

SetClassLongPtr(GetSafeHwnd(), GCLP_HCURSOR,  (LONG)LoadCursor(NULL, IDC_WAIT));
SetCursor

如果应用程序必须在窗口中设置光标,必须确保指定窗口类的类光标被设为NULL,如果类光标不是NULL,则每次移动鼠标时,系统都要恢复类光标
	::SetCursor(::LoadCursor(NULL, MAKEINTRESOURCE(IDC_HAND)));
    ::SetCursor(::LoadCursor(NULL, MAKEINTRESOURCE(IDC_ARROW)));
    ::SetCursor(::LoadCursor(NULL, MAKEINTRESOURCE(IDC_IBEAM)));

参考资料:

如流,新一代智能工作平台

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://topic.csdn.net/t/20030729/21/2086728.html

http://topic.csdn.net/u/20080208/13/17159a0a-7400-4f26-9e57-3aa81b0847d4.html

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清水迎朝阳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值