日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

VC++之绘制线条

發布時間:2024/9/21 c/c++ 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 VC++之绘制线条 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

我們可以在類向導那里添加OnLButtonDown消息響應函數,它有兩個參數,其中第二個參數是CPoint類型,CPoint類表示一個點,也就是說,當鼠標左鍵按下時,鼠標單擊處的坐標點已由此參數傳遞給OnLButtonDown這一消息響應函數。這樣,我們所需的工作就是在此消息響應函數中保存該點的信息。為此,需要在視類中增加一個成員變量。在本例我創建的工程名為Draw,為單文檔程序,在CDrawView類添加一個新的成員變量,

CPoint m_ptOrigin;
  • 1
  • 1

接下來在CDrawView構造函數中初始化這個變量,將其值初始化為0,。?
然后在消息響應函數OnLButtonDown中保存鼠標按下點的信息

void CDrawView::OnLButtonDown(UINT nFlags, CPoint point) {// TODO: Add your message handler code here and/or call defaultm_ptOrigin=point;CView::OnLButtonDown(nFlags, point); }
  • 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可以實現在窗口的整個區域畫圖

void CDraw11View::OnLButtonUp(UINT nFlags, CPoint point) {CWindowDC dc(GetParent());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

本篇是在上一篇博客的基礎上繼續學習繪圖的。?
為了繪制連續的線條,首先需要得到線條的起點,這在前篇博客已經實現了,然后需要捕獲鼠標移動過程中的每一個點,這可以通過捕獲鼠標移動消息(WM_MOUSEMOVE)來實現。?
然后我們開始增加Draw程序的功能。首先為視類增加鼠標移動消息(WM_MOUSEMOVE)的響應函數(默認名稱為OnMouseMove)。這樣,只要鼠標在應用程序窗口中移動時,都會進入到這個消息響應函數中。但這并不是我們所期望的,我們希望在鼠標左鍵按下去之后才開始繪圖。因此,我們需要有一個變量來表示鼠標左鍵是否按下去這一狀態。在視類頭文件定義該變量

BOOL m_bDraw;
  • 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.

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()函數繪制一條到指定點的線。】?
效果如圖:?

0

與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的VC++之绘制线条的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。