왜 WM_MOUSEENTER message는 없는가?

WM_MOUSELEAVE는 아래와 같이 존재한다.

[CODE c#]
#if((_WIN32_WINNT >= 0x0400) || (WINVER >= 0x0500))
#define WM_MOUSEHOVER                   0x02A1
#define WM_MOUSELEAVE                   0x02A3
#endif
#if(WINVER >= 0x0500)
#define WM_NCMOUSEHOVER                 0x02A0
#define WM_NCMOUSELEAVE                 0x02A2
#endif /* WINVER >= 0x0500 */
[/CODE]


그렇다면 왜 WM_MOUSEENTER 라는 메세지는 존재하지 않는가?
Raymond Chen은 이 질문에 아주 간결하게 답하고 있다.
"판단하기 쉬우니까"


만약 m_bMouseEnter라는 flag가 있다고 가정을 하면
WM_MOUSELEAVE 메세지를 받았다면
커서가 창을 벗어났다는 의미이다.
(m_bMouseEnter : FALSE)

그리고 그 상태(m_bMouseMove : FALSE)에서 WM_MOUSEMOVE가 일어난다면
WM_MOUSEENTER와 같다.
(m_bMouseEnter : TRUE)

이와 같이 상태를 판단하기 쉬우니까 굳이 메세지로 만들 필요가 없었다고 한다.

사실 일반적인 경우 WM_MOUSEMOVE가 일어난다면 커서는 window의 client 안의 영역에 있을 것이다.


만약 버튼을 CustomControl로 만든 적이 있다면
문명 궁금했을 사항이다.


아래에 간단한 예제를 만들어 보았다.
창에 커서가 들어오면 MouseMove!! 라는 메세지를 출력하고
반대로 커서가 창을 벗어나면 MouseLeave!! 라는 메세지를 출력하는 프로그램이다.

WM_MOUSELEAVE 메세지를 받기 위해서는 아래와 같이 TrackMouseEvent를 호출해주어야 한다.

[CODE c++]
BOOL CMouseEnterDlg::MouseTracking()
{
  TRACKMOUSEEVENT tme;
  tme.cbSize = sizeof(TRACKMOUSEEVENT);
  tme.dwFlags = TME_LEAVE;
  tme.hwndTrack = this->m_hWnd;
  tme.dwHoverTime = HOVER_DEFAULT;
  return TrackMouseEvent(&tme);
}

[/CODE]

chaoskcuf

트랙백 주소 : http://chaoskcuf.com/trackback/84

  1. WM_MOUSEENTER tracked from CodingPain 2010/03/05 18:15  삭제

    핸들을 오가는 마우스를 확인하기 위해 WM_MOUSELEAVE, WM_MOUSEHOVER 자료 검색중 발견. leave 시 bIn = FALSE 해주고, 이상태에서 WM_MOUSEMOVE 가 일어난다면 bIn = TRUE 해주면 된다는군. 결론은 '판단하기 쉬우니까 안만들었다'.

댓글을 달아 주세요

Powerd by Textcube, designed by criuce
rss