TODAY : / TOTAL :

120621_API :: MOUSE

  • Share this:
반응형

 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 저장되는 방식에 대한 이해가 필요하다. 
*/



lParam 에 저장되는 좌표 데이터의 BIT 저장 방식에 대한 이해.

위 코드에서
 static int x;
좌표를 int형을 받아오기 때문에, 아래 그림처럼, 좌표 데이터를 읽어올 때 문제가 발생한다.

static short x;

int 형을 short 형으로 변경하면 줄 그임 현상을 해결할 수 있다.










 




반응형

SEARCH

태그로 찾아보기