MFC滑鼠懸停與離開
阿新 • • 發佈:2019-01-10
滑鼠懸停與離開
說明: MFC預設的情況下,是不會觸發滑鼠懸停和離開的訊息。
手動新增輸小懸停和離開訊息及訊息處理函式
宣告並定義函式(其中IDC_ BUTTON_ OK為目標按鈕,IDC_ EDIT_ DEST為任意Edit控制元件,只為轉移焦點)
LRESULT xxxDlg::OnMouseLeave(WPARAM Wparam, LPARAM lParam) { // TODO: 在此新增訊息處理程式程式碼和/或呼叫預設值 POINT p; GetCursorPos(&p); CWnd *hwnd; hwnd = WindowFromPoint(p); CWnd *hWndOk = GetDlgItem(IDC_BUTTON_OK); if (hWndOk == hwnd) { GetDlgItem(IDC_BUTTON_OK)->SetFocus(); m_bEditHover = FALSE; } m_bTracking = TRUE; return 0; } LRESULT xxxDlg::OnMouseHover(WPARAM Wparam, LPARAM lParam) { // TODO: 在此新增訊息處理程式程式碼和/或呼叫預設值 GetDlgItem(IDC_STATIC)->SetFocus(); if (m_bEditHover) { GetDlgItem(IDC_EDIT_DEST)->SetFocus(); } m_bTracking = FALSE; return 0; }
利用框架新增滑鼠移動訊息
void CChoseWay::OnMouseMove(UINT nFlags, CPoint point) { // TODO: 在此新增訊息處理程式程式碼和/或呼叫預設值 if (m_bTracking) { TRACKMOUSEEVENT tme; tme.cbSize = sizeof(TRACKMOUSEEVENT); tme.dwFlags = TME_LEAVE | TME_HOVER; tme.hwndTrack = this->m_hWnd; tme.dwHoverTime = 100; if (::_TrackMouseEvent(&tme)) { m_bTracking = FALSE; } } CDialogEx::OnMouseMove(nFlags, point); }
tme.dwHoverTime = 100,意為停在按鈕上100ms才會觸發懸停訊息。
手動新增訊息響應
BEGIN_MESSAGE_MAP(CChoseWay, CDialogEx) ON_BN_CLICKED(IDC_BUTTON_OK, &CChoseWay::OnBnClickedButton1) ... ON_MESSAGE(WM_MOUSEHOVER, OnMouseHover) ON_MESSAGE(WM_MOUSELEAVE, OnMouseLeave) ON_WM_MOUSEMOVE() END_MESSAGE_MAP()