달력

10

« 2018/10 »

  •  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  •  
  •  
  •  

'마우스 입력'에 해당되는 글 2

  1. 2010.05.16 MFC-마우스입력( 드래그 & 드랍 )
  2. 2010.05.16 MFC-마우스 입력





마우스 입력을 활용하여, 드래그 & 드랍의 기능을 구현해 보자.

또한 마우스가 윈도우에서 벗어 났을 때 어떻게 확인 해야 할지에 대해서도 하나씩 알아 보자.

기본 적으로 드래그 & 드랍을 생성하기 위해서는,

3가지의 WM메시지가 필요 하다.( 마우스 왼쪽 버튼을 사용한다고 하였을 때 )

1. LBUTTONDOWN
2. MOUSEMOVE
3. LBUTTONUP

다음의 3가지 WM메시지를 메시지탭에서 추가한다.

기본적인 드래그 & 드랍의 구조는

마우스 왼쪽 버튼이 눌리면(LBUTTONDOWN) 그 위치에 있는 대상과 위치를 검사하여,
왼쪽 버튼이 눌려 있는 부분이 대상의 위치와 일치 한다면,
특정 플래그를 On(true)시키고,

마우스가 움직였을 때(MOUSEMOVE) 특정 플래그가 On(true)라면 마우스의 x,y위치를 대상의 x,y에 대입하면 된다.

그 후 왼쪽 버튼이 손에서 떨어지면(LBUTTONUP) 특정 플래그를 Off(false)로 변경한다.

그럼 이제 코드를 살펴 보자.




마지막으로 화면에 출력해 주어야 하기 때문에 WM_PAINT를 생성한다.
이게 가장 최소한의 드래그 & 드랍의 구조이다.
물론 m_ptItemText에 대해서 View 생성자에서 초기화를 한번 해 주어야 겠지만,
기본 적으로 0, 0 정도로 초기화 하면 실행했을 경우에 My Computer라는 Text가 화면에 띄워 지고,
마우스로 드래그 & 드랍이 가능할 것이다.


하지만 여기서 끝이 아니다.
기본적인 드래그 & 드랍의 구조는 구현이 되었지만, 마우스가 윈도우 화면을 벗어 나면 더이상 마우스의 좌표값을 가져 오지 못하여( LBUTTONDOWN, LBUTTONUP 또한 ) 드래그가 중지 되거나, 원치 않는 행동들을 하게 될 것이다.
이때 문제를 해결하기 위한 부분이.
SetCapture() 라는 함수를 사용하는 것인데,
이 함수는 마우스가 현재 윈도우에서 벗어 나더라도 계속 해서 마우스 메시지를 수신하도록 하게 한다.
그리고 그 수신 메시지를 종료 시키는 것이, ReleaseCapture()이다.

이제 이 함수를 사용해서 OnLButtonDown()과, OnLButtonUp()에 각각 SetCapture와 ReleaseCapture를 추가해주자.


여기 까지 완료 하였다면, 이제 마우스가 윈도우를 벗어나도 드래그하는 대상이 끝까지 따라 올 것이다.
하지만 실행 해 보면, 또 한가지 문제가 존재한다. 윈도우를 한번 벗어난 상태에서 마우스 버튼을 때면, 다시는 대상을 가져 올 수 없다는 것이다.

이럴 때를 위해 비록 마우스가 윈도우를 벗어 났다고 하더라도, 드래그 대상까지 화면을 벗어 나서는 안된다는 것을 알 수 있다.

OnLButtonUp에 대해서 한번더 코드를 수정하자.
이제 드래그 & 드랍에 대한 문제점은 모두 해결 된거 같다.
(만약 대상이 마우스를 따라 오다가, 화면 끝에 가면 멈추게 하고 싶다면 OnMouseMove()에 대해서도 위의 조건문을 추가해 주자.

// 실행 화면
드래그 & 드랍이 구현 되었다.

'프로그래밍 > MFC' 카테고리의 다른 글

MFC-마우스 입력( TRACKMOUSEEVENT )  (0) 2010.05.16
MFC-새로운 클래스 추가 하기  (0) 2010.05.16
MFC-마우스입력( 드래그 & 드랍 )  (0) 2010.05.16
MFC-마우스 입력  (0) 2010.05.16
MFC-GetKeyState()  (0) 2010.05.12
MFC-GetWindowRect(), ScreenToClient(), SetWindowPos()  (0) 2010.05.12
Posted by 안식의후크
2010.05.16 13:50

MFC-마우스 입력 프로그래밍/MFC2010.05.16 13:50





MFC에서 마우스 입력에 대해서 알아보자.

기존의 API의 WM_MOUSEMOVE라던가, WM_LBUTTONDOWN등을 mfc에서는 그대로 함수를 추가해 하면된다.

특별히 달라진건 존재 하지 않는거 같다.

예제를 통해서 하나씩 살펴보자.

View에서 WM_MOUSEMOVE를 추가 하게 되면 마우스가 이동할 때 마다

OnMouseMove() 함수에 들르게 된다.

UINT 타입의 nFlags와, CPoint를 인자로 받아 오게 되는데,

nFlags는 현재 마우스 입력( 버튼 클릭 )에 대해서

CPoint는 마우스의 X,Y좌표를 가지고 있다.



소스를 보면 nFlags를 비트연산(&)을 사용해 마우스 왼쪽 버튼이 눌렸는지 확인하고 있다.
마찬가지로 마우스 오른쪽 버튼도 눌렸는지 확인 하고 있다.

m_ptMouse는 View클래스에 존재하는 CPoint변수이다.
설명하자면 마우스 왼쪽 버튼과 오른쪽 버튼이 모두 눌려 있다면 현재 x,y좌표를 m_ptMouse 변수에 대입 한다고 볼 수 있다.
대입 후 RedrawWindow를 통해 윈도우의 화면을 갱신해 준다.
예상 대로라면 m_ptMouse는 마우스 오른쪽 버튼과 왼쪽 버튼이 눌린채로 이동하면 현재 x,y좌표를 지속적으로 갱신, 기억 할 것이다.

실행 결과는 잠깐 확인을 미루고, 다음으로
WM_MOUSEWHEEL을 추가해 보자.
OnMouseWheel()로 생성하면, OnMouseMove와 비슷한 인자값을 받아 오지만 중간에,
short zDelta를 추가로 받아 온다.
zDelta는 휠이 움직였을 때 값이 삽입 되는데,
이론상으론 -480 ~ +480 까지라고 하며, 이동 시 120단위로 이동하게 된다.

이전과 비슷하다, 휠이 움직일때 마다 Delta라는 View에 존재하는 short 멤버 변수에 zDelta 값을 대입해 준다.

마지막으로 WM_PAINT를 생성하여,

처럼 코드를 작성하면,
휠을 움직이거나, 마우스 왼쪽, 오른쪽 버튼을 누르고 마우스를 움직이면 화면에 그 값들을 출력할 것이다.

// 실행 결과

'프로그래밍 > MFC' 카테고리의 다른 글

MFC-새로운 클래스 추가 하기  (0) 2010.05.16
MFC-마우스입력( 드래그 & 드랍 )  (0) 2010.05.16
MFC-마우스 입력  (0) 2010.05.16
MFC-GetKeyState()  (0) 2010.05.12
MFC-GetWindowRect(), ScreenToClient(), SetWindowPos()  (0) 2010.05.12
MFC-키보드 입력  (0) 2010.05.12
Posted by 안식의후크