MFC改变鼠标指针

news/2025/1/12 11:59:05/

 

Windows程序和Doc程序很大的不同 , 就在于Windows有一个亮丽的图形界面和简捷的操作方式 , 而鼠标就是Windows程序中最重要的一个操作手段 . 
有朋友向我咨询如何修改鼠标形状 , 这本来是一个简单的问题 ,但是当朋友向我询问进一步的,更加深入的操作机制时 ,我才发现里面隐藏着更多的问题 , 回到家里研究了一下 ,得到一些结论 。 这里就Windows下鼠标形状的一些修改方法 , 以及一些相关API的使用 , 谈谈自己的总结 ,希望对初学者能够有所帮助 。  
操作系统:        Windows2000 .
开发环境:         Visual C 6.0   ,   MFC .
示例相关类:      文档视图结构 , CDocTestView .
1: 修改方法一
重载CView里的OnMouseMove函数 .
重载方法 :
“View” -> “ClassWizard” (Ctrl + W) -> 右侧Messages栏选择”WM_MOUSEMOVE” , 然后点”Add Function” , 点”OK” .
添加代码 :
在 CDocTestView::OnMouseMove()里添加如下代码:
HCURSOR hCur  =  LoadCursor( NULL  , IDC_CROSS ) ;
::SetCursor(hCur);
机制分析:
系统默认每次调用OnMouseMove函数 ,都会重新用程序默认自带的光标来重新绘制光标 ,所以 ,需要在OnMouseMove里来进行光标的修改才有效 。
2: 修改方法二
重载CView里的OnSetCursor函数 .
重载方法:
“View” -> “ClassWizard” (Ctrl + W) -> 右侧Messages栏选择”WM_SETCURSOR” , 然后点”Add Function” , 点”OK” .
添加代码 :
修改OnSetCursor 为如下代码:
BOOL CDocTestView:: OnSetCursor ()
HCURSOR hCur  =  LoadCursor( NULL  , IDC_CROSS ) ;
::SetCursor(hCur);
return TRUE;
}
机制分析:
系统在设置光标时 ,会发送一个WM_SETCURSOR消息 ,此消息会触发OnSetCursor函数 , 所以 ,可以在这个函数里添加修改光标的代码 。
3:修改方法三
重载CView里的PreCreateWindow函数 .
重载方法 :
“View” -> “ClassWizard” (Ctrl + W) -> 右侧Messages栏选择” PreCreateWindow” , 然后点”Add Function” , 点”OK” .
添加代码 :
在CDocTestView::PreCreateWindow函数里添加如下代码:
cs.lpszClass = AfxRegisterWndClass(CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW, 
LoadCursor( NULL  , IDC_CROSS ) ,
(HBRUSH) (COLOR_WINDOW + 1));
机制分析:
缺省窗口创建时 , 会以一个结构体WNDCLASS来描述窗体的属性 ,并利用注册机制 ,将此窗口属性注册到系统中 ,利用AfxRegisterWndClass可以改变窗体本身的属性 ,并对它重新注册 。
4:修改方法四
任意函数中修改鼠标形状
理论上利用SetCursor(…)函数 , 应该可以在任何时候,任何地方修改鼠标形状 ,但实际情况却并非如此 , 每次调用OnMouseMove时候(即每次鼠标移动时) , 系统会调用程序默认原来的一个光标来重新绘制鼠标形状 . 所以 , 你如果在其它地方修改光标 , 你会发现这根本不起作用 , 因为每次鼠标一移动 , 它又恢复到原来的形状了 . 这里需要用到另一个API来实现这个功能 
SetClassLong() .  .  . 
你可以在任何地方调用下面的代码来修改光标形状:
SetClassLong(this->GetSafeHwnd(),
GCL_HCURSOR , 
(LONG)LoadCursor(NULL , IDC_CROSS));
综合比较: 
方法三更加适合于一次性的将默认光标统一替换另一种 ,并不适合于多次频繁替换。
方法一 ,方法二 ,可以实现光标的多次变换 ,但是都需要在函数中添加额外的变量来控制显示为不同的光标 。 
方法四是最灵活的一种方式 ,可以在任何时候 ,任何函数里更换鼠标形状 。
附   录
1: LoadStandardCursor使用方法 .
LoadStandardCursor用来载入系统自带的光标 , 调用方式如下:
HCURSOR hCursor = (HCURSOR)AfxGetApp()->LoadStandardCursor(IDC_CROSS);
::SetCursor(hCursor);
2: LoadCursor 使用方法
HCURSOR LoadCursor(HINSTANCE hInstance ,        // handle to application instance
LPCTSTR   lpCursorName); // name or resource identifier
lpCursorName指的是光标的名字 .
hInstance描述的是含有光标的模块句柄 . 这个模块可以是一个可执行文件 , 也可以为空 . 当模块句柄指向一个文件时 , LoadCursor则从这个文件中获取光标 . 当模块句柄为空时 , LoadCursor则从系统中获取光标 .
所以如果你想载入系统自带的光标 , 可以用下面的代码:
HCURSOR hCur  =  LoadCursor( NULL  , IDC_CROSS ) ;
::SetCursor(hCur);
如果想载入资源中自己绘制的光标 , 可以用下面的代码:
HCURSOR hCur  =  LoadCursor(AfxGetInstanceHandle() , 
MAKEINTRESOURCE(IDC_CURSOR1));
::SetCursor(hCur);
2004-12-28  by Ricky 
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/ricky460/archive/2004/12/30/234300.aspx

 


