天天看點

VC動态軌迹畫線

VC動态軌迹畫線

這是一個繪制直線的簡單繪圖程式,能過實作動态軌迹畫線,在拖動時産生臨時線來表示可能畫出的直線效果。

首先:建立一個單文檔程式,名稱為Demo

然後:在視圖類的聲明檔案裡面加入資料成員

class CDemoView : public CView

{

//········

protected:

    int m_Dragging;

    HCURSOR m_HCross;

    CPoint m_PointOld;

    CPoint m_PointOrigin;

};

接着:在視圖類的構造函數裡面

CDemoView::CDemoView()

    // TODO: add construction code here

    m_Dragging=0;

    m_HCross=AfxGetApp()->LoadStandardCursor(IDC_CROSS);//載入标準的十字光标

}

接着:為視圖類添加滑鼠左鍵,滑鼠移動,滑鼠左鍵釋放消息

void CDemoView::OnLButtonDown(UINT nFlags, CPoint point) 

    // TODO: Add your message handler code here and/or call default

    ::SetCursor(m_HCross);//這一句能防止左鍵單擊的時候,保持滑鼠樣式不變

    m_PointOrigin=point;

    m_PointOld=point;

    SetCapture();//捕獲滑鼠,充分控制滑鼠

    m_Dragging=1;

    RECT Rect;

    GetClientRect(&Rect);//取得視窗目前顯示坐标

    ClientToScreen(&Rect);//轉換為螢幕坐标

    ::ClipCursor(&Rect);//限定光标在指定矩形了嗎

    CView::OnLButtonDown(nFlags, point);

void CDemoView::OnMouseMove(UINT nFlags, CPoint point) 

    ::SetCursor(m_HCross);

    if (m_Dragging)

    {

        CClientDC ClientDC(this);

        ClientDC.SetROP2(R2_NOT);//逆轉目前螢幕顔色來畫線的繪圖方式

        ClientDC.MoveTo(m_PointOrigin);//

        ClientDC.LineTo(m_PointOld);   //擦去上一次的線

        ClientDC.MoveTo(m_PointOrigin);

        ClientDC.LineTo(point);//繪制這一次的臨時線

        m_PointOld=point;

    }

    CView::OnMouseMove(nFlags, point);

void CDemoView::OnLButtonUp(UINT nFlags, CPoint point) 

        m_Dragging=0;

        ::ReleaseCapture();//結束捕獲滑鼠

        ::ClipCursor(NULL);//解鎖滑鼠

        ClientDC.SetROP2(R2_NOT);

        ClientDC.LineTo(m_PointOld);//擦去上一次的臨時線

        ClientDC.SetROP2(R2_COPYPEN);//預設繪圖模式,像素為畫筆顔色

        ClientDC.LineTo(point);//繪制固定線

    CView::OnLButtonUp(nFlags, point);

繼續閱讀