小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

MFC之繪制線條

 just4peterpan 2018-09-08

前言


我們首先建立MFC單文檔工程,利用編輯器向?qū)Чぞ撸詣釉趘iew類中完成WM_LButtonUp和WM_LButtonDown兩個消息的添加,添加完成后將自動出現(xiàn)如下兩個函數(shù):

  1. //nFlags:Indicates whether the user pressed modifier keys(Alt,Shift,Ctrl..)
  2. //point: specify current cursor the position when left button down
  3. void CDrawView::OnLButtonDown(UINT nFlags, CPoint point)
  4. {
  5. // TODO: 在此添加消息處理程序代碼和/或調(diào)用默認值
  6. CView::OnLButtonDown(nFlags, point);
  7. }
  8. //nFlags:Indicates whether the user pressed modifier keys(Alt,Shift,Ctrl..)
  9. //point: specify current cursor the position when left button up
  10. void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)
  11. {
  12. // TODO: 在此添加消息處理程序代碼和/或調(diào)用默認值
  13. CView::OnLButtonUp(nFlags, point);
  14. }

背景知識:

       DC(Device Context,設(shè)備描述表)是一個包含設(shè)備(物理輸出設(shè)備,比如顯示器, 設(shè)備驅(qū)動程序)信息的結(jié)構(gòu)體。在Windows平臺下,所有的圖形操作都是利用DC完成的,想要完成繪圖功能,只需要得到DC句柄即可。其次,DC是一種資源,在完成圖形操作后,需要調(diào)用ReleaseDC函數(shù)來完成DC所占用的資源釋放,否則會引起內(nèi)存泄漏。


畫線思路:

      我們兩點成一線,利用鼠標左鍵按下和彈起時可以分別確定起點和終點,利用Moveto和Lineto完成畫線功能。


函數(shù)接口和功能描述:

  1. //Remarks:
  2. //Moves the current position to the point specified by x and y (or by point).
  3. CPoint MoveTo(int x,int y);
  4. CPoint MoveTo(POINT point);
  5. //Remarks:
  6. //Draws a line from the current position up to, but not including, the point specified by x and y (or point).
  7. //If LineTo succeeds, the current position is set to the specified ending point.
  8. BOOL LineTo(int x,int y);
  9. BOOL LineTo(POINT point);

利用SDK全局函數(shù)實現(xiàn)畫線


//起點位置

  1. void CDrawView::OnLButtonDown(UINT nFlags, CPoint point)
  2. {
  3. // TODO: 在此添加消息處理程序代碼和/或調(diào)用默認值
  4. //保存起點位置
  5. m_ptBeginPos = point;
  6. CView::OnLButtonDown(nFlags, point);
  7. }

//終點位置

  1. void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)
  2. {
  3. //獲得窗口的設(shè)備描述表
  4. HDC hdc;
  5. hdc = ::GetDC(m_hWnd);
  6. //移動到線條的起點位置
  7. MoveToEx(hdc, m_ptOrigin.x, m_ptOrigin.y,NULL);
  8. //劃線,
  9. LineTo(hdc, point.x, point.y);
  10. //釋放設(shè)備描述表,全局函數(shù)
  11. ::ReleaseDC(m_hWnd, hdc);
  12. CView::OnLButtonUp(nFlags, point);
  13. }

運行效果:



利用CDC類實現(xiàn)畫線


MFC為我們提供了一個設(shè)備描述表的封裝類CDC,該類封裝了所有與繪圖相關(guān)的操作,該類提供一個數(shù)據(jù)成員m_hDC,用來保存與CDC類相關(guān)的DC句柄。關(guān)于CDC類的繪圖相關(guān)成員函數(shù)見博文CDC詳解一文。

具體代碼實現(xiàn)如下:

  1. void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)
  2. {
  3. CDC* pDC = GetDC();
  4. //起點
  5. pDC->MoveTo(m_ptOrigin);
  6. //劃線,終點
  7. pDC->LineTo(point);
  8. ReleaseDC(pDC);
  9. CView::OnLButtonUp(nFlags, point);
  10. }

