简介及相关资料:
我制作了一个应用程序,当鼠标悬停在静态控件上方时,需要将光标的外观更改为手形,否则将其重置为普通光标。
我的初始应用程序处于全屏模式,但最近条款发生了变化,它必须有一个可调整大小的窗口。
这意味着WM_SETCURSOR
必须重写我的处理程序以反映新引入的更改。
游标已加载WM_CREATE
,我已经定义了类游标,如下所示:
// cursors
case WM_CREATE:
hCursorHand = LoadCursor( NULL, IDC_HAND );
hCursorArrow = LoadCursor( NULL, IDC_ARROW );
// other stuff
在我的课堂上:
WNDCLASSEX wc;
// ...
wc.hCursor = hCursorArrow;
//...
这是我的旧WM_CURSOR
处理程序(为了清楚起见,代码被简化):
case WM_SETCURSOR:
if( (HWND)wParam == GetDlgItem( hwnd, 4000 ) )
SetCursor(hCursorHand);
else
SetCursor(hCursorArrow);
return TRUE;
如果光标悬停在静态控件上方,则我的处理程序将其更改为手动,否则将其设置为默认光标(箭头)。
Bellow 是我在 Paint 中绘制的图片,当光标悬停在静态控件上方、位于客户区域以及用户调整窗口大小时,它会显示所需的光标外观。
如果需要额外的代码片段,请询问,我将编辑我的帖子,但现在,它们被省略以保持帖子简短和简洁。
我在 Windows XP 上工作,使用 MS Visual Studio C++ 和纯 Win32 API。
我为解决问题所做的努力:
下面是我尝试过的代码片段,但它们都失败了:
第一个片段:
case WM_SETCURSOR:
if( (HWND)wParam == GetDlgItem( hwnd, 4000 ) )
{
SetCursor(hCursorHand);
return TRUE;
}
else
return DefWindowProc( hWnd, msg, lParam, wParam );
第二个片段:
case WM_SETCURSOR:
if( (HWND)wParam == GetDlgItem( hwnd, 4000 ) )
{
SetCursor(hCursorHand);
return TRUE;
}
break; // based on MSDN example
第三个片段:
case WM_SETCURSOR:
if( (HWND)wParam == GetDlgItem( hwnd, 4000 ) )
{
SetCursor(hCursorHand);
return TRUE;
}
else
return FALSE;
这些将光标设置为手,无论它在哪里。
如果我让我的WM_SETCURSOR
处理程序保持不变,我得到的唯一问题是,当我将鼠标悬停在边框上时,我得到的不是调整箭头大小,而是常规箭头(作为光标的外观),但是可以调整窗口大小。
如果我注释掉我的WM_SETCURSOR
处理程序,大小箭头和光标箭头会正确显示,但是当光标悬停在静态控件上方时,光标不会变成手形(这是合乎逻辑的,因为没有WM_SETCURSOR
处理程序可以更改它)。
我浏览了 SO 存档,查看了 MSDN、CodeProject、DaniWeb、Cprogramming 和 CodeGuru,但没有成功。
通过这些,我发现了一个示例,人们将低字词 lParam
与命中测试代码进行比较。
通过 MSDN,我找到了命中测试值的链接(http://msdn.microsoft.com/en-us/library/windows/desktop/ms645618%28v=vs.85%29.aspx)并且我找到了链接游标类型(http://msdn.microsoft.com/en-us/library/windows/desktop/ms648391%28v=vs.85%29.aspx)。
目前我正在阅读它们,因为我认为我将不得不加载额外的游标资源,对命中测试值进行几次比较,然后使用这些资源来相应地设置游标外观。
问题:
我真的希望我的WM_SETCURSOR
处理程序看起来像这样:
case WM_SETCURSOR:
if( (HWND)wParam == GetDlgItem( hwnd, 4000 ) )
{
SetCursor(hCursorHand);
return TRUE;
}
else
// reset cursor's look to default
所以我要求社区指导我如何做到这一点。
如果这不可能,那么我会考虑使用多个if
语句来检查命中测试代码,并相应地设置光标的外观。
当然,如果我的问题有更好的解决方案,请提出建议,我也会考虑。
谢谢你。
问候。