前言我們首先建立MFC單文檔工程,利用編輯器向?qū)Чぞ?,自?dòng)在view類中完成WM_LButtonUp和WM_LButtonDown兩個(gè)消息的添加,添加完成后將自動(dòng)出現(xiàn)如下兩個(gè)函數(shù):
背景知識(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ù)接口和功能描述:
利用SDK全局函數(shù)實(shí)現(xiàn)畫線//起點(diǎn)位置
//終點(diǎn)位置
運(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)如下:
利用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)程序如下:
利用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)如下:
運(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ù)原型聲明如下: 其中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)如下:
運(yùn)行效果: |
|