클리핑 영역 정의
사용자가 클립 영역 정의를 클릭하면 시스템에서 WM_COMMAND 메시지를 실행합니다. 이 메시지의 wParam 매개 변수에는 사용자가 메뉴에서 이 옵션을 선택했음을 나타내는 애플리케이션 정의 상수 IDM_DEFINE 포함되어 있습니다. 애플리케이션은 다음 코드 샘플과 같이 부울 플래그 fDefineRegion을 설정하여 이 입력을 처리합니다.
case WM_COMMAND:
switch (wParam)
{
case IDM_DEFINE:
fDefineRegion = TRUE;
break;
클리핑 영역 정의를 클릭하면 커서가 애플리케이션의 클라이언트 영역에 있는 동안 마우스를 클릭하고 끌어 사각형을 그릴 수 있습니다.
사용자가 왼쪽 단추를 누르면 시스템에서 WM_LBUTTONDOWN 메시지를 실행합니다. 이 메시지의 lParam 매개 변수에는 클리핑 영역을 정의하는 데 사용되는 사각형의 왼쪽 위 모서리에 해당하는 커서 좌표가 포함되어 있습니다. 애플리케이션은 다음과 같이 WM_LBUTTONDOWN 메시지를 처리합니다.
// 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;
}
사용자가 마우스를 끌면 시스템에서 WM_MOUSEMOVE 메시지를 실행하고 lParam 매개 변수에 새 커서 좌표를 저장합니다. 애플리케이션이 새 WM_MOUSEMOVE 메시지를 받을 때마다 이전 사각형(있는 경우)을 지우고 Polyline 함수를 호출하여 사각형의 네 모서리 좌표를 전달하여 새 사각형을 그립니다. 애플리케이션은 다음 작업을 수행합니다.
// 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;