当用户选择“定义剪辑区域”选项时,Windows将发出WM_COMMAND消息。该消息的【wParam中】参数包含应用程序定义的常量IDM_DEFINE,表示用户从菜单中选择了该选项。应用程序通过设置布尔标志fDefineRegion处理此输入,如以下代码示例所示。
case WM_COMMAND:
开关(wParam){
case IDM_DEFINE:
fDefineRegion = TRUE;
break;
选择“定义剪切区域”选项后,用户可以通过在光标位于应用程序的客户区域中单击并拖动鼠标来开始绘制矩形。
当用户按下左按钮时,Windows会发出WM_LBUTTONDOWN消息。该消息的【lParam的】参数包含光标坐标,它对应于用于定义裁剪区域的矩形的左上角。应用程序处理WM_LBUTTONDOWN消息,如下所示。
/ *这些变量是剪切所必需的。*/
static POINT ptUpperLeft;
static POINT ptLowerRight;
static POINT aptRect[5];
static POINT ptTmp;
static POINTS ptsTmp;
static BOOL fDefineRegion;
static BOOL fRegionExists;
static HRGN hrgn;
static RECT rctTmp;
int i;
switch(message){
case WM_LBUTTONDOWN:
if(fDefineRegion){
/ *检索新的左上角。*/
ptsTmp = MAKEPOINTS(lParam);
ptUpperLeft.x = (LONG) ptsTmp.x;
ptUpperLeft.y = (LONG) ptsTmp.y;
}
如果(fRegionExists){it
/ *擦除上一个矩形。*/
hdc = GetDC(hwnd);
SetROP2(hdc, R2_NOTXORPEN);
if(!Polyline(hdc,(CONST POINT *)aptRect,5))
errhandler("Polyline Failed", hwnd);
ReleaseDC(hwnd, hdc);
/ *清除矩形坐标。*/
for (i = 0; i < 4; i++) {
aptRect[i].x = 0;
aptRect[i].y = 0;
}
/ *清除临时点结构。*/
ptTmp.x = 0;
ptTmp.y = 0;
/ *清除右下坐标。*/
ptLowerRight.x = 0;
ptLowerRight.y = 0;
/ *复位标志。*/
fRegionExists = FALSE;
fDefineRegion = TRUE;
/ *检索新的左上角。*/
ptsTmp = MAKEPOINTS(lParam);
ptUpperLeft.x = (LONG) ptsTmp.x;
ptUpperLeft.y = (LONG) ptsTmp.y;
}
break;
当用户拖动鼠标时,Windows会发出WM_MOUSEMOVE消息,并将新的光标坐标存储在【lParam的】参数中。每次应用程序接收到新的WM_MOUSEMOVE消息时,它将擦除上一个矩形(如果存在),并通过调用折线函数绘制新的矩形,并传递矩形的四个角的坐标。应用程序执行以下任务。
/ *这些变量是剪切所必需的。*/
static POINT ptUpperLeft;
static POINT ptLowerRight;
static POINT aptRect[5];
static POINT ptTmp;
static POINTS ptsTmp;
static BOOL fDefineRegion;
static BOOL fRegionExists;
static HRGN hrgn;
static RECT rctTmp;
int i;
switch(message){
case WM_MOUSEMOVE:
if(wParam & MK_LBUTTON & & fDefineRegion){
/ *获取窗口DC。*/
hdc = GetDC(hwnd);
if(!SetROP2(hdc,R2_NOTXORPEN))
errhandler("SetROP2 Failed", hwnd);
/*
*如果以前的鼠标移动发生,存储原稿
*临时结构中的右下角坐标。
*/
if(ptLowerRight.x){
ptTmp.x = ptLowerRight.x;
ptTmp.y = ptLowerRight.y;
}
/*
*获取剪切区域的较低坐标
* 右上角。
*/
ptsTmp = MAKEPOINTS(lParam);
ptLowerRight.x = (LONG) ptsTmp.x;
ptLowerRight.y = (LONG) ptsTmp.y;
/*
*如果以前的鼠标移动发生,请擦除原稿
* 长方形。
*/
if(ptTmp.x){
aptRect[0].x = ptUpperLeft.x;
aptRect[0].y = ptUpperLeft.y;
aptRect[1].x = ptTmp.x;
aptRect[1].y = ptUpperLeft.y;
aptRect[2].x = ptTmp.x;
aptRect[2].y = ptTmp.y;
aptRect[3].x = ptUpperLeft.x;
aptRect[3].y = ptTmp.y;
aptRect[4].x = aptRect[0].x;
aptRect[4].y = aptRect[0].y;
if(!Polyline(hdc,(CONST POINT *)aptRect,5))
errhandler("Polyline Failed", hwnd);
}
aptRect[0].x = ptUpperLeft.x;
aptRect[0].y = ptUpperLeft.y;
aptRect[1].x = ptLowerRight.x;
aptRect[1].y = ptUpperLeft.y;
aptRect[2].x = ptLowerRight.x;
aptRect[2].y = ptLowerRight.y;
aptRect[3].x = ptUpperLeft.x;
aptRect[3].y = ptLowerRight.y;
aptRect[4].x = aptRect[0].x;
aptRect[4].y = aptRect[0].y;
if(!Polyline(hdc,(CONST POINT *)aptRect,5))
errhandler("Polyline Failed", hwnd);
ReleaseDC(hwnd, hdc);
}
break;