首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

MFC 視窗程式設計:接收滑鼠輸入訊息完整指南

     編輯:關於C語言

在 MFC 視圖類中處理滑鼠訊息是互動式應用的基礎。透過 ClassWizard 加入訊息對映,即可輕鬆響應滑鼠移動、按鍵按下/釋放、雙擊等事件。本文詳細說明各訊息對應的處理函數原型、參數含義,並以「拖曳繪製矩形」為例展示實際應用邏輯。

核心滑鼠訊息與處理函數

訊息處理函數參數
WM_MOUSEMOVEOnMouseMove(UINT nFlags, CPoint point)nFlags:按鍵狀態標誌;point:裝置座標(視窗左上角為原點)
WM_LBUTTONDOWN / WM_RBUTTONDOWNOnLButtonDown / OnRButtonDown(UINT nFlags, CPoint point)同 OnMouseMove
WM_LBUTTONUP / WM_RBUTTONUPOnLButtonUp / OnRButtonUp(UINT nFlags, CPoint point)同 OnMouseMove
WM_LBUTTONDBLCLK / WM_RBUTTONDBLCLKOnLButtonDblClk / OnRButtonDblClk(UINT nFlags, CPoint point)同 OnMouseMove

nFlags 常用標誌位(位元遮罩檢測)

  • MK_CONTROL:Ctrl 鍵按下
  • MK_LBUTTON:左鍵按下
  • MK_MBUTTON:中鍵按下
  • MK_RBUTTON:右鍵按下
  • MK_SHIFT:Shift 鍵按下

檢測範例:`if (nFlags & MK_LBUTTON) { /* 左鍵拖曳中 */ }`

實作範例:拖曳繪製矩形

// 成員變數
BOOL m_bDragging;      // 是否正在拖曳
CPoint m_ptStart;      // 按下位置
CPoint m_ptEnd;        // 移動/釋放位置

// OnLButtonDown:記錄起點,開始拖曳
void CMyView::OnLButtonDown(UINT nFlags, CPoint point) {
    m_bDragging = TRUE;
    m_ptStart = m_ptEnd = point;
    DrawRect();  // 畫初始矩形(可能只是一點)
}

// OnMouseMove:拖曳中更新終點並重繪
void CMyView::OnMouseMove(UINT nFlags, CPoint point) {
    if (m_bDragging) {
        m_ptEnd = point;
        DrawRect();  // 擦除舊矩形、畫新矩形
    }
    CView::OnMouseMove(nFlags, point);
}

// OnLButtonUp:結束拖曳
void CMyView::OnLButtonUp(UINT nFlags, CPoint point) {
    if (m_bDragging) {
        m_bDragging = FALSE;
        m_ptEnd = point;
        DrawRect();  // 確定最終矩形
    }
    CView::OnLButtonUp(nFlags, point);
}

// 繪製輔助函數(使用 XOR 模式實現橡皮筋效果)
void CMyView::DrawRect() {
    CClientDC dc(this);
    dc.SetROP2(R2_NOTXORPEN);  // XOR 畫筆:再畫一次即消除
    dc.SelectStockObject(NULL_BRUSH);
    dc.Rectangle(CRect(m_ptStart, m_ptEnd));
}

關鍵技巧總結

  1. 使用 R2_NOTXORPEN 光柵模式,無需手動擦除背景即可實現「橡皮筋」拖曳效果
  2. 所有座標均為裝置座標(Client Area 左上角為 0,0),無需轉換
  3. 記得呼叫基類實現(如 `CView::OnMouseMove`)以保持預設行為
  4. 若需在非 Client 區域追蹤滑鼠,可配合 `SetCapture` / `ReleaseCapture`
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved