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

VC++ 滑鼠繪圖實作:橡皮筋線條拖曳繪製完整教學

     編輯:VC 教學

效果預覽

按住左鍵拖曳 → 顯示反相線條(橡皮筋效果)→ 釋放左鍵 → 線條固定保留。經典「50 個 VC++ 必做範例」之一。

核心類別成員


class CMouseView : public CView {
    CString m_ClassName;
    int     m_Dragging = 0;       // 0=靜止 1=拖曳中
    HCURSOR m_HCross;             // 十字光標
    CPoint  m_PointOld;           // 上一個端點
    CPoint  m_pointOrigin;        // 起點
};

初始化


CMouseView::CMouseView() {
    m_Dragging = 0;
    m_HCross = AfxGetApp()->LoadStandardCursor(IDC_CROSS);
}

三大滑鼠訊息處理

Left Button Down - 開始捕捉


void CMouseView::OnLButtonDown(UINT nFlags, CPoint point) {
    m_pointOrigin = m_PointOld = point;
    SetCapture(); m_Dragging = 1;

    CRect rc; GetClientRect(&rc); ClientToScreen(&rc);
    ::ClipCursor(&rc); // 限制滑鼠不超出客戶區
}

Mouse Move - 繪製/刷新橡皮筋線


void CMouseView::OnMouseMove(UINT nFlags, CPoint point) {
    ::SetCursor(m_HCross);
    if (!m_Dragging) return;

    CClientDC dc(this);
    dc.SetROP2(R2_NOT); // 反相模式:畫兩次即還原

    // 擦除舊線
    dc.MoveTo(m_pointOrigin); dc.LineTo(m_PointOld);
    // 畫新線
    m_PointOld = point;
    dc.MoveTo(m_pointOrigin); dc.LineTo(m_PointOld);
}

Left Button Up - 確認並釋放


void CMouseView::OnLButtonUp(UINT nFlags, CPoint point) {
    if (!m_Dragging) return;
    m_Dragging = 0; ReleaseCapture(); ::ClipCursor(NULL);

    CClientDC dc(this);
    dc.SetROP2(R2_NOT);
    // 擦除最後一條橡皮筋線
    dc.MoveTo(m_pointOrigin); dc.LineTo(m_PointOld);
    // 以正常模式畫出永久線條
    dc.SetROP2(R2_COPYPEN);
    dc.MoveTo(m_pointOrigin); dc.LineTo(m_PointOld);
}

關鍵技術點

  • R2_NOT 光柵運算:像素反相,同一條線畫兩次即可還原背景,無需雙緩衝。
  • SetCapture 讓視窗持續接收 `WM_MOUSEMOVE` 即使滑鼠移出客戶區。
  • ClipCursor 選用,防止拖曳時滑鼠跑到螢幕邊緣導致座標異常。

擴展建議

  1. 記錄所有確認線條到 `CArray`,支援重繪(`OnDraw` 遍歷畫出)。
  2. 加入多種筆刷/顏色/線寬選單。
  3. 改用 `CDC::PolyLine` 繪製多節折線。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved