본문 바로가기

Visual C++/WM_MOUSEHOVER

MFC Mouse Hover example

MFC에서 WM_MOUSEHOVER, WM_MOUSELEAVE 메시지를 이용한 Mouse Over 기능 구현 예


WM_MOUSEHOVER, WM_MOUSELEAVE 메시지는 일반 메시지와 달리 가상함수만 오버라이드한다고 해서 바로 작동하지 않는다.

WM_MOUSEMOVE 메시지 핸들러 안에서 TrackMouseEvent()함수를 이용하여 약갅 특별한 설정을 해 주어야만 이들 메시지가 발생하는 구조를 갖고 있다.


TrackMouseEvent()함수는 다음과 같은 4가지 메시지를 발생하도록 설정하는데 사용된다.


WM_NCMOUSEHOVER, WM_NCMOUSELEAVE, WM_MOUSEHOVER, WM_MOUSELEAVE


그러므로 Mouse Over 기능을 구현하기 위해서는 우선 WM_MOUSEMOVE 메시지 핸들러가 필요하다.


1. WM_MOUSEMOVE 메시지를 처리하려는 클래스에 마우스 우측을 눌러 Class Wizard를 열고 Messages탭에서 WM_MOUSEMOVE 를 찾아 더블클릭하여 핸들러 함수를 생성하고 다음과 같이 입력한다. 다음과 같이 하면 마우스가 이동할 때 위에서 언급한 4가지 메시지가 상황에 따라서 발생하게 된다


BOOL m_bTrackMouse = FALSE;

void ButtonOnToolWnd::OnMouseMove(UINT nFlags, CPoint point)

{

// TODO: Add your message handler code here and/or call default

if(!m_bTrackMouse)

{

TRACKMOUSEEVENT tme;

tme.cbSize = sizeof(tme);

tme.hwndTrack = m_hWnd;

tme.dwFlags = TME_LEAVE|TME_HOVER;

tme.dwHoverTime = 1;

if(TrackMouseEvent(&tme))

                {

                          m_bTrackMouse = TRUE;

                 }

}

CButton::OnMouseMove(nFlags, point);

}



위와 같은 방법으로 WM_MOUSEHOVER, WM_MOUSELEAVE 메시지가 발생하게 되었기 때문에 해당 메시지 핸들러가 필요하다 위에서 WM_MOUSEMOVE 메시지 핸들러를 오버라이드했던 것처럼 하면 핸들러 함수를 오버라이드할 수 있다.


생성된 2개의 핸들러 함수를 다음과 같이 작성하여 제대로 반응하는지 확인할 수 있다.


void ButtonOnToolWnd::OnMouseHover(UINT nFlags, CPoint point)

{

// TODO: Add your message handler code here and/or call default

AfxMessageBox(_T("OnMouseHover()"));

CButton::OnMouseHover(nFlags, point);

}



void ButtonOnToolWnd::OnMouseLeave()

{

// TODO: Add your message handler code here and/or call default

AfxMessageBox(_T("OnMouseLeave()"));

CButton::OnMouseLeave();

}