본문 바로가기
C/C++/API

2007.07.27 API Mouse입력

by 꿀꿀이냐옹이 2009. 7. 27.
반응형

  Mouse
-------------------------------------------------------------------------
버튼     누름                             놓음                          더블클릭
-------------------------------------------------------------------------
좌측     WM_LBUTTONDOWN       WM_LBUTTONUP       WM_LBUTTONDBLCLK 
우측     WM_RBUTTONDOWN       WM_RBUTTONUP       WM_RBUTTONDBLCLK 
중앙     WM_MBUTTONDOWN      WM_MBUTTONUP      WM_MBUTTONDBLCLK 
-------------------------------------------------------------------------
마우스 입력에 관한 메시지는 버튼 세 개에 각각 누름, 놓음, 더블 클릭의 9가지 메시지가 있다.
이 중 중앙 버튼은 실질적으로 거의 사용되지 않으며 주로 왼쪽 버튼의 메시지가 많이 사용된다.
마우스 메시지는 lParam의 상위 워드에 마우스 버튼이 눌러진 y좌표, 하위 워드에 x좌표를 가지며
좌표값을 검출해 내기 위해 HIWORD, LOWORD 등의 매크로 함수를 사용한다. 즉 마우스 메시지가
발생한 위치의 좌표는 (LOWORD(lParam), HIWORD(lParam))이 된다.

               ---------------------------------------------
lParam     :             Y               :               X                  :
               ---------------------------------------------
                             =                               =
                   HIWORD(lParam)         LOWORD(lParam)
       
wParam에는 마우스 버튼의 상태와 키보드 조합 키(Shift, Ctrl)의 상태가 전달된다.
조합키 상태는 다음 값들과 비트 연산을 해보면 알 수 있다.

-----------------------------------------------------
값                     설명
-----------------------------------------------------
MK_CONTROL    Ctrl 키가 눌러져 있다.
MK_LBUTTON     마우스 왼쪽 버튼이 눌러저 있다.
MK_RBUTTON     마우스 오른쪽 버튼이 눌러저 있다.
MK_MBUTTON    마우스 중간버튼이 눌려저 있다.
MK_SHIFT          Shift 키가 눌러져 있다.
-----------------------------------------------------
마우스 키의 누름 메시지 외에 마우스가 이동할 때마다 전달되는 WM_MOUSEMOVE 메시지가 있다.
이 메시지도 다른 마우스 메시지와 마찬가지로 lParam에 마우스 커서의 위치가 전달되며 wParam에
조합키 상태가 전달된다.

<코드>
 HDC hdc;
 static int x;
 static int y;     //x,y의 좌표값
 static BOOL bNowDraw=FALSE;  //마우스가 클릭되지 않은 상태로 초기화
 
 switch(iMessage)
 {
 
 case WM_DESTROY: PostQuitMessage(0);    
  return 0;

 case WM_LBUTTONDOWN:
  x=LOWORD(lParam);
  y=HIWORD(lParam);
  bNowDraw=TRUE;     //왼쪽버튼  클릭 메시지로 TRUE값으로 설정
  return 0;

 case WM_MOUSEMOVE:
  if(bNowDraw==TRUE)
  {
   hdc=GetDC(hWnd);
   MoveToEx(hdc,x,y,NULL);
   x=LOWORD(lParam);
   y=HIWORD(lParam);
   LineTo(hdc,x,y);
   ReleaseDC(hWnd,hdc);

  }
  return 0;

 case WM_LBUTTONUP:
  bNowDraw=FALSE;
  return 0;

  

반응형

'C/C++ > API' 카테고리의 다른 글

API TransparentBlt()함수  (0) 2009.08.05
2009.07.27 API TIMER  (0) 2009.07.27
2009.07.27 API KEY입력  (0) 2009.07.27
2009.07.27 API도형그리기  (0) 2009.07.27
API기본 함수  (0) 2009.07.27

댓글