|
WINDOWS高级窗口的客户区域拖动技术及其应用(3) 当鼠标光标需要在窗口的特定客户命令按钮区域内或非特定客户命令区域内进行动态提示时,就不能使用上述定义方法,必须在窗口函数处理WM_MOUSEMOVE消息时进行特殊处理:首先判断鼠标光标指针当前位置是否在拖动命令按钮或非特定客户区域内移动,如果鼠标指针位置满足拖动窗口功能区域的要求,则利用API函数SETCURSOR()改变鼠标光标图案,提示用户此时可以进行窗口拖动操作,并将鼠标输入控制权交给当前窗口,同时设置改变鼠标光标标志;当鼠标指针移出拖动窗口启动命令区域时,恢复原来鼠标光标图案同时释放鼠标输入焦点控制权,并清除鼠标光标动态提示标志单元。其功能性代码描述如下:
BOOL DragFlag; //动态提示光标标志
case WM_MOUSEMOVE: //鼠标光标移动处理
pt=MAKEPOINT(lParam); //鼠标光标当前位置指针
if(PtInRect(&DragRT,pt)){//鼠标指针在拖动命令区域内则
SetCursor(hCurm); //动态改变鼠标光标形状
SetCapture(hWnd); //将鼠标输入控制权交当前窗口
iFlag=TRUE; //设置鼠标光标形状改变标志
} else if(iFlag==TRUE){ //鼠标指针未在拖动命令区域内
SetCursor(LoadCursor(NULL,IDC_ARROW));//恢复原形状
ReleaseCapture() //释放鼠标输入控制权
iFlag=FALSE; //恢复鼠标光标形状改变标志
}
break;
二、WINDOWS高级窗口拖动方案中拖动框的客户定制方法
以上介绍了窗口拖动前鼠标光标位置检测及客户命令区域内拖动功能的鼠标光标动态提示方法,当用户通过鼠标光标动态提示功能取得满足拖动窗口条件时,通过点击鼠标左键来启动拖动方案,这时最关键的技术问题是鼠标拖动窗口移动过程中的拖动框显示与擦除功能实现。窗口拖动虚框就是在WINDOWS 整个屏幕区域内显示描述被拖动窗口大小的线框,它的大小需要根据被拖动窗口的矩形区域大小和实际需要来具体确定,一般情况下为被拖动窗口的矩形区域大小。
WINDOWS 系统中的绘图方法是通过显示设备描述表实现的,绘图操作需要占用一定的GDI 资源,系统为窗口、菜单、对话框、字体和各种绘图函数分配足够的GDI资源,WINDOWS 95中的GDI资源要比WINDOWS3.X中的GDI资源大得多。WINDOWS中有两种使用显示设备描述符表的方法:更新窗口显示客户区域和直接操作窗口显示客户区域。更新窗口显示客户区域是直接针对应用程序窗口矩形区域而言的,在窗口函数响应WM_PAINT消息时利用图形操作命令进行窗口更新处理:
InvalidateRect(hWnd,&WinRECT,TRUE);//WinRECT为要更新区域
UpdateWindow(hWnd);
窗口初始建立时默认更新窗口的全部区域,当要更新的矩形区域为NULL时表示更新窗口所有矩形区域。函数UpdateWindow()通知系统向要更新矩形区域的窗口发送WM_PAINT消息,窗口函数接收到WM_PAINT消息后首先利用BeginPaint()函数取得设备描述符表,然后利用图形命令直接对显示设备进行更新操作,最后利用EndPaint()函数通知系统更新操作结束。其描述性功能代码如下:
case WM_PAINT:
PAINTSTRUCT ps;
hdc=BeginPaint(hWnd,&ps);//取得设备描述符表
SetBkMode(hdc,OPAQUE); //设备更新方式
SetBkColor(hdc,0x00c0c0c0);
//更新矩形区域内图形操作
EndPaint(hWnd,&ps); //结束更新操作
break;
更新窗口矩形区域直接使用窗口类中定义的屏幕画刷,即使利用SelectObject()函数选择相应屏幕画刷也无效,而且更新矩形区域范围是通过InvalidateRect()函数累加的,由UpdateWindow()函数通知系统开始进行窗口更新操作,整个过程是由系统来调度的,因此使用这种方法无法实现窗口的拖动虚框绘制和实时操作。
|