資源描述:
《vc mfc 編程實(shí)例4》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫(kù)。
1、VCMFC編程實(shí)例4本文由sdhexu貢獻(xiàn)pdf文檔可能在WAP端瀏覽體驗(yàn)不佳。建議您優(yōu)先選擇TXT,或下載源文件到本機(jī)查看。下載第4章繪圖在前面幾章中,Windows為我們做了所有的繪圖工作—從繪制一個(gè)窗口的非客戶區(qū)到繪制通用控件.本章將討論怎樣用MFC的CDC類繪制控件和視圖,我們將討論:■Windows和MFC支持的繪圖工具類型.■Windows和MFC支持的繪圖模式和特性.■兩種存儲(chǔ)為將來(lái)顯示用的繪圖命令的方法:元文件■怎樣在抖動(dòng)色(dithered(Metafile)和路徑(Path).color)和未經(jīng)抖動(dòng)色(nonditheredcolor
2、)中繪圖.■什么時(shí)候Windows繪制它的窗口.4.1設(shè)備環(huán)境若自己編寫一個(gè)函數(shù)在屏幕上畫一條直線,將需要以下類型的調(diào)用變量:■直線坐標(biāo)(起點(diǎn)x,■線條顏色.■線條粗細(xì).y,終點(diǎn)x,y).若要使功能更復(fù)雜些,還必須添加:■在(像素,英寸或厘米)中指定進(jìn)行繪圖的度量單位的能力.■在打印機(jī)或一個(gè)圖形文件中繪制直線的能力.為了方便,還希望將直線繪制在任何顯示器或者任何打印機(jī)上,而不必考慮顯示卡或打印機(jī)的類型.如果考慮所有這些屬性,該函數(shù)的結(jié)構(gòu)如下:DrawLine(x1,y1,x2,y2,color,width,device,limits,units)雖然相當(dāng)
3、直觀,但該函數(shù)有一個(gè)隱含的費(fèi)用—每當(dāng)畫一條直線,所有這些參數(shù)將必須壓入堆棧中.同時(shí),該函數(shù)也沒(méi)有保留擴(kuò)展功能的余地.要添加變量,將必須對(duì)舊函數(shù)編輯任何引用.因此,怎樣才能減少需要的調(diào)用變量的數(shù)目并預(yù)留擴(kuò)展空間呢?一種方法是寫一個(gè)包含函數(shù)所需的大多數(shù)變量的C++類,并將該類作為一個(gè)變量進(jìn)行傳輸.甚至可以使該類用一些合法的默認(rèn)值構(gòu)造自己,以便在特殊場(chǎng)合中使用.Windows使用一個(gè)稱為設(shè)備環(huán)境(DeviceContext)的對(duì)象的方法—但該對(duì)象的創(chuàng)建沒(méi)有一個(gè)C++類,因?yàn)閃indows早于并存在于C++之外.設(shè)備環(huán)境對(duì)象用一些默認(rèn)值創(chuàng)建,可以用它們創(chuàng)建默認(rèn)的
4、設(shè)備環(huán)境.應(yīng)用Windows繪制一直線,所需的是一個(gè)設(shè)備環(huán)境對(duì)象的指針和直線坐標(biāo),設(shè)備環(huán)境對(duì)象的指針叫做設(shè)備環(huán)境句柄(HDC).::MoveTo(HDChdc,intx,inty);::LineTo(HDChdc,intx,inty);要繪制一個(gè)完整的形狀,::MoveTo()函數(shù)只被調(diào)用一次.然后,::LineTo()函數(shù)被調(diào)用,沒(méi)有一個(gè)多余的變量被壓進(jìn)堆棧(見(jiàn)圖4-1).52第一部分基礎(chǔ)知識(shí)下載①使用設(shè)備環(huán)境以前設(shè)備環(huán)境②使用設(shè)備環(huán)境以后圖4-1設(shè)備環(huán)境減少調(diào)用變量的數(shù)目并預(yù)留擴(kuò)展空間注意因?yàn)樵O(shè)備環(huán)境在內(nèi)存中創(chuàng)建,而內(nèi)存經(jīng)常受到擾動(dòng),它的地址可能是經(jīng)
5、常變化的.因此,一個(gè)設(shè)備環(huán)境句柄不是直接指向設(shè)備環(huán)境對(duì)象,而是指向另外一個(gè)跟蹤設(shè)備環(huán)境地址的指針.設(shè)備無(wú)關(guān)設(shè)備環(huán)境是設(shè)備無(wú)關(guān)的,它允許你編寫軟件而不必指定一個(gè)設(shè)備.這些軟件必須知道的是:它是編寫一個(gè)設(shè)備環(huán)境的,而不管該設(shè)備環(huán)境是屏幕還是Epson打印機(jī).之后,設(shè)備環(huán)境可以被分配給一個(gè)打印機(jī),屏幕,位圖或一個(gè)文件.4.2在MFC環(huán)境中創(chuàng)建一個(gè)設(shè)備環(huán)境MFC用CDC類封裝了一個(gè)設(shè)備環(huán)境對(duì)象,CDC的成員變量m_hdc指向它所擁有的設(shè)備環(huán)境,用戶可以創(chuàng)建四種類型的設(shè)備環(huán)境:■屏幕.■打印機(jī).■只有打印機(jī)的信息部分.■位圖.4.2.1屏幕創(chuàng)建一個(gè)屏幕設(shè)備環(huán)境,可
6、以用:CDC*pDC=GetDC();這里的GetDC()是CWnd類的成員函數(shù),它返回一個(gè)允許用戶繪制它的窗口客戶區(qū)的設(shè)備環(huán)境;如果還希望繪制非客戶區(qū),則使用:CDC*pDC=GetWindowDC();如果需要繪制整個(gè)屏幕,如編寫一個(gè)屏幕保護(hù)程序或游戲程序時(shí),可能需要對(duì)整屏進(jìn)行繪制,這時(shí)使用:下載CDC*pDC=CDC::FromHandle(::GetDC(NULL));第4章繪圖53屏幕設(shè)備環(huán)境來(lái)自三種資源之一:私有設(shè)備環(huán)境,類設(shè)備環(huán)境和通用設(shè)備環(huán)境.1.私有設(shè)備環(huán)境創(chuàng)建窗口時(shí),私有設(shè)備環(huán)境便創(chuàng)建了,并在窗口存在期間一直存在.要使窗口創(chuàng)建一個(gè)私有
7、設(shè)備環(huán)境,必須在目標(biāo)窗口的窗口類中設(shè)置CS_OWNDC標(biāo)志,這時(shí)GetDC()返回一個(gè)私有設(shè)備環(huán)境的指針,而不創(chuàng)建一個(gè)設(shè)備環(huán)境.在窗口存在期間,為私有設(shè)備環(huán)境所作的任何變化都被保存.私有設(shè)備環(huán)境主要在以圖形為中心的應(yīng)用程序中使用,在那里經(jīng)常地分配一個(gè)設(shè)備環(huán)境,這樣會(huì)占用非常多的CPU時(shí)間.2.類設(shè)備環(huán)境類設(shè)備環(huán)境在注冊(cè)一個(gè)窗口類時(shí)創(chuàng)建,并在窗口類的存在期間一直存在.要使窗口類創(chuàng)建它自己的類設(shè)備環(huán)境,必須設(shè)置CS_CLASSDC標(biāo)志,GetDC()只返回指向該類設(shè)備環(huán)境的指針.此外,在窗口類的存在期間,設(shè)備環(huán)境一直保留它的值.然而,在第1章中已提及,必須注
8、意不要讓兩個(gè)由相同的窗口類創(chuàng)建的窗口在同一時(shí)間繪圖;還應(yīng)注意Microsoft認(rèn)