WIN32用户界面设计基础之Cursor篇(转)

来源:互联网 发布:日本网络制式 编辑:程序博客网 时间:2024/05/16 14:16

一、 标准鼠标替换
  Windows提供了一系列标准鼠标,其标示前缀均为IDC_,用SetSystemCursor()函数可以替换系统的标准鼠标。SetSystemCusor()有两个参数,第一个为一个通过LoadCursor()(LoadCursor()函数以被LoadImage()函数取代)、CreateCursor()或CopyCursor()获得的Cursor指针。例如:
  
  HCURSOR hnewCur;
  hnewCur=LoadCursor(hInst,MAKEINTRESOURCE(NEWCURSOR);NEWCURSOR为hInst中的一个Cursor,
  SetSystemCursor(hnewCur,OCR_NORMAL);使用用户定义鼠标替换系统默认鼠标,当用户再次使用LoadCursor(NULL,IDC_ARROW);加载标准鼠标时获得的将是用户加载的而非系统预定义的鼠标
  二、 更换Cursor的方法
  1、 新建Cursor
  此方法最为烦琐,但用户拥有完全的控制权,比如可以自主设立HotSpot的位置,而不是默认的左上角,具体方法是先填写一个ICONINFO结构:
  
  typedef struct ICONINFO {
  BOOL fIcon; 是否为图标,将其赋值为FALSE,标示该结构用来建立鼠标
  DWORD xHotspot; HotSpot的X坐标
  DWORD yHotspot; HotSpot的Y坐标
  HBITMAP hbmMask; 鼠标外观的掩模图,用来过滤鼠标的背景
  HBITMAP hbmColor; 鼠标外观图片
  } ICONINFO;
  填写好后调用CreateIconIndirect()得到一个HICON句柄,如果你建立的是鼠标,将其转换成HCURSOR即可,例如:
  
  ICONINFO ii;
  HCURSOR hnewCur;
  ii.fIcon=FALSE;
  ii.yHotspot=0;
  ii.yHotspot=0;
  ii.hbmMask=LoadBitmap(hInst,MAKEINTRESOURCE(IDBCURSORMASK));
  ii.hbmColor=LoadBitmap(hInst,MAKEINTRESOURCE(IDB_CURSOR));
  hnewCur=(HCURSOR)CreateIconIndirect(&ii);
  2、 加载Cursor
  加载是最常用的方法,被加载的鼠标可以是VC集成开发环境中设计好的Cursor,也可以是.ANI或.Cur文件。
  1) 从文件中加载:
  
  LoadCursorFromFile();例如:LoadCursorFromFile("C://AniCur.ANI")加载一个动画鼠标。
  2) 从集成开发环境中加载:
  LoadCursor(hInst,MAKEINTRESOURCE(NEWCURSOR));NEWCURSOR可以在资源编辑器中设计。还要说明的是LoadImage()是较LoadCursor()、LoadBitmap()和LoadCursorFromFile()更新的函数,它集多个函数的功能于一身,用起来更加方便,主要的区别在于其多了一个标志来说明加载的是位图、图标函数鼠标。
  3、 使用Cursor
  1) SetCursor()
  捕获窗口的WM_MOUSEMOVE或者WM_SETCURSOR消息,在其处理函数中添加对SetCursor()的调用,例如:
  SetCursor(hnewCur);其中hnewCur为一个通过上述的任意一种方法获得的HCURSOR
  2) SetClassLong()
  捕获WM_MOUSEMOVE消息只对有窗口函数的窗口有效,而对像Button控件则无法使用。应当使用setClassLong()函数替换Button类的鼠标,例如:
  
  HWND hbutton;
  HCURSOR hnewCur;
  hnewCur=LoadCursorFromFile("C://WINNT//Cursors//AnimCur.ANI");
  hbutton=(HWND)GetDlgItem(IDC_BUTTON);//IDC_BUTTON为要改变鼠标的控件ID
  SetClassLong(hbutton,GCL_HCURSOR,(long)hnewCur);
  3) RegisterClass()或RegisterClassEx()函数
  这是最麻烦的方法,但是可以作用于属于同一个窗口类的所有窗口。在RegisterClass()或RegisterClassEx()之前,填写WNDCLASS时,将一个自定义的Cursor句柄赋值给hCursor,例如
  WNDCLASSEX wcx;
  
  wcx.hCursor=LoadCursor(hInst,MAKEINTRESOURCE(NEWCUR));
  4、 鼠标操作函数
  1) 剪切鼠标,限制鼠标移动
  ClipCursor()函数用来剪切鼠标,参数为一个指向RECT的指针,在通常情况下鼠标被剪切于整个屏幕,如果一个程序的某个窗口要剪切鼠标,必须先用GetClipCursor()获得屏幕的鼠标剪切区域,然后用ClipCursor()剪切鼠标至程序窗口,程序退出后必须将鼠标的剪切区域还原成屏幕矩形,以免影响其他的程序使用鼠标。假设我们想将鼠标限制在窗口hwnd内,应当:
  
  RECT rt1;//存放屏幕剪切矩形
  RECT rt2;//存放程序窗口剪切矩形
  GetClipCursor(&rt1);//获得当前的鼠标剪切矩形填写入rt1,如果鼠标没有被别的程序剪切,那么整个矩形就是屏幕矩形
  GetWindowRect(hwnd,&rt2);//获得程序窗口hwnd的矩形至rt2
  ClipCursor(&rt2);//剪切鼠标之rt2
  程序执行完成后应当:
  ClipCursor(&rt1);//将鼠标的剪切矩形还原为rt1(屏幕)
  2) 跟踪鼠标位置
  GetCursorPos()用来获得当前鼠标位置,SetCursorPos()设置鼠标位置,例如:
  
  POINT pt;//存放鼠标位置的结构
  GetCursorPos(&pt1);//获得当前鼠标位置
  SetCursorPos(pt.x+100,pt.y+100);//根据原位置计算得到新位置

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 怀孕8个月牙痛怎么办 孕晚期上火牙疼怎么办 怀孕了牙疼怎么办啊 孕晚期牙疼怎么办妙招 孕晚期牙疼上火怎么办 孕晚期智齿牙疼怎么办 牙齿张智齿很痛怎么办 30岁长智齿牙疼怎么办 我长智齿牙龈痛怎么办 出智齿引起牙龈肿痛怎么办 要长智齿牙肉痛怎么办 牙齿肿了有脓包怎么办 牙肉发炎有脓包怎么办 拔智齿伤了神经怎么办 牙下面的肉疼该怎么办 后面牙突然好疼怎么办 拔智齿后的牙洞怎么办 换牙期牙齿长歪怎么办 小孩子牙齿长歪了怎么办 换牙门牙长歪了怎么办 宝宝牙齿长歪了怎么办 小孩的牙齿长歪了怎么办 婴儿门牙长歪了怎么办 牙齿掉了好几颗怎么办 第二磨牙长歪了怎么办 第二乳磨牙坏了怎么办 小孩牙齿都坏了怎么办 第二乳磨牙蛀了怎么办 门牙烂了个洞怎么办 门牙掉了两颗怎么办 牙坏了不能补了怎么办 牙从里面坏了怎么办 百度云容量满了怎么办 mp3连接不上电脑怎么办 深户离职后社保怎么办 依云喷雾过敏了怎么办 阿里云邮箱满了怎么办 苹果手机ic坏了怎么办 王者队友不给力怎么办 协同大作战出bug怎么办 耳朵一个大一个小怎么办