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


 

   

 

 

参考资料:

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

 

 

你可能感兴趣的:(MFC)