VC++之绘制线条
我們可以在類向導那里添加OnLButtonDown消息響應函數,它有兩個參數,其中第二個參數是CPoint類型,CPoint類表示一個點,也就是說,當鼠標左鍵按下時,鼠標單擊處的坐標點已由此參數傳遞給OnLButtonDown這一消息響應函數。這樣,我們所需的工作就是在此消息響應函數中保存該點的信息。為此,需要在視類中增加一個成員變量。在本例我創建的工程名為Draw,為單文檔程序,在CDrawView類添加一個新的成員變量,
CPoint m_ptOrigin;- 1
- 1
接下來在CDrawView構造函數中初始化這個變量,將其值初始化為0,。?
然后在消息響應函數OnLButtonDown中保存鼠標按下點的信息
- 1
- 2
- 3
- 4
- 5
- 6
- 1
- 2
- 3
- 4
- 5
- 6
這樣就得到了要繪制線條的起點,兩點成線,所以接下來要獲得線條終點。終點是在鼠標左鍵彈起來時獲得的。在CDrawView類中對WM_LBUTTONUP進行響應,初始代碼如下:
void CDraw11View::OnLButtonUp(UINT nFlags, CPoint point) {// TODO: Add your message handler code here and/or call defaultCView::OnLButtonUp(nFlags, point); }- 1
- 2
- 3
- 4
- 5
- 6
- 1
- 2
- 3
- 4
- 5
- 6
方法1:利用MFC的CDC類實現畫線功能
void CDraw11View::OnLButtonUp(UINT nFlags, CPoint point) {CDC* pDC=GetDC();pDC->MoveTo(m_ptOrigin);pDC->LineTo(point);ReleaseDC(pDC);CView::OnLButtonUp(nFlags, point); }- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
方法2:利用MFC的CClientDC類的實現畫線功能,MFC提供的CClientDC類派生于CDC類,用來在窗口的客戶區繪圖,并且在構造時調用GetDC()獲得與指定窗口相關聯的設備描述表,在析構時調用Release()釋放DC資源,使用方便。
void CDraw11View::OnLButtonUp(UINT nFlags, CPoint point) {CClientDC dc(this);//獲得與視類窗口相關聯的CClientDC對象dc.MoveTo(m_ptOrigin);dc.LineTo(point);CView::OnLButtonUp(nFlags, point); }- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 1
- 2
- 3
- 4
- 5
- 6
- 7
方法3:利用MFC的CWindowDC類實現畫線功能,CClientDC類對象只能在框架類窗口的客戶區(視類區域+工具欄區域)畫圖,CWindowDC可以實現在窗口的整個區域畫圖
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 1
- 2
- 3
- 4
- 5
- 6
- 7
本篇是在上一篇博客的基礎上繼續學習繪圖的。?
為了繪制連續的線條,首先需要得到線條的起點,這在前篇博客已經實現了,然后需要捕獲鼠標移動過程中的每一個點,這可以通過捕獲鼠標移動消息(WM_MOUSEMOVE)來實現。?
然后我們開始增加Draw程序的功能。首先為視類增加鼠標移動消息(WM_MOUSEMOVE)的響應函數(默認名稱為OnMouseMove)。這樣,只要鼠標在應用程序窗口中移動時,都會進入到這個消息響應函數中。但這并不是我們所期望的,我們希望在鼠標左鍵按下去之后才開始繪圖。因此,我們需要有一個變量來表示鼠標左鍵是否按下去這一狀態。在視類頭文件定義該變量
- 1
- 1
接下來在視類的構造函數中,將此變量初始化為FALSE。
m_bDraw = FALSE;- 1
- 1
當鼠標左鍵按下去時,即在視類的OnLButtonDown函數中將此變量設置為真
m_bDraw = TRUE;- 1
- 1
當鼠標左鍵彈起來時,即在視類的OnLButtonUp函數中將此變量設置為假(把之前編寫的代碼注釋起來)
m_bDraw = FALSE;- 1
- 1
!!!繪制完應修改線段的起點,將當前線段的終點作為下一條線段的起點。
void CDrawView::OnMouseMove(UINT nFlags, CPoint point) {CClientDC dc(this);if(m_bDraw==TRUE){dc.MoveTo(m_ptPointOrigin);dc.LineTo(point);//修改線段的起點m_ptPointOrigin=point;}CView::OnMouseMove(nFlags, point); }- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
效果如圖,這樣就可以繪制連續線條了:?
在繪制連續線條的程序中,保持每段小直線的起點不變,即以鼠標左鍵按下時的點為起點不變,分別繪制到鼠標移動點的直線,這時就會出現扇形的效果。我們要繪制一個帶邊線的扇形,還需要為視類再增加一個成員變量,用來保存鼠標的上一個移動點,并在OnMouseMove函數中添加代碼,以實現從鼠標當前點到鼠標上個移動點的連線,也就是繪制一條邊線,同時還要保存當前鼠標點,為下一條邊線做準備。首先先給CDrawView類增加一個CPoint類型的私有變量m_ptOld.
- 1
- 1
接著在OnLButtonDown消息響應函數中初始化這個變量。
m_ptOld=point;- 1
- 1
然后在OnMouseMove中添加實現代碼(這里我們設置線條顏色為紅色):
void CDrawView::OnMouseMove(UINT nFlags, CPoint point) {CClientDC dc(this);//創建一個紅色的,寬度為1的實現畫筆CPen pen(PS_SOLID,1,RGB(255,0,0));//把創建的畫筆選入設備描述表CPen *pOldPen=dc.SelectObject(&pen);if(m_bDraw==TRUE){dc.MoveTo(m_ptPointOrigin);dc.LineTo(point);dc.LineTo(m_ptOld);//修改線段的起點//m_ptPointOrigin=point;m_ptOld=point;}dc.SelectObject(pOldPen);//恢復設備描述表CView::OnMouseMove(nFlags, point); }- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
【MoveTo()函數是將當前位置移動到需繪制的線條起點處。LineTo()函數繪制一條到指定點的線。】?
效果如圖:?
與50位技術專家面對面20年技術見證,附贈技術全景圖
總結
- 上一篇: VS2010代码提示功能配置:Visua
- 下一篇: 用两个使用Caffe的小项目案例演示迁移