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();
}