手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>程序设计>C/C++>列表

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

来源:互联网 作者:西部数码 时间:2008-04-09
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!

  一、 标准鼠标替换

  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);//根据原位置计算得到新位置

文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

[打印] [关闭]
Google
相关文章
上一篇:VC 6.0下自制媒体播放器
下一篇:VisualC 多线程DAO处理
热点关注
IDC资讯 虚拟主机 域名注册 托管租用 vps主机 智能建站
网站运营 建站经验 策划盈利 搜索优化 网站推广 免费资源
网站联盟 联盟新闻 联盟介绍 联盟点评 网赚技巧
行业资讯 业界动态 搜索引擎 网络游戏 门户动态 电子商务 广告传媒
网络编程 Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术 Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷 Internet Explorer
网页制作 FrontPages Dreamweaver Javascript css photoshop fireworks Flash
程序设计 Java技术 C/C++ VB delphi
网络知识 网络协议 网络安全 网络管理 组网方案 Cisco技术
操作系统 Win2000 WinXP Win2003 Mac OS Linux FreeBSD
返回首页 |关于我们 | 联系我们 | 付款方式 | 创业联盟 | 价格总览 | 资讯中心 | 友情链接 | 网站地图 | 招贤纳士 | RSS