欢迎来到天天文库
浏览记录
ID:15797892
大小:53.50 KB
页数:22页
时间:2018-08-05
《windows窗口的客户区域拖动技术及其应用》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、WINDOWS窗口的客户区域拖动技术及其应用WINDOWS应用程序窗口一般包括两种:普通窗口和常居顶层的无标题条高级窗口。前者是由WINDOWS内部功能定制的,它具有WINDOWS应用程序窗口的所有普通特性:具有标题条、窗口边框、最大化按钮、最小化按钮和系统默认的快捷键及鼠标支持功能等,利用鼠标左键拖动该种窗口的标题条可以在屏幕上任意移动窗口,当鼠标光标停在窗口边框上时可以改变窗口大小;后者是一种定制的高级窗口,它不具有普通窗口的任何属性,整个窗口的控制必须由编程者来一一确定,使用这种窗口的典型实例有WINDOWS中的IME输入法应用程序、UCWIN4.0平台、各种浮动工具箱、
2、OFFICE中的桌面工具栏和第三方开发的汉字输入平台等。 WINDOWS这种无标题条常居顶层高级窗口的一个显著特点是,不需改变窗口大小但必须具有窗口的客户区域拖动功能。由于普通窗口的拖动功能是由系统来完成的,编制普通的应用程序根据无须考虑客户区域拖动问题,因此一般编程人员很难遇到这个问题,更谈不上如何实现这一功能了。开发者往往希望自己开发出来的软件具有经典软件中的窗口客户区域拖动功能,笔者曾经利用模仿系统鼠标点击标题条拖动窗口和WINDOWS系统内部提供的API发送函数发送内部拖动命令来实现无标题常居顶层高级窗口的客户拖动功能,结果都不理想。后来只好在窗口函数中通过直接处理W
3、M_LBUTTONDOWN、WM_MOUSEMOVE和WM_LBUTTONUP消息,自行控制窗口拖动的客户命令区、拖动开始、窗口移动、拖动虚框绘制、虚框移动和拖动结束等过程,来实现高级顶层窗口的客户区域拖动方案。下面就自己实践经验详细介绍实现该方案的具体方法和主要技巧。 一、WINDOWS检测客户拖动命令及鼠标光标动态提示的实现方法 WINDOWS无标题条常居顶层高级窗口的客户区域一般分为两种:特定客户命令区域和非特定客户命令区域。特定客户命令区域是指利用"RECT"定义的特定子矩形区域,窗口函数对发生在该区域内的鼠标命令进行检测并处理;非特定客户命令区域是指没有明确定义的
4、窗口客户区域部分,即所有特定客户命令区域之外的部分,窗口函数根据实际需要来确定是否对该区域内发生的鼠标命令进行处理。实现常居顶层高级窗口拖动功能的首要问题,是如何检测和处理特定客户命令区域和非特定客户命令区域内的鼠标命令,以及如何利用鼠标光标来动态提示用户此时可以进行窗口的拖动操作。 1、在特定客户区域检测鼠标命令的方法 当窗口中设置了实现拖动功能的图标命令按钮时,就必须在资源文件中定义命令按钮的特定客户区域,该区域一般也就是显示命令按钮中图标的矩形区域,这个区域的定义方法为"RECTDragRT",其中DragRT为定义的检测鼠标命令矩形区域,它用DragRT.LEFT、
5、DragRT.TOP、DragRT.RIGHT和DragRT.BOTTOM四个参数来描述矩形区域相对于窗口客户区域左上角的相对坐标值,这四个参数必须事先定义具体的数值,也可以利用"SETRECT"函数直接填充。 窗口函数在处理鼠标消息WM_LBUTTONDOWN时,在接收系统传递的鼠标位置参数lParam后,通过MAKEPOINT()函数将其转换为窗口坐标值,利用判断某坐标点是否位于特定矩形区域内的函数PtInRect(),就可以判断鼠标指针是否点击在拖动命令按钮之内,从而完成窗口拖动功能的启动任务。其描述性功能代码示例如下: caseWM_LBUTTONDOWN://鼠标
6、光标点击处理 POINTpt;//鼠标在屏幕上位置指针,包括pt.X和pt.Y两个参数, //该指针值利用MAKEPOINT通过lParam参数转换而来 pt=MAKEPOINT(lParam);//获取鼠标当前屏幕位置指针 if(PtInRect(&DragRT,pt)){//判断鼠标是否点击在拖动按钮内 //实现鼠标拖动窗口方案的启动功能 }else{ //进行其它特定或非特定命令客户区域判断处理 } break; 2、在非特定客户区域检测鼠标命令的方法 当窗口应用程序中采取了非特定客户区域拖动方法时,必须在资源文件中事先确定各个特定客户区域的矩形坐标
7、,这时非特定客户区域是不规则的区域,它需要根据实际的应用程序窗口及各个命令按钮矩形区域来确定,也就是各个命令按钮相对于窗口矩形区域的“非”子集。窗口函数在处理鼠标消息WM_LBUTTONDOWN时,首先利用函数PtInRect()判断当前鼠标指针是否点击在各个命令按钮矩形区域内,如果未点击在任何命令按钮区域内,则可确定鼠标点击在非特定客户区域内,从而实现窗口拖动功能的启动。其描述性功能代码示例如下: caseWM_LBUTTONDOWN://鼠标光标点击处理 POINTpt;//定义鼠标
此文档下载收益归作者所有