본문 바로가기

프로그래밍/MFC

마우스 이벤트


FC 프로그래밍에서 마우스 이벤트를 정히하면

마우스 왼쪽버튼을 눌렀을 때의 WM_LBUTTONDOWN
마우스 왼쪽버튼을 눌렀다가 놓았을때, WM_LBUTTONUP

마우스의 움직을을 받아주는 WM_MOUSEMOVE가 있다.
마우스가 움직일때, 발생하는 메시지인 WM_MOUSEMOVE는 메세지 핸들러인 OnMouseMove(UINT nFlags, CPoint point) 이다.

마우스가 LEAVE 될때, 즉 클라이언트 영역에서 클라이언트 영역 밖으로 나가면 발생되는 메세지는 WM_MOUSELEAVE 이다.
WM_MOUSELEAVE 메세지/ 메세지 핸들러는  바로 쓸 수가 없다.

즉 마우스 움직임에서 마우스 LEAVE를 감지해야 한다.

정리하면, OnMouseMove메세지 핸들러에서 TRACKMOUSE 구조체의 객체를 하나 만들어서 TrackMouseEvent()를 호출해야한다.
예를 들어
TRACKMOUSE tme;
tme.cbsize         =  sizeof(tme);      // 구조체 크기
tme.dwFlags      =  TME_LEAVE;    // 감지할 메세지 TME_LEAVE | TME_HOVER
tme.hwndTrack   = GetSafeHwnd(); // 이벤트를 감지할 대상, 윈도우 핸들.

TrackMouseEvent(&tme);
를 하면 WM_MOUSELEAVE메세지를 감지하여, OnMouseLeave메세지 핸들러를 사용할 수 있다.

반대로 마우스가 오버될때는 WM_MOUSEHOVER라는 메세지가 있는데, 메세지 핸들러에서 잘 잡히지 않는다...안된다.(VS2008)

그래서 마우스 버튼정보는, OnMouseMove(UINT nFlags, CPoint point)의 nFlags값으로 탐지하면 된다.
nFlags == 0 이면 버튼 입력 없음
nFlags == 1 이면 왼쪽 버튼 다운.
nFlags == 2 이면 오른쪽 버튼 다운.
nFlags == 3 이면 양쪽 버튼 다운이다.

이 정도면 마우스 이벤트를 핸들링 하는데 큰 문제는 없으리라 생각된다.

SetCapture(), ReleaseCapture()도 있는데, 이 방식이 나에게 맞는 것 같다.

 

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

[MFC] CWinAppEx::CleanState()  (0) 2010.08.25
CView  (0) 2010.05.24
차일드 사용  (0) 2010.05.20
MFC에서 hWnd와 hinst 얻어오기  (0) 2010.05.20
MFC  (0) 2010.05.20