マウスが領域から離れた(WM_MOUSELEAVE)を受け取るには_TrackMouseEvent()が必要


_TrackMouseEvent()を使ってOnMouseLeave()に飛ぶように設定する。


Cソース

BEGIN_MESSAGE_MAP(CImageButton, CButton)
 //{{AFX_MSG_MAP(CImageButton)
 … 
 ON_MESSAGE(WM_MOUSELEAVE, OnMouseLeave)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
void CImageButton::OnMouseMove(UINT nFlags, CPoint point) 
{
 CRect rect;
 GetClientRect(rect);
 if(PtInRect(rect, point)){
  
  // マウス監視開始(LEAVEイベント)
  TRACKMOUSEEVENT tme;
  tme.cbSize = sizeof(tme);
  tme.dwFlags = TME_LEAVE;
  tme.hwndTrack = this->m_hWnd;
  _TrackMouseEvent(&tme);

  InvalidateRect(rect);		// 描画
 }
 CButton::OnMouseMove(nFlags, point);
}
LRESULT CImageButton::OnMouseLeave(WPARAM wparam, LPARAM lparam){
 …
}

ヘッダ

// 生成されたメッセージ マップ関数
protected:
 //{{AFX_MSG(CImgButton)
 …
 afx_msg LRESULT OnMouseLeave(WPARAM wparam, LPARAM lparam);
 //}}AFX_MSG


ネタ元