關於 WM_MOUSEENTER 和 WM_MOUSELEAVE消息。

這兩個消息比較古怪,雖然你能找到他們的定義,看起來也似乎挺有用,但是卻接收不到。剛纔csdn有人問到這個問題,我就隨手答了一下,隨便貼到這裏,以做保存。

----------------------------------------

WM_MOUSELEAVE ,WM_MOUSEENTER 應該算是個自定義的消息,因爲Windows通常都不會發送這個消息。只有你調用TrackMouseEvent 纔會收到這個消息。

實際上這個消息 是 TrackMouseEvent 而不是windows 發出的。很奇怪微軟會定義出這樣子的API。而且TrackMouseEvent 個人感覺也不大好用(主要是感覺彆扭,不是說功能不行)。其實TrackMouseEvent 的原理也蠻簡單的,自己三兩句語句就搞定了,不必理會微軟搞的這個古里古怪的API,還得去查找消息定義。

原理如下:
鼠標在窗口區域時會收到MouseMove消息,第一次收到這個消息時 就是 WM_MOUSEENTER。
On_MouseMove(...)
{
  static BOOL bFirst = TRUE;
  if (bFirst)
  {
    // PostMessage(WM_MOUSEENTER...) or call some function.
    bFirst = FALSE;
    SetTimer(...);
  }  
}

在 Mouse Enter 自後啓動了一個計時器, 通常100ms 就足夠了。計時器裏檢測鼠標是否離開。
On_Timer(...)
{
...
  GetCursorPos(pt);
  GetWindowRect(rect);
  if (PtInRect(&rect,pt))
  {
    KillTimer(...); // kill self.
    PostMessage(WM_MOUSELEAVE...); // or call some function.
  }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章