![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuMmNhlDZwgDOkJWO0UWZ5M2N0UTYzAzYjVmZyEDNiFzMfdWbp9CXt92Yu4GZjlGbh5SZslmZxl3Lc9CX6MHc0RHaiojIsJye.gif)
這是一個繪制直線的簡單繪圖程式,能過實作動态軌迹畫線,在拖動時産生臨時線來表示可能畫出的直線效果。
首先:建立一個單文檔程式,名稱為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);