前言我們首先建立MFC單文檔工程,利用編輯器向?qū)Чぞ撸詣釉趘iew類中完成WM_LButtonUp和WM_LButtonDown兩個消息的添加,添加完成后將自動出現(xiàn)如下兩個函數(shù):
背景知識: 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ù)接口和功能描述: 利用SDK全局函數(shù)實現(xiàn)畫線//起點位置
//終點位置
運行效果: 利用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)如下: 利用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)程序如下:
利用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)如下:
運行效果: 繪制彩色線條以上各種畫線的實現(xiàn)方法,繪制的都是黑色線條。這是因為DC中有一個默認的黑色畫筆,因此繪制的線條都是黑色的,想要完成其他顏色的畫線功能,需要以下幾個步驟: 1.創(chuàng)建一個特性顏色的畫筆 2.將此畫筆選入到DC中 3.畫線 MFC提供了CPen類來創(chuàng)建畫筆對象,該類封裝了和畫筆相關(guān)的操作,其中一個的構(gòu)造函數(shù)原型聲明如下: 其中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)如下:
運行效果: |
|
|
來自: just4peterpan > 《待分類》