http://www.ppmy.cn/news/632121.html

相关文章

定义C#鼠标指针的形状 Cursor

定义C#指针形状的两种方法。 1.控件属性定义法: 在Windows应用程序中,通过设置控件的Cursor属性可以定义鼠标的显示形状。控件(如Button控件)的Cursor属性用于设置鼠标指针的类型,默认为Default。 2.代码定义法&am…

CSS - 鼠标指针样式详解(cursor光标样式、自定义指针图片)

我们浏览网页时会发现,鼠标指针会根据不同类型的元素进行相应的变化,比如:移到文本框上时会变成文本指示样式,移到链接上时会变成手型(手指形状)。 如果想要修改指针样式,只需要通过 cursor 这个…

Windows10中,如何改变鼠标光标(指针)的大小和颜色?

您在电脑上做教程讲解或是演示时,是否有过这样的烦恼:鼠标光标(指针)不明显,观众不容易看到鼠标箭头指示的地方? 那么,有没有什么办法可以让鼠标光标更大、更醒目呢? 有啊&#xf…

如何修改鼠标指针的样式

>> 本文已同步到码云 - 点击此链接获取最新 - 可进入码云提交修改 ! ! ! << 概要 不知道经常使用电脑的你有没有遇到过这样的问题&#xff0c;使用电脑的时候经常找不到自己的”鼠标指针”(就是当你挪动鼠标电脑屏幕上像箭头一样会动的东西)或者有时候感觉自己的鼠…

简直太强,把任意图片设置为鼠标指针

小伙伴们注意&#xff1a;公众号的推送机制不再按照时间前后推送了&#xff0c;微信公众号信息流乱序。君哥建议大家把科技毒瘤君公众号置顶&#xff08;设为星标⭐&#xff09;&#xff0c;以便第一时间看到推送&#xff0c;非常感谢~&#xff0c;方法如下图&#xff1a; 文 章…

win10如何修改鼠标指针样式

最终成果 先展示一下自己捣腾半天的成果吧。 还是比win10默认的鼠标指针好看那么一点的。下面开始HOW&#xff1a; 下载鼠标主题包 先来推荐一个我下载鼠标主题的网站&#xff1a;魔力桌面&#xff0c;里面除了有鼠标指针主题还有一些矢量素材桌面图标壁纸啥的。长这样&…

Windows鼠标指针美化

闲来无聊&#xff0c;突然想让自己的鼠标指针变得有新意一些&#xff08;◑▽◐&#xff09;&#xff0c;于是捣鼓了下&#xff0c;以下是我找到的比较喜欢的几个样式: 前往原网站下载&#xff08;本人在用这个嘻嘻&#xff09;&#xff1a;Cut the Rope Cursors, ver.1 前往原…

如何自定义你的鼠标指针

最近呢&#xff0c;啊&#xff0c;那个啥来着……哦&#xff01;自制的鼠标指针挺火的啊。 今天&#xff0c;杨哥就来教你们如何自定义你的鼠标指针&#xff01; 先给一个下载网址&#xff1a;https://icofx.ro/ 下载好后&#xff08;请把语言调为English&#xff0c;不然与我的…