WINDOWS窗口的客户区域拖动技术及其应用
http://tech.ddvip.com 2006年03月31日 社区交流
本文详细介绍WINDOWS窗口的客户区域拖动技术及其应用
第二步,需要处理鼠标拖动窗口时的拖动框移动过程,这需要在窗口函数中进行WM_MOUSEMOVE消息处理。拖动框的移动包括上次显示拖动框的清除和本次拖动框的显示两步,由于拖动框绘制函数中对当前的绘制方式进行重新设置,异或方式使得只要重新在原屏幕坐标位置处调用一次该函数即可清除拖动框,因此,在鼠标拖动窗口移动过程中显示和清除拖动框只需要调用两次拖动框绘制函数即可。另外,拖动框在屏幕上位置的计算方法也非常简单,就是将当前取得的屏幕位置坐标值减去保存的前次屏幕位置坐标值所得鼠标移动偏移量,再用原来窗口屏幕左上角坐标值加上这个偏移量,就可以确定被拖动窗口和拖动框新的屏幕位置坐标值。其处理过程的描述性代码如下:
case WM_MOUSEMOVE:
DragMove((LPRECT)&WinRT,WinWT,WinHi,lParam,2);
//WinRT为窗口矩形区域,WinWT为窗口宽度,WinHI为窗口高度
} else {进行其它处理}
break;
鉴于高级窗口应用程序一般为多个子窗口,所以将拖动框移动处理过程单独编制成函数,并且对鼠标拖动窗口过程中,窗口不能完全位于屏幕可见区域之内进行了特殊处理,开发者可根据需要自行调整其位置,以便被拖动的窗口能够完全被显示于屏幕可视区域内,其拖动过程函数原形代码部分如下:
void DragMove(
LPRECT rcwin, //拖动框矩形区域
unsigned int wi, //被拖动窗口宽度
unsigned int hi, //被拖动窗口高度
LPARAM lParam, //鼠标位置指针
unsigned int kk) //拖动框边框宽度
{
DrawMoveRect(rcwin->left,rcwin->top,
rcwin->right,rcwin->bottom,kk);//清除上次画拖动框
rcwin->left+=LOWORD(lParam)-sImeG.oldmx;//计算窗口
rcwin->top+=HIWORD(lParam)-sImeG.oldmy; //新位置
sImeG.oldmx=LOWORD(lParam); //保存当前坐标值
sImeG.oldmy=HIWORD(lParam);
if (rcwin->left<0) rcwin->left=0;//对窗口超越屏幕
if (rcwin->left>sImeG.xScrWi-wi) //可视区域处理
rcwin->left=sImeG.xScrWi-wi;
ii=sImeG.yScrHi-hi-(sImeG.WinVer<0x35f ? 0:BOTOFF);
if (rcwin->top<0) rcwin->top=0; //对WIN95进行底部
if (rcwin->top>ii) rcwin->top=ii;//特殊保留处理
rcwin->right =rcwin->left+wi-1;
rcwin->bottom=rcwin->top+hi-1;
DrawMoveRect(rcwin->left,rcwin->top,
rcwin->right,rcwin->bottom,kk);//画新位置拖动框
}
责编:豆豆技术应用