2010年10月1日 星期五

mouse leave 與 mouse event track

在 C++/MFC 中雖然有 MouseLeave 的事件可以選擇,
但選了卻沒有反應,原因是必須加上 Track 追蹤滑鼠,
以下是在 MFC 上實作 Mouse Leave 和 Mouse Over 的簡單範例。

在 CDlg.h 宣告一個旗標


class CDlg : CDialog
{
  BOOL m_bTrackingMouse;
};


在 MouseMove 時設上 Track,CDlg.cpp 中需要加上這些 code


void CDlg::CDlg()
{
  m_bTrackingMouse = FALSE;
}

BOOL CDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
  ifmessage == WM_MOUSEMOVE)
  {
    if(!m_bTrackingMouse)
    {
      TRACKMOUSEEVENT tme;
      tme.cbSize = sizeof(tme);
      tme.hwndTrack = GetSafeHwnd();
      tme.dwFlags = TME_HOVER|TME_LEAVE;
      tme.dwHoverTime = 1;
      m_bTrackingMouse = TrackMouseEvent(&tme);
    }
  }
  else if(message == WM_MOUSELEAVE)
  {
    m_bTrackingMouse = FALSE;
    // 做些 Mouse Leave 做的事,例如顏色變暗
  }
  else if(message == WM_MOUSE_HOVER)
  {
    // 做些 Mouse Over 做的事,例如元件顏色變亮
  }
}


這樣的寫法在當你的 Window 上有很多子元件時,
會發生滑鼠移到子元件上,主 Window 也收到 Leave 的狀況,
解法方法就是在 Mouse Move 時加上檢測滑鼠是不是在子元件上面再行處理,
比較需要注意的是上面範例是在 CDlg::WindowProc() 內,
若要加上對子元件 MouseMove 的處理,要在 PreTransMsg() 裡才接得到子元件的訊息。

1 則留言:

  1. 妳好,請問我要如何才可以判斷滑鼠是否已經在元件上面呢?

    回覆刪除