乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      MFC之繪制線條

       just4peterpan 2018-09-08

      前言


      我們首先建立MFC單文檔工程,利用編輯器向?qū)Чぞ?,自?dòng)在view類中完成WM_LButtonUp和WM_LButtonDown兩個(gè)消息的添加,添加完成后將自動(dòng)出現(xiàn)如下兩個(gè)函數(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)用默認(rèn)值
      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)用默認(rèn)值
      13. CView::OnLButtonUp(nFlags, point);
      14. }

      背景知識(shí):

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


      畫線思路:

            我們兩點(diǎn)成一線,利用鼠標(biāo)左鍵按下和彈起時(shí)可以分別確定起點(diǎn)和終點(diǎn),利用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ù)實(shí)現(xiàn)畫線


      //起點(diǎn)位置

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

      //終點(diǎn)位置

      1. void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)
      2. {
      3. //獲得窗口的設(shè)備描述表
      4. HDC hdc;
      5. hdc = ::GetDC(m_hWnd);
      6. //移動(dòng)到線條的起點(diǎn)位置
      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. }

      運(yùn)行效果:



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


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

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

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

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


      CClientDC 類派生于CDC類,CClientDC 對(duì)象的構(gòu)造時(shí),會(huì)調(diào)用GetDC函數(shù),在析構(gòu)對(duì)象時(shí)調(diào)用ReleaseDC函數(shù),因此CClientDC類對(duì)象生命周期結(jié)束后,有程序就自動(dòng)完成資源釋放,就不需要顯示調(diào)用DC資源相關(guān)函數(shù)了。實(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類實(shí)現(xiàn)畫線


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

      CWindowDC對(duì)象存在以下好處:

           該對(duì)象可以訪問整個(gè)窗口區(qū)域,包括框架窗口的非客戶區(qū)和客戶區(qū)。如果要構(gòu)造一個(gè)與視類窗口相關(guān)的DC,則可以利用視類對(duì)象的指針來構(gòu)造整個(gè)CWindowDC對(duì)象,如果想在非客戶區(qū)畫圖,則需要傳遞指向視類父窗口的指針。代碼實(shí)現(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. }

      運(yùn)行效果:


      繪制彩色線條


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

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

      2.將此畫筆選入到DC中

      3.畫線


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

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

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

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

      具體代碼實(shí)現(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對(duì)象選入DC
      8. CPen* pOldPen = dc.SelectObject(&pen);
      9. //移動(dòng)起點(diǎn)
      10. dc.MoveTo(m_ptOrigin);
      11. //畫線
      12. dc.LineTo(point);
      13. //還原DC
      14. dc.SelectObject(pOldPen);
      15. CView::OnLButtonUp(nFlags, point);
      16. }

      運(yùn)行效果:



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

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多