在 MFC 視圖類中處理滑鼠訊息是互動式應用的基礎。透過 ClassWizard 加入訊息對映,即可輕鬆響應滑鼠移動、按鍵按下/釋放、雙擊等事件。本文詳細說明各訊息對應的處理函數原型、參數含義,並以「拖曳繪製矩形」為例展示實際應用邏輯。
| 訊息 | 處理函數 | 參數 |
|---|---|---|
| WM_MOUSEMOVE | OnMouseMove(UINT nFlags, CPoint point) | nFlags:按鍵狀態標誌;point:裝置座標(視窗左上角為原點) |
| WM_LBUTTONDOWN / WM_RBUTTONDOWN | OnLButtonDown / OnRButtonDown(UINT nFlags, CPoint point) | 同 OnMouseMove |
| WM_LBUTTONUP / WM_RBUTTONUP | OnLButtonUp / OnRButtonUp(UINT nFlags, CPoint point) | 同 OnMouseMove |
| WM_LBUTTONDBLCLK / WM_RBUTTONDBLCLK | OnLButtonDblClk / OnRButtonDblClk(UINT nFlags, CPoint point) | 同 OnMouseMove |
檢測範例:`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));
}
R2_NOTXORPEN 光柵模式,無需手動擦除背景即可實現「橡皮筋」拖曳效果