|
WINDOWS高级窗口的客户区域拖动技术及其应用(5) SelectObject(hDC,GetStockObject(NULL_BRUSH));//屏蔽画刷
SelectObject(hDC2,GetStockObject(WHITE_PEN));//选择画笔
for (k=0;k
xx1-=1;
xx2+=1;
yy1-=1;
yy2+=1;
MoveTo(hDC2,xx1,yy1);
LineTo(hDC2,xx2,yy1);
MoveTo(hDC2,xx1,yy1);
LineTo(hDC2,xx2,yy1);
}
SetROP2(hDC2,oldrop2); //恢复原来作图方式
ReleaseDC(NULL,hDC2); //释放设备描述符表
}
//函数3:利用画点函数实现不同图案的拖动虚框
void DrawMoveRect(int xx1,int yy1,int xx2,int yy2,int xy)
{ HDC hDC2;
int oldrop2,I,j,x1,x2,y1,y2;
hDC = GetDC(NULL); //取得全屏幕设备描述句柄
oldrop2= GetROP2(hDC); //取得原来屏幕画图方式
SetROP2(hDC,R2_XORPEN); //设置异或屏幕画图方式
SelectObject(hDC,GetStockObject(NULL_BRUSH));//屏蔽画刷
SelectObject(hDC2,GetStockObject(WHITE_PEN));//选择画笔
for (j=0;j
x1=xx1-j; //带注释部分为另一图案
x2=xx2+j;
y1=yy1-j;
y2=yy2+j;
for (I=x1;I
SetPixel(hdc,I,y1,RGB(255,0,0));
//if (I
for (I=y1;I
SetPixel(hdc,x2,I,RGB(255,0,0));
//if (I
for (I=x2;I>x1;I-=2)
SetPixel(hdc,I,y2,RGB(255,0,0));
//if (I>x1+2) SetPixel(hdc,I-1,y2-1,RGB(255,0,0));}
for (I=y2;I>y1;I-=2)
SetPixel(hdc,x1,I,RGB(255,0,0));
//if (I>y1+2) SetPixel(hdc,x1+1,I-1,RGB(255,0,0));}
}
SetROP2(hDC2,oldrop2); //恢复原来作图方式
ReleaseDC(NULL,hDC2); //释放设备描述符表
}
三、WINDOWS高级窗口客户区域拖动技术实现的“三步曲”
WINDOWS 高级窗口的客户区域拖动命令判断、拖动功能的鼠标光标动态提示和定制窗口拖动框函数之后,就需要实现整个拖动方案中的拖动过程启动、窗口拖动框移动和拖动结束处理的三步曲过程。于是必须在窗口函数中直接处理WM_LBUTTONDOWN、WM_MOUSEMOVE和WM_LBUTTONUP消息,来具体处理上述三个步骤中的细节问题。
第一步,在窗口函数中对鼠标点击消息WM_LBUTTONDOWN进行判断处理,以处理用户通过鼠标光标动态提示功能获取满足窗口拖动条件时,按下鼠标左键产生的启动拖动过程消息,其功能性代码如下:
POINT pt;
BOOL MoveFlag=FALSE;
case WM_LBUTTONDOWN:
pt = MAKEPOINT(lParam); //获取鼠标光标指针
if(PtInRect(&DragRT,pt)){//DragRT为拖动命令区域
DragBegin((LPRECT)&WinRT,lParam,hWnd,2);
|