博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MFC改变鼠标形状的方法汇总
阅读量:4056 次
发布时间:2019-05-25

本文共 2345 字,大约阅读时间需要 7 分钟。

MFC编程改变鼠标形状的方法汇总
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);
转载自:http://blog.csdn.net/shanzhizi
你可能感兴趣的文章
出现( linker command failed with exit code 1)错误总结
查看>>
iOS开发中一些常见的并行处理
查看>>
iOS获取手机的Mac地址
查看>>
ios7.1发布企业证书测试包的问题
查看>>
如何自定义iOS中的控件
查看>>
iOS 开发百问
查看>>
Mac环境下svn的使用
查看>>
github简单使用教程
查看>>
如何高效利用GitHub
查看>>
环境分支-git版本管理
查看>>
uni-app 全局变量
查看>>
js判断空对象的几种方法
查看>>
java 不用递归写tree
查看>>
springboot2 集成Hibernate JPA 用 声明式事物
查看>>
fhs-framework jetcache 缓存维护之自动清除缓存
查看>>
SpringBoot 动态编译 JAVA class 解决 jar in jar 的依赖问题
查看>>
fhs-framework springboot mybatis 解决表关联查询问题的关键方案-翻译服务
查看>>
ZUUL2 使用场景
查看>>
Spring AOP + Redis + 注解实现redis 分布式锁
查看>>
elastic-job 和springboot 集成干货
查看>>