利用CClientDC類實現(xiàn)畫線


CClientDC 類派生于CDC類,CClientDC 對象的構(gòu)造時,會調(diào)用GetDC函數(shù),在析構(gòu)對象時調(diào)用ReleaseDC函數(shù),因此CClientDC類對象生命周期結(jié)束后,有程序就自動完成資源釋放,就不需要顯示調(diào)用DC資源相關(guān)函數(shù)了。實現(xiàn)程序如下:

  1. void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)
  2. {
  3. //創(chuàng)建DC
  4. CClientDC dc(this);
  5. dc.MoveTo(m_ptOrigin);
  6. dc.LineTo(point);
  7. CView::OnLButtonUp(nFlags, point);
  8. }

利用CWindowDC類實現(xiàn)畫線


CWindowDC類也派生于CDC類,并且在構(gòu)造時調(diào)用GetWindowDC函數(shù)獲得相應(yīng)的設(shè)備描述表對象,在析構(gòu)時調(diào)用ReleaseDC函數(shù)釋放占用的資源。

CWindowDC對象存在以下好處:

     該對象可以訪問整個窗口區(qū)域,包括框架窗口的非客戶區(qū)和客戶區(qū)。如果要構(gòu)造一個與視類窗口相關(guān)的DC,則可以利用視類對象的指針來構(gòu)造整個CWindowDC對象,如果想在非客戶區(qū)畫圖,則需要傳遞指向視類父窗口的指針。代碼實現(xiàn)如下:

  1. void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)
  2. {
  3. //創(chuàng)建DC
  4. CWindowDC dc(GetParent());
  5. dc.MoveTo(m_ptOrigin);
  6. dc.LineTo(point);
  7. CView::OnLButtonUp(nFlags, point);
  8. }

運行效果:


繪制彩色線條


以上各種畫線的實現(xiàn)方法,繪制的都是黑色線條。這是因為DC中有一個默認的黑色畫筆,因此繪制的線條都是黑色的,想要完成其他顏色的畫線功能,需要以下幾個步驟:

1.創(chuàng)建一個特性顏色的畫筆

2.將此畫筆選入到DC中

3.畫線


MFC提供了CPen類來創(chuàng)建畫筆對象,該類封裝了和畫筆相關(guān)的操作,其中一個的構(gòu)造函數(shù)原型聲明如下:

CPen(int nPenStyle, int nWidth, COLORREF crColor)
其中nPenStyle指定了線型(實線、虛線、點線等) ,nWidth指定了線的寬度,crColor指定筆的顏色,該參數(shù)可以由RGB宏來構(gòu)建,具體信息參加MSDN。

另外,在程序中,當構(gòu)造一個GDI對象(CPen,CBrush...)時,該對象只有被選人設(shè)備DC后,它才會在以后的繪圖操作中生效。SelectObject函數(shù)可以實現(xiàn)將GDI對象選人設(shè)備描述表中,該函數(shù)會返回舊的GDI對象指針。

其次,在完成繪圖操作后,都需要利用SelectObject函數(shù)把先前的GDI對象選人設(shè)備描述表,以便還原先前的狀態(tài)。

具體代碼實現(xiàn)如下:

  1. void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)
  2. {
  3. //創(chuàng)建畫筆,紅色的虛線
  4. CPen pen(PS_DASH,1, RGB(255, 0,0));
  5. //創(chuàng)建DC
  6. CClientDC dc(this);
  7. //GDI對象選入DC
  8. CPen* pOldPen = dc.SelectObject(&pen);
  9. //移動起點
  10. dc.MoveTo(m_ptOrigin);
  11. //畫線
  12. dc.LineTo(point);
  13. //還原DC
  14. dc.SelectObject(pOldPen);
  15. CView::OnLButtonUp(nFlags, point);
  16. }

運行效果:



    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多