WINDOWS高级窗口的客户区域拖动技术及其应用(2) 2、在非特定客户区域检测鼠标命令的方法 当窗口应用程序中采取了非特定客户区域拖动方法时,必须在资源文件中事先确定各个特定客户区域的矩形坐标,这时非特定客户区域是不规则的区域,它需要根据实际的应用程序窗口及各个命令按钮矩形区域来确定,也就是各个命令按钮相对于窗口矩形区域的“非”子集。窗口函数在处理鼠标消息WM_LBUTTONDOWN时,首先利用函数PtInRect()判断当前鼠标指针是否点击在各个命令按钮矩形区域内,如果未点击在任何命令按钮区域内,则可确定鼠标点击在非特定客户区域内,从而实现窗口拖动功能的启动。其描述性功能代码示例如下: case WM_LBUTTONDOWN: //鼠标光标点击处理 POINT pt; //定义鼠标在屏幕上的位置指针 pt=MAKEPOINT(lParam); //取得鼠标光标当前位置指针 for(I=0;I if(PtInRect(&DragRT[I],pt)){//DragRT[I]为按钮矩形数组 break; //鼠标点击在其它按钮上中断 } } if(I //鼠标点击在其它特定客户区域内则处理其它按钮功能 }else{ //鼠标点击在非客户区域内则完成窗口拖动方案的启动 } break; 3、窗口拖动功能的鼠标光标动态提示方法 在无标题条常居顶层高级窗口应用程序中,既可以采用将特定客户区域作为拖动命令按钮的方法,也可以采取在非特定客户区域检测窗口拖动命令的方法,或者两种方法兼顾使用。在使用第一种方法时,可以在命令按钮中用特定的图标或文字来提示用户该命令按钮的功能,而后一种方法由于矩形区域无法确定不可能用图标或文字来提示,或根本无法显示图标和文字(如非特定客户区域为窗口边界区域等),用户根本无法知道非特定客户区域具有拖动窗口功能,这时唯有充分利用鼠标光标的动态提示功能,就象WINDOWS 普通窗口中鼠标光标停在窗口边框上时鼠标光标变成双箭头形状来提示用户此时可以改变窗口大小那样,这个功能在高级窗口界面设计中非常重要。 实现鼠标光标动态提示功能前需要定制鼠标光标形状,窗口拖动功能的动态提示光标形状一般为四箭头图案,这可以利用微软公司的SDK、FPT3.0和VC++4.1等高级开发软件中的资源编辑器"IMAGE EDIT"等来实现。光标资源文件一般为32X32的2色或16色.CUR图形文件,可根据实现的功能来具体确定光标图案或直接使用WINDOWS 系统中提供的光标资源文件,当自己利用资源编辑器绘制光标图案后,还需要利用DEBUG. EXE程序修改光标资源文件中的鼠标光标显示偏移坐标,以便光标图案能象WINDOWS 系统中的动态提示光标一样,动态提示时光标图案中心点正好处于屏幕的当前位置。这个偏移坐标值位于光示资源文件中的10和12处的双字节位置,如动态提示光标资源文件名为MOUSEM.CUR,要使32X32(2色)的光标图形显示时图案的中心点正好处于当前屏幕位置,其修改方法如下: C>DEBUG MOUSEM.CUR -E 10A XXXX:10A 00.10 00.00 00.10 00.00 -W 建立起自己的鼠标光标资源文件后,首先需要在应用程序的资源文件中定义鼠标光标,资源文件中的定义方法为: imecurm CURSOR mousem.cur 鼠标光标资源文件只有在定义之后,才能在应用程序中利用LoadCursor()函数调入内存使用,其调用方法为: HCURSOR hCurm;//将鼠标光标资源文件数据调入内存 hCurm=LoadCursor(hInstance,"imecurm"); 当需要动态改变鼠标光标形状的客户区域为整个窗口或某个子窗口的全部客户区域时,在注册客户应用程序窗口类时定义相应的鼠标光标资源句柄,当鼠标光标移到相应窗口内时立刻变成定制的光标形状,移出相应窗口时自动恢复原来光标形状。实现鼠标光标这一动态提示功能的定义方法如下: wc.hCursor=hCurm;