今天在看别人写的代码,其中用到一个按钮类,该类的一个效果是在鼠标移动到该窗口时,鼠标形状发生变化,但是实际运行时,发现移动到该窗口时鼠标不见了,于是查看源代码,表面上看OnMouseMove没有问题,

		HRGN hRgn = CreateRectRgn(0, 0, 0, 0);
		GetWindowRgn(hRgn);		

		if ( PtInRegion( hRgn, point.x, point.y ))
		{
			::SetCursor(AfxGetApp()->LoadCursor(IDC_HAND));
			if ( !m_bMouseIn)
			{
				m_bMouseIn = TRUE;
				Invalidate();
				UpdateWindow();
				SetCapture();
			}
		}
		else
		{
			if ( m_bMouseIn)
			{
				m_bMouseIn = FALSE;
				//GetRegion();
				Invalidate();
				UpdateWindow();
				if ( !m_bDown )
					ReleaseCapture();
			}

		}
		DeleteObject(hRgn);

最后搜索了相关的资料,有人说到在OnMouseMove函数中改变鼠标会引起闪烁等等,开始以为问题就出在这,于是按照文章说的响应消息函数OnSetCursor

::SetCursor(AfxGetApp()->LoadCursor(IDC_HAND));
return TRUE;

结果问题同样没有得到解决,于是又继续找答案,这个时候发现用LoadStandardCursor(IDC_HAND)替换后问题得到解决,于是再次分析,发现问题出在函数的调用上,AfxGetApp()->LoadCursor(IDC_HAND),该函数返回的是本模块的一个鼠标资源,但是本模块中并不存在ID为IDC_HAND的资源,因此结果返回为空,LoadStandardCursor则是从标准库中加载资源,因此能够成功,为了达到同样的果,::LoadCursor(NULL, IDC_HAND)也可以加载成功,效果和前面的一样。

                通过这个问题,我发现,写程序真的需要细心,特别是一些常用函数,表面上看起来没什么问题,结果,往往就是这些看起来熟悉的东西最有问题;另外一点就是要坚持,有时候可能遇到一个问题,找了很多次都没找到答案,这个时候可能就会放弃,当然,你就永远找不到问题的答案!

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