在Windows应用程序中动态控制鼠标光标

Author: 杜蕴杰 Date: 1997-01-01

  在Windows下的客户应用程序中,如果能够实现动态改变不同区域内鼠标光标的外观形状,不仅可以使应用程序动感美观,还能起到操作向导作用。这里笔者将自己在实际应用程序开发过程中处理动态鼠标光标的一些编程技术和基本方法介绍给大家供参考。
#2  一、建立自己的鼠标光标资源
  正常情况下的Windows鼠标光标形状为向左上角的单箭头符号,根据应用程序不同客户区域的需要,用户可以自己设置几种鼠标光标形状,常见的有手形、不同方面的箭头、立体箭头和笔式等。中文Windows 95下的鼠标光标形状比较丰富,在“\Windows\CURSORS”目录下存放,此外,用户完全可以利用Windows下的中文SDK 3.1、VFP 3.0和DELPHI 2.0中的“IMAGE EDITOR”等资源编辑器创建自己的鼠标光标资源文件.CUR。
#2  二、鼠标光标资源的定义与调用
  建立起自己的鼠标光标资源文件后,需要先在应用程序的资源文件中定义,假设鼠标光标资源文件名为MOUSE.CUR和MOUSEM.CUR,在资源文件中的定义方法如下:
  imecurh CURSOR mouse.cur
  imecurm CURSOR mousem.cur
  然后在应用程序中利用LoadCursor()函数调入内存后才能作用,其调用方法如下:
  HCURSOR hCurh;∥定义鼠标资源句柄
  HCURSOR HCurm;∥将鼠标光标数据调入内存
  hCurh=LoadCursor(hInstance,"imecurh");
  hCurm=LoadCursor(hInstance,"imecurm");
#2  三、动态鼠标光标的全局注册方法
  如果要鼠标光标移动到客户应用程序的窗口内后,立刻变成定制的形状,只需在注册客户应用程序窗口类时定义相应的鼠标光标资源即句柄。一般定义方法如下:
  wc.hCursor=LoadCursor(NULL,IDC-ARROW);
  但要在窗口内将鼠标光标变成特定的形状,必须用下述方法定义光标句柄,然后注册窗口类:
  wc.hCursor=hCurh;
#3  这样定制的全局性鼠标光标具有如下特点:
  只要鼠标光标移入该客户应用程序的窗口内,光标形状立刻变成定制的形状,鼠标光标移动平滑快速,无抖动等不良现象。
#2  四、特定客户区域内的动态鼠标光标的实现
  我们以UCWIN 3.1下的特殊符号软键盘为例:当鼠标光标移动到软键盘窗口内的按键位置时光标形状为手形,当移动到非按键位置时光标为上下左右四箭头形状。要实现这种功能,应按如下操作步骤编制:
  首先将手形光标按上述方法设置为全局性的动态鼠标光标:wc.hCursor=hcurh;
  然后注册相应窗口的窗口类,在该窗口函数中对WM-MOUSEMOVE消息进行如下处理:
  1.获取鼠标光标的屏幕位置;
  2.如果鼠标光标在特定区域内,则设置相应光标形状和标志;
  3.如果鼠标光标移出特定位置则清除标志并恢复原来光标形状;
  POINT pr;
  RECT rt;
  BOOL iFlag;
  case WM-MOUSEMOVE:
  pt=MAKEPOINT(1Param);∥光标位置
  if(PtInRect(&rt,pt)){∥在特定区域设置鼠标光标
  iFlag=TRUE;                      
  SetCursor(hCurm);
  }else if(iFlag==TRUE){
  iFlag=FALSE;
  SetCursor(hCurh);}break;
  这种动态鼠标光标虽然有略微的抖动,但由于一般情况下的特定客户区域都比较小,所以这种现象也并不明显,完全可以满足需要。如果存在多个特定区域需要不同形状的鼠标光标,只需建立多个用户光标资源文件,并进行多个特定区域判断即可,有兴趣的读者可以自行扩充。