消失掉的鼠标
今天在看别人写的代码,其中用到一个按钮类,该类的一个效果是在鼠标移动到该窗口时,鼠标形状发生变化,但是实际运行时,发现移动到该窗口时鼠标不见了,于是查看源代码,表面上看OnMouseMove没有问题,HRGN hRgn = CreateRectRgn(0, 0, 0, 0);GetWindowRgn(hRgn);if ( PtInRegion( hRgn, point
·
今天在看别人写的代码,其中用到一个按钮类,该类的一个效果是在鼠标移动到该窗口时,鼠标形状发生变化,但是实际运行时,发现移动到该窗口时鼠标不见了,于是查看源代码,表面上看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)也可以加载成功,效果和前面的一样。
通过这个问题,我发现,写程序真的需要细心,特别是一些常用函数,表面上看起来没什么问题,结果,往往就是这些看起来熟悉的东西最有问题;另外一点就是要坚持,有时候可能遇到一个问题,找了很多次都没找到答案,这个时候可能就会放弃,当然,你就永远找不到问题的答案!开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
已为社区贡献2条内容
所有评论(0)