Definieren der Beschneidungsregion
Wenn der Benutzer auf Clipregion definieren klickt, gibt das System eine WM_COMMAND Meldung aus. Der wParam-Parameter dieser Nachricht enthält eine anwendungsdefinierte Konstante, IDM_DEFINE, die angibt, dass der Benutzer diese Option im Menü ausgewählt hat. Die Anwendung verarbeitet diese Eingabe, indem sie das boolesche Flag fDefineRegion festlegt, wie im folgenden Codebeispiel gezeigt.
case WM_COMMAND:
switch (wParam)
{
case IDM_DEFINE:
fDefineRegion = TRUE;
break;
Nach dem Klicken auf Abschneidebereich definieren kann der Benutzer mit dem Zeichnen des Rechtecks beginnen, indem er auf die Maus klickt und zieht, während sich der Cursor im Clientbereich der Anwendung befindet.
Wenn der Benutzer die linke Schaltfläche drückt, gibt das System eine WM_LBUTTONDOWN-Nachricht aus. Der lParam-Parameter dieser Nachricht enthält die Cursorkoordinaten, die der oberen linken Ecke eines Rechtecks entsprechen, das zum Definieren des Abschneidebereichs verwendet wird. Die Anwendung verarbeitet die WM_LBUTTONDOWN-Nachricht wie folgt.
// These variables are required for clipping.
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)
{
// Retrieve the new upper left corner.
ptsTmp = MAKEPOINTS(lParam);
ptUpperLeft.x = (LONG) ptsTmp.x;
ptUpperLeft.y = (LONG) ptsTmp.y;
}
if (fRegionExists)
{
// Erase the previous rectangle.
hdc = GetDC(hwnd);
SetROP2(hdc, R2_NOTXORPEN);
if (!Polyline(hdc, (CONST POINT *) aptRect, 5))
errhandler("Polyline Failed", hwnd);
ReleaseDC(hwnd, hdc);
// Clear the rectangle coordinates.
for (i = 0; i < 4; i++)
{
aptRect[i].x = 0;
aptRect[i].y = 0;
}
// Clear the temporary point structure.
ptTmp.x = 0;
ptTmp.y = 0;
// Clear the lower right coordinates.
ptLowerRight.x = 0;
ptLowerRight.y = 0;
// Reset the flag.
fRegionExists = FALSE;
fDefineRegion = TRUE;
// Retrieve the new upper left corner.
ptsTmp = MAKEPOINTS(lParam);
ptUpperLeft.x = (LONG) ptsTmp.x;
ptUpperLeft.y = (LONG) ptsTmp.y;
}
break;
}
Wenn der Benutzer die Maus zieht, gibt das System WM_MOUSEMOVE Nachrichten aus und speichert die neuen Cursorkoordinaten im lParam-Parameter . Jedes Mal, wenn die Anwendung eine neue WM_MOUSEMOVE Nachricht empfängt, löscht sie das vorherige Rechteck (sofern vorhanden) und zeichnet das neue Rechteck, indem sie die Polyline-Funktion aufruft und ihr die Koordinaten der vier Ecken des Rechtecks übergibt. Die Anwendung führt die folgenden Aufgaben aus.
// These variables are required for clipping.
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)
{
// Get a window DC.
hdc = GetDC(hwnd);
if (!SetROP2(hdc, R2_NOTXORPEN))
errhandler("SetROP2 Failed", hwnd);
// If previous mouse movement occurred, store the original
// lower right corner coordinates in a temporary structure.
if (ptLowerRight.x)
{
ptTmp.x = ptLowerRight.x;
ptTmp.y = ptLowerRight.y;
}
// Get the new coordinates of the clipping region's lower
// right corner.
ptsTmp = MAKEPOINTS(lParam);
ptLowerRight.x = (LONG) ptsTmp.x;
ptLowerRight.y = (LONG) ptsTmp.y;
// If previous mouse movement occurred, erase the original
// rectangle.
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;