如何在应用程序中使用手形鼠标?

yangl79 2004-08-01 07:05:23
千万不要告诉我画个鼠标再用SetCursor函数,原因很简单,我想让windows给我显示鼠标,这样才能统一,例如,当我们完全不控制鼠标的显示时,即默认,这样这个应用程序用在哪台电脑上就会显示那台电脑上的鼠标。最重要的一点是,让windows绘鼠标,在XP下可以让鼠标显示阴影,这是用自绘绘鼠标所不好做到的。
请给出关键代码,我听理论的东西听得太多了。
...全文
425 点赞 收藏 16
写回复
16 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
李马 2004-08-04
我这样的代码,仍然没有问题:
BOOL CXXXDlg::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
HCURSOR hHand = LoadCursor(NULL, IDC_HAND);
SetCursor(hHand);
return TRUE;
}
环境是XP Pro + VS.net 2003。
回复
yangl79 2004-08-04
行了,证明是我的大意,谢谢楼上所有人。特别是李马,一直观注这个问题,比那种留一句话就不管了的人强,如果回一句就不管了,如果别人还是没懂,结贴都没法结。
回复
strcat 2004-08-03
楼主可是够倔的,楼上几位的代码完全正确,你怎么就不信呢?
唉~……
回复
李马 2004-08-03
可惜手头上没有能抓下鼠标指针的抓图软件,不然我一定要抓下图来以证明。
回复
李马 2004-08-03
当然一样了,我担保。
既然是Windows系统所带有的鼠标指针,那么它当然会在XP下带有阴影。
为什么不能在使用的ID和Load资源上争论呢——事实本来就是这样的么。
回复
会思考的草 2004-08-03
LoadCursor(NULL, ID_HAND);
回复
iCoder_Me 2004-08-03
不明白你的意思,
windows 超连接用的手形指针就是 IDC_HAND 呀,如果你认为哪不对的话我可以把程序发给你,用SetCursor(LoadCursor(0, IDC_HAND)); 设置出来的一摸一样。
在 xp 下当然带有阴影。
回复
yangl79 2004-08-03
搞定了,一时不小心,真不好意思!但我这样用的确不行,我试过了:
在初始化函数中装载鼠标:
hHand=LoadCursor(NULL,IDC_HAND); //IDC_HAND已由MAKEINTRESOURCE定义

然后在OnSetCursor函数中:

SetCursor(hHand);
return TRUE;

鼠标在需要变成hHand的时候就无法显示了,不知道为什么。
而这样用就行:SetCursor(LoadCursor(NULL,MAKEINTRESOURCE(32649)));难道取出来的hHand变了吗?
回复
yangl79 2004-08-02
我敢说,用SetCursor(LoadCursor(NULL, IDC_HAND)); 语句设置出来的鼠标和windows在超连接的时候显示的是不一样的,不信可以试一试,设置一个手型鼠标很容易,这没什么好问的,我关键是要设置成windows一样的手形鼠标,注意它是带阴影的,xp专门有一项设置,如果阴影打开的话,就会看到鼠标有个影子,感觉鼠标浮起来了!!
你们都没有明白我的意思,为什么在使用什么ID,怎么load资源上争论啊?!不就是个手形鼠标嘛,找不到自己画一个也行啊!我要设置成带阴影的手形鼠标,而阴影不是鼠标的一部分,是经过windows处理后的结果,大家明白了吗?
回复
李马 2004-08-01
对于VC6,如果你的Platform SDK开发包版本太低的话,是不能使用IDC_HAND的。我的那段#ifndef...#endif就是为了解决这个问题。

另外,你的OnSetCursor,应该这么写:
BOOL CXXXDlg::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
SetCursor(LoadCursor(NULL, IDC_HAND)); // 或MAKEINTRESOURCE(32649)
return TRUE;
}
不要调用父类的OnSetCursor,因为它会给你把鼠标指针设置回去的。
回复
iCoder_Me 2004-08-01
刚才我试了一下,
你在 stdafx.h 里把 WINVER 改成 0x0500 就可以了。
:)
回复
iCoder_Me 2004-08-01
titilima(李马) 的方法原来我试过,可以的,不知道你的为什么不行,你试试这样,
把WINVER 和 _WIN32_WINNT 改成 0x0500 在试试。
还不行那你就直接用 MAKEINTRESOURCE(32649)

不知道你用过 api 没有,在 api 里就可以直接用 IDC_HAND ,
而不知道为什么在mfc 里就不行了。
回复
看看MFC的源码:
BOOL CWnd::OnSetCursor(CWnd*, UINT, UINT)
{ return (BOOL)Default(); }

LRESULT CWnd::Default()
{
// call DefWindowProc with the last message
_AFX_THREAD_STATE* pThreadState = _afxThreadState.GetData();
return DefWindowProc(pThreadState->m_lastSentMsg.message,
pThreadState->m_lastSentMsg.wParam, pThreadState->m_lastSentMsg.lParam);
}

LRESULT CWnd::DefWindowProc(UINT nMsg, WPARAM wParam, LPARAM lParam)
{
if (m_pfnSuper != NULL)
return ::CallWindowProc(m_pfnSuper, m_hWnd, nMsg, wParam, lParam);

WNDPROC pfnWndProc;
if ((pfnWndProc = *GetSuperWndProcAddr()) == NULL)
return ::DefWindowProc(m_hWnd, nMsg, wParam, lParam);
else
return ::CallWindowProc(pfnWndProc, m_hWnd, nMsg, wParam, lParam);
}

WNDPROC m_pfnSuper; // for subclassing of controls
回复
yangl79 2004-08-01
楼上两位无非是取出系统预定义的鼠标而已,这个没人不会吧?
对于titilima(李马)的答案,我试了,好像根本没有这个资源,设置鼠标后什么也不显示。
对于 laiyiling(最熟悉的陌生人)在VC++6.0下IDC_HAND是没有定义的。

就算楼上两位的可行,我主要是要设置通用的鼠标外形,也就是要避免使用SetCursor函数,除非你知道阴影鼠标的算法。如果还没明白我的意思,请看:
BOOL CXXXX::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{

return CDialog::OnSetCursor(pWnd,nHitTest,message);
// SetCursor(hCursor);
// return TRUE;
}
上面三行程序,前一条是一种方法,后两条是一种方法,假设hCursor已由用户事先装入windows预定义箭头鼠标,上面两种方法看似一样,其实不一样,前一种方法会随着以后的操作系统的升级而可能变得更好看,后一种可能永远不会。
拿XP做实验吧,大家。前一种方法会得到带阴影的鼠标(如果用户打开这个功能的话),而后一种不会出现带阴影的鼠标。
楼上两位根本没有看清我的问题,请不要把问题简单化!
回复
Kudeet 2004-08-01
HCURSOR hCurs1; // cursor handles

// Create a standard hourglass cursor.

hCurs1 = LoadCursor(NULL, IDC_HAND);

IDC_HAND
Windows 98/Me, Windows 2000/XP: Hand
回复
李马 2004-08-01
#ifndef IDC_HAND
#define IDC_HAND MAKEINTRESOURCE(32649)
#endif

这之后你就可以用IDC_HAND了(SetCursor)。
回复
相关推荐
发帖
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
帖子事件
创建了帖子
2004-08-01 07:05
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……