LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
HDC hdc;
// 좌표를 지속적으로 저장해 두기 위해 static
static int x;
//-> static short x;
static int y;
//-> static short y;
static BOOL bNowDraw = FALSE; // 마우스 클릭중에만 그리기 작업이 진행되므로 작업여부를 확인
switch (iMessage) {
case WM_LBUTTONDOWN:
SetCapture(hWnd); // 그리기 작업이 시작되는 시점부터 마우스 이벤트를 받도록해서 윈도우 밖으로 빠져나가도, 마우스의 메시지를 모두 받을수 있음. = 작업영역을 벗어나도, 마우스의 메시지를 받을 수 있음.,
// 마우스 좌표 입력받음. 그리기 시작.
x=LOWORD(lParam);
y=HIWORD(lParam);
bNowDraw=TRUE;
return 0;
case WM_MOUSEMOVE:
if (bNowDraw==TRUE) {
hdc=GetDC(hWnd);
MoveToEx(hdc,x,y,NULL); // 클릭했던 자리(LBUTTONDOWN에서 찍은 좌표) 로 CP 이동
// 이동한 자리의 좌표 위치 갱신. [ 수정 ]
x=LOWORD(lParam); // GET_X_LPARAM(lParam)
y=HIWORD(lParam); // GET_Y_LPARAM(lParam) // 다중모니터 사용시 LOWORD, HIWORD로는 좌표값을 재대로 받지 못할수 있음. // MSDN : https://msdn.microsoft.com/ko-kr/library/windows/desktop/ms645610(v=vs.85).aspx
LineTo(hdc,x,y); // CP에서 이동한 자리 좌표까지 선 긋기
ReleaseDC(hWnd,hdc);
}
return 0;
case WM_LBUTTONUP:
ReleaseCapture(); // 마우스를 땠을때 마우스 메시지를 받는 작업을 종료 함.
// ** SetCapture 후에는 반드시 ReleaseCapture() 할 것!
bNowDraw=FALSE; // 마우스 버튼 때기 :: 그리기 종료
return 0;
case WM_LBUTTONDBLCLK: // 더블 클릭시 (옵션 메시지 = sytle 에서 지정을 해줘야 사용가능. CS_DBLCLKS)
InvalidateRect(hWnd, NULL, TRUE);
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}
/*
마우스 버튼을 누른채로 윈도우(창) 밖을 나갔다가 들어오면 계속 그려진다.
마우스 버튼을 땟을 땐(WM_LBUTTONUP) 윈도우(창)의 작업영역 밖에서 실행되었기때문에 WM_LBUTTONUP 메시지는 OS가 처리 해버림.
WM_LBUTTONUP 메시지를 입력받지 못한 상태이기 때문에, 다시 윈도우(창) 로 이동했을 땐 계속 그려짐.
(우린 메시지를 WM_LBUTTONUP 메시지를 입력받지 않은 상태임)
SetCapture(HWND hWnd); - ReleaseCapture();
마우스가 작업영역을 벗어나도 지속적으로 마우스 메시지를 받아야 할 때 사용한다.
SetCapture 를 추가해서 넣고 실행하면 이번엔 세로줄이 길게 그어지는 현상이 발생한다.
작업영역 기준으로 x,y 좌표를 벗어나 - 값이 되면서, 문제가 발생하게 된다.
이부분은 좌표가 bit 저장되는 방식에 대한 이해가 필요하다.
*/
|