1. 程式人生 > >MFC滑鼠懸停與離開

MFC滑鼠懸停與離開

滑鼠懸停與離開

說明: MFC預設的情況下,是不會觸發滑鼠懸停和離開的訊息。

手動新增輸小懸停和離開訊息及訊息處理函式

  1. 宣告並定義函式(其中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;
    }
    
  2. 利用框架新增滑鼠移動訊息

    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才會觸發懸停訊息。

  3. 手動新增訊息響應

    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()