第二章VC繪圖基礎(chǔ)_第1頁(yè)
第二章VC繪圖基礎(chǔ)_第2頁(yè)
第二章VC繪圖基礎(chǔ)_第3頁(yè)
第二章VC繪圖基礎(chǔ)_第4頁(yè)
第二章VC繪圖基礎(chǔ)_第5頁(yè)
已閱讀5頁(yè),還剩58頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、第二章第二章 Visual C+ 6.0繪圖基繪圖基礎(chǔ)礎(chǔ)基于基于MFC的圖形編程的圖形編程2.1 windows圖形系統(tǒng)圖形系統(tǒng)2.1.1 概述在Window環(huán)境中,圖形設(shè)備接口(Graphical Device Interface, GDI)與設(shè)備驅(qū)動(dòng)程序?qū)崿F(xiàn)了設(shè)備無(wú)關(guān)性的圖形。GDI是Windows用來(lái)管理圖形操作的一個(gè)與設(shè)備無(wú)關(guān)的模塊,提供了許多有關(guān)圖形操作的API函數(shù)。2.1.2 設(shè)備環(huán)境類(lèi)為了實(shí)現(xiàn)設(shè)備無(wú)關(guān)性,Windows提供了設(shè)備環(huán)設(shè)備環(huán)境境DC(Device Context)又稱(chēng)設(shè)備上下文設(shè)備上下文,也稱(chēng)設(shè)備描述表。 DC實(shí)際上是一種數(shù)據(jù)結(jié)構(gòu),是GDI的一部分。 用戶在繪圖之前,

2、必須獲取窗口區(qū)域的一個(gè)設(shè)備環(huán)境DC。接著才能進(jìn)行GDI函數(shù)的調(diào)用,執(zhí)行適合于設(shè)備環(huán)境DC的命令。 2.1.3 微軟基類(lèi)庫(kù)微軟基類(lèi)庫(kù)MFC:以C+形式封裝的Windows API(Application Program Interface),包含了一百多個(gè)已經(jīng)定義好的常用類(lèi)。 類(lèi)庫(kù)中提供了設(shè)備環(huán)境類(lèi)CDC,CDC封裝了Windows的DC,其父類(lèi)是CObject。CDC的派生類(lèi)有:CClientDC、CPaintDC、CMetafileDC和CWindowDC.派生類(lèi)名稱(chēng)說(shuō) 明CClientDC 這是一個(gè)設(shè)備描述表,提供對(duì)窗口客戶區(qū)域的圖形訪問(wèn)。在窗口中畫(huà)圖時(shí)可使用此類(lèi)DC,但對(duì)WM_PAINT

3、 Windows消息除外。CMetaFileDC 這個(gè)設(shè)備描述表代表Windows元文件,它包含一系列命令已重新產(chǎn)生圖像,想要?jiǎng)?chuàng)建獨(dú)立于設(shè)備的文件是可用此類(lèi)DC,用戶可以回放這種文件來(lái)創(chuàng)建圖像。CPaintDC 這是創(chuàng)建響應(yīng)WM_PAINT Windows消息的設(shè)備描述表。應(yīng)用程序可以使用此DC更新Windows顯示,通常在MFC應(yīng)用程序的OnPaint()函數(shù)中使用。CWindowDC 可以提供在整個(gè)窗口(包括客戶區(qū)和非客戶區(qū))中畫(huà)圖的設(shè)備描述表。CWindowDC類(lèi)與類(lèi)與CPaintDC和和CClientDC類(lèi)的區(qū)類(lèi)的區(qū)別:別: 用CPaintDC類(lèi)和CClientDC類(lèi)的對(duì)象繪制圖形時(shí),

4、繪制區(qū)只能是客戶區(qū),而不能在非客戶區(qū),而CWindowsDC可以在非客戶區(qū)進(jìn)行圖形繪制。 CWindowsDC一般在框架窗口類(lèi)中(CMainFrame)引用,在視圖窗口中引用CwindowsDC類(lèi)時(shí),由于視圖類(lèi)只能管理客戶區(qū),所以并不能在非客戶區(qū)進(jìn)行繪制。 在CWindowsDC繪圖類(lèi)下,坐標(biāo)系是建立在整個(gè)屏幕上的,在像素坐標(biāo)方式下,坐標(biāo)原點(diǎn)在屏幕的左上角,而在CPaintDC和CClientDC繪圖類(lèi)下,坐標(biāo)系是建立在客戶區(qū)上的,在像素坐標(biāo)方式下,坐標(biāo)原點(diǎn)在客戶區(qū)的左上角。 CPaintDC類(lèi)應(yīng)用在OnPaint函數(shù)中,以響應(yīng)Windows的WM_PAINT消息。而CClientDC應(yīng)用在非

5、響應(yīng)消息WM_PAINT的情況。 CPaintDC類(lèi)響應(yīng)WM_PAINT消息,自動(dòng)完成繪制,這對(duì)維護(hù)圖形的完整性有著重要的作用。 例如在一個(gè)窗口中,已經(jīng)繪制了n條直線,這個(gè)窗口的完整性可能會(huì)被破壞(如被對(duì)話框覆蓋),當(dāng)破壞完整性的程序結(jié)束時(shí),這個(gè)窗口就會(huì)接受到一個(gè)WM_PAINT消息,得到此消息后,激活消息處理函數(shù)(如OnPaint)進(jìn)行窗口繪制。如果現(xiàn)在想在屏幕上再繪制一條直線,就要用到CClientDC類(lèi),這個(gè)類(lèi)可以的將圖形繪制在屏幕上。1. 啟動(dòng)VC+6.0, 從File菜單中選擇New選項(xiàng), 并在對(duì)話框中,選擇Projects標(biāo)簽,然后單擊MFC MFC AppWizard(exeAp

6、pWizard(exe) )。在Location域中輸入一個(gè)合適的路徑名或單擊Browse按鈕來(lái)選擇一個(gè)。在Project name中輸入testtest作為項(xiàng)目名稱(chēng)。 單擊單擊OK按鈕按鈕,打開(kāi)打開(kāi)MFC AppWizard-Step1對(duì)話框。對(duì)話框。這個(gè)對(duì)話框用于選擇應(yīng)用程序的基本結(jié)構(gòu),我們?cè)趩芜x這個(gè)對(duì)話框用于選擇應(yīng)用程序的基本結(jié)構(gòu),我們?cè)趩芜x框中選擇框中選擇Single document,表表示選擇單文檔界面。示選擇單文檔界面。 單擊單擊Next按鈕,打開(kāi)按鈕,打開(kāi)MFC AppWizard-Step2 of 6對(duì)話框。該對(duì)話框用于選擇數(shù)據(jù)庫(kù)支持環(huán)境,本例中對(duì)話框。該對(duì)話框用于選擇數(shù)據(jù)庫(kù)

7、支持環(huán)境,本例中我們選擇我們選擇None, 表示不需要任何數(shù)據(jù)庫(kù)支持。表示不需要任何數(shù)據(jù)庫(kù)支持。單擊單擊Finish按鈕,彈出按鈕,彈出New Project Information 對(duì)話框?qū)υ捒?單擊單擊OK按鈕,按鈕,MFC AppWizard自動(dòng)生成為程序自動(dòng)生成為程序生成所需的開(kāi)始文件,并自動(dòng)在項(xiàng)目工作區(qū)打開(kāi)新項(xiàng)生成所需的開(kāi)始文件,并自動(dòng)在項(xiàng)目工作區(qū)打開(kāi)新項(xiàng)目目從從【ClassViewClassView】面板可以看出面板可以看出CTestAppCTestApp是應(yīng)用的主函數(shù)類(lèi),用來(lái)處理是應(yīng)用的主函數(shù)類(lèi),用來(lái)處理消息消息。MFCMFC中的中的數(shù)據(jù)數(shù)據(jù)是存儲(chǔ)在是存儲(chǔ)在CTestDocCTe

8、stDoc類(lèi)文檔中類(lèi)文檔中結(jié)果結(jié)果的的顯示顯示是在是在CTestViewCTestView類(lèi)中類(lèi)中文檔類(lèi)文檔類(lèi)負(fù)責(zé)管理和維護(hù)數(shù)據(jù)本身負(fù)責(zé)管理和維護(hù)數(shù)據(jù)本身視圖類(lèi)視圖類(lèi)負(fù)責(zé)處理用戶鼠標(biāo)和鍵盤(pán)的操作負(fù)責(zé)處理用戶鼠標(biāo)和鍵盤(pán)的操作運(yùn)行程序,選擇Build 菜單下的!Executive test.exe2.2.1. CDC類(lèi)對(duì)象的使用方式類(lèi)對(duì)象的使用方式:1.在視圖類(lèi)的OnDraw成員函數(shù)中使用 在視圖內(nèi)繪圖最常用的是使用在視圖內(nèi)繪圖最常用的是使用OnDraw函數(shù)。該函數(shù)是函數(shù)。該函數(shù)是Cview類(lèi)中的類(lèi)中的一個(gè)虛函數(shù),每次當(dāng)視圖需要重新繪制時(shí),應(yīng)用程序框架都會(huì)自動(dòng)調(diào)用一個(gè)虛函數(shù),每次當(dāng)視圖需要重新繪制

9、時(shí),應(yīng)用程序框架都會(huì)自動(dòng)調(diào)用OnDraw函數(shù)。當(dāng)用戶改變了窗口尺寸,或者當(dāng)窗口恢復(fù)了先前被遮蓋的函數(shù)。當(dāng)用戶改變了窗口尺寸,或者當(dāng)窗口恢復(fù)了先前被遮蓋的部分,或者當(dāng)應(yīng)用程序改變了窗口數(shù)據(jù)時(shí),應(yīng)用程序框架都會(huì)自動(dòng)調(diào)用部分,或者當(dāng)應(yīng)用程序改變了窗口數(shù)據(jù)時(shí),應(yīng)用程序框架都會(huì)自動(dòng)調(diào)用OnDraw函數(shù)。函數(shù)。void CTestView:OnDraw(CDC* pDC)CPixelDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);/ TODO: add draw code for native data herepDC-Ellipse(30,30,100,100)

10、;pDoc通過(guò)通過(guò)GetDocument()函函數(shù)得到了指向文檔類(lèi)數(shù)得到了指向文檔類(lèi)CTestDoc的指針。的指針。pDC定義為定義為CDC類(lèi)的指針類(lèi)的指針。使用使用pDC指針,可以對(duì)指針,可以對(duì)CDC類(lèi)的成員函數(shù)進(jìn)行操作。類(lèi)的成員函數(shù)進(jìn)行操作。ASSERT_VALID(pDoc)函函數(shù)使數(shù)使pDoc指針有效。指針有效。2. 在視圖窗口以外的窗口中使用窗口類(lèi)提供WM_PANT消息響應(yīng)函數(shù)OnPaint,以便繪制或重繪,還必須使用CPaintDC 派生類(lèi)對(duì)象。在使用OnPaint后,OnDraw失效。void CTestView:OnPaint() CPaintDC dc(this); / 定義

11、了一個(gè)對(duì)象dc/ TODO: Add your message handler code heredc.TextOut(0,0,在OnPaint函數(shù)中使用);dc.Ellipse(20,20,100,100);/ Do not call CView:OnPaint() for painting messages3. 在OnDraw與OnPaint以外的消息響應(yīng)函數(shù)中使用 必須使用CClientDC派生類(lèi)對(duì)象,如果函數(shù)在支持滾動(dòng)的視窗中使用,還需調(diào)用CscrollView:OnPrepareDC函數(shù)。void CMainFrame:On32771() /菜單命令響應(yīng)函數(shù)/ TODO: Add y

12、our command handler code hereCClientDC dc(this);dc.TextOut(200,100,在菜單命令消息響應(yīng)函數(shù)中使用);dc.Ellipse(100,200,200,300);2.2.2 繪圖函數(shù)1.點(diǎn)點(diǎn) 調(diào)用CDC類(lèi)成員函數(shù)SetPixel 可以繪制一個(gè)點(diǎn),調(diào)用GetPixel可以獲取點(diǎn)的顏色。COLORREF SetPixel(int x ,int y ,COLORREF crColor);COLORREF SetPixel(POINT point ,COLORREF crColor);COLORREF GetPixel(int x ,int

13、y ) const;COLORREF GetPixel(POINT point ,) const; 32位的COLORREF類(lèi)型值來(lái)確定圖形顏色值,其結(jié)構(gòu)為0 x00bbggrr,bb:代表藍(lán)色值,范圍從00到FF;gg:代表綠色值,范圍從00到FF;rr:代表紅色值,范圍從00到FF;還可以用還可以用RGB宏來(lái)完成相同的功能:宏來(lái)完成相同的功能:RGB(short red ,short green, short blue)red 代表紅色值,范圍從0到255;green代表綠色值,范圍從0到255;blue代表藍(lán)色值,范圍從0到255; void void CTestView:OnDraw(

14、CDCCTestView:OnDraw(CDC* * pDCpDC) ) CPixelDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);for(intfor(int i=0;i200;i+) i=0;iSetPixel(1-SetPixel(1* *i,50,RGB(0,0,255);i,50,RGB(0,0,255);for(intfor(int j=0;j200;j+) j=0;jSetPixel(2-SetPixel(2* *j,100,(COLORREF)0 x0000ff00);j,100,(COLORREF)0 x0000ff00);for(

15、intfor(int p=0;p200;p+) p=0;pSetPixel(5-SetPixel(5* *p,250,(COLORREF)0 x00ff00ff);p,250,(COLORREF)0 x00ff00ff); 2. 直線直線CPoint MoveTo(int x,int y);CPoint MoveTo(POINT point);BOOL LineTo(int x,int y);BOOL LineTo(POINT point);MoveTo移動(dòng)坐標(biāo)到當(dāng)前點(diǎn)LineTo從當(dāng)前點(diǎn)到終點(diǎn)畫(huà)一條直線void CTestView:OnDraw(CDC* pDC)CTestDoc* pDoc

16、 = GetDocument();ASSERT_VALID(pDoc);/ TODO: add draw code for native data here pDC-MoveTo(30,30); pDC-LineTo(200,300);3. 弧弧BOOL Arc(int x1,int y1,int x2,int y2,int x3,int y3, int x4,int y4);BOOL Arc(LPCRECT lpRect,POINT ptStart,POINT ptEnd); BOOL ArcTo(int x1,int y1,int x2,int y2,int x3,int y3,int x

17、4,int y4);BOOL ArcTo(LPCRECT lpRect,POINT ptStart,POINT ptEnd);x1,y1, x2,y2 : 邊界矩形左上角和右下角坐標(biāo)x3,y3, x4,y4 :弧線起點(diǎn)和終點(diǎn)坐標(biāo)lpRect:指定邊界矩形ptStart:指定弧線起點(diǎn)ptEnd:指定弧線終點(diǎn)void CTestView:OnDraw(CDC* pDC)CTestDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);/ TODO: add draw code for native data herepDC-Arc(50,50,200,150,10

18、,30,500,200);void CTestView:OnDraw(CDC* pDC)CTestDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);/ TODO: add draw code for native data hereCRect rect(45,25,85,150);CPoint pt1,pt2;pt1.x=5;pt1.y=5;pt2.x=250;pt2.y=30;pDC-ArcTo(rect,pt1,pt2);4. 折線折線BOOL Polyline(LPPOINT lpPoints,int nCount)BOOL PolylineTo(

19、const POINT *lpPoints,int nCount) lpPoints:指定折線的各個(gè)頂點(diǎn)坐標(biāo) nCount: 指定頂點(diǎn)的數(shù)目5. 矩形矩形BOOL Rectangle(int x1,int y1,int x2,int y2);BOOL Rectangle(LPCRECT lpRect);BOOL RoundRect(int x1,int y1,int x2,int y2,int x3,int y3);BOOL RoundRect(LPCRECT lpRect,POINT point); RoundRect:繪制圓角矩形 x3,y3,point :矩形圓角橢圓的寬度和高度void

20、 CTestView:OnDraw(CDC* pDC)CTestDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);/ TODO: add draw code for native data herepDC-Rectangle(20,20,100,60);pDC-RoundRect(150,20,200,150,20,15);6. 橢圓橢圓BOOL Ellipse(int x1,int y1,int x2,int y2);BOOL Ellipse(LPCRECT lpRect);7. 扇形扇形BOOL Pie(int x1,int y1,int x2,in

21、t y2,int x3,int y3);BOOL Pie(LPCRECT lpRect,POINT ptStart,POINT ptEnd);8. 多邊形多邊形BOOL Polygon(LPPOINT lpPoints,int nCount);void CTestView:OnDraw(CDC* pDC)CTestDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);/ TODO: add draw code for native data herepDC-Ellipse(20,70,140,150);CRect rect(250,150,300,100);

22、CPoint pt1,pt2;pt1.x=250;pt1.y=20;pt2.x=300;pt2.y=100;pDC-Pie(rect,pt1,pt2);CPoint p1(340,20); CPoint p2(320,80);CPoint p3(350,120); CPoint p4(420,100);CPoint p5(400,20); CPoint p5=p1,p2,p3,p4,p5;pDC-Polygon(p,5);CBitmap類(lèi):用于管理、繪制位圖資源的類(lèi)。CPen:用于管理線條繪制的類(lèi),通過(guò)Cpen類(lèi)對(duì)象,可以設(shè)置繪圖時(shí)的線型、線條寬度、顏色等屬性。CBrush:定義了畫(huà)刷,通過(guò)C

23、brush對(duì)象,可以設(shè)置繪制封閉圖形的填充色、填充模式等屬性。Cpalette:該類(lèi)用于管理應(yīng)用程序的調(diào)色板,使應(yīng)用程序的調(diào)色板與其他應(yīng)用程序不干擾。CRgn:該類(lèi)定義了區(qū)域,區(qū)域是由一個(gè)或多個(gè)封閉幾何體構(gòu)成的一個(gè)范圍,來(lái)進(jìn)行填充、鼠標(biāo)測(cè)試等工作。 Cfont:該類(lèi)用于管理字體,設(shè)置繪制文本的字體大小、字體樣式等屬性。 2.3.1 2.3.1 畫(huà)筆與畫(huà)刷畫(huà)筆與畫(huà)刷畫(huà)筆是一種用來(lái)畫(huà)線及繪制有形邊框的工具,用戶可以指定它的顏色及厚度,并且可以指定它畫(huà)實(shí)線、點(diǎn)線或虛線。畫(huà)刷是用來(lái)填充封閉圖形的。通過(guò)調(diào)用SelectStockObject選擇庫(kù)存畫(huà)筆或庫(kù)存畫(huà)刷。1. Windows提供的個(gè)庫(kù)存畫(huà)筆:提

24、供的個(gè)庫(kù)存畫(huà)筆: BLACK_PEN:黑色畫(huà)筆 NULL_PEN:空畫(huà)筆 WHITE_PEN:白色畫(huà)筆2. Windows提供的個(gè)庫(kù)存畫(huà)刷:提供的個(gè)庫(kù)存畫(huà)刷: BLACK_BRUSH:黑色畫(huà)刷 DKGRAY_BRUSH:深灰色畫(huà)刷 GRAY_BRUSH:灰色畫(huà)刷 HOLLOW_BRUSH:透明窗口畫(huà)刷 LTGRAY_BRUSH:淺灰色畫(huà)刷 NULL_BRUSH:空畫(huà)刷 WHITE_BRUSH:白色畫(huà)刷子void CHelloView:OnDraw(CDC* pDC)CHelloDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);CRect rect1(20

25、,20,320,220);CRect rect2(95,95,245,195);CPoint pt; pt.x=pt.y=10;CBrush *pBrush=(CBrush*) pDC-SelectStockObject(GRAY_BRUSH);pDC-RoundRect(rect1,pt);CPen *pPen=(CPen*) pDC-SelectStockObject(WHITE_PEN);pDC-RoundRect(rect2,pt);pDC-SelectObject(pPen);/恢復(fù)畫(huà)筆pDC-SelectObject(pBrush);/恢復(fù)畫(huà)刷3.自定義畫(huà)筆自定義畫(huà)筆調(diào)用CPen

26、類(lèi)成員函數(shù)CPen、CreatePen、CreatePenIndirect可以創(chuàng)建畫(huà)筆。CPen(int nPenStyle,int nWidth,COLORREF crColor);BOOL CreatePen(int nPenStyle,int nWidth,COLORREF crColor);BOOL CreatePenIndirect(LPLOGPEN lpLogPen);nPenStyle:設(shè)置畫(huà)筆的樣式。常用樣式如下: PS_SOLID:實(shí)線畫(huà)筆。 PS_DASH:虛線畫(huà)筆,僅當(dāng)線寬為1時(shí)有效。 PS_DOT:點(diǎn)線畫(huà)筆,僅當(dāng)線寬為1時(shí)有效。 PS_DASHDOT:點(diǎn)劃線畫(huà)筆,僅當(dāng)線

27、寬為1時(shí)有效。 PS_DASHDOTDOT:雙點(diǎn)劃線畫(huà)筆,線寬為1時(shí)有效 PS_NULL: 空筆不劃線。nWidth :指定畫(huà)筆寬度。lpLogPen:指向包含畫(huà)筆信息的LOGPEN結(jié)構(gòu)變量。LOGPEN結(jié)構(gòu)定義如下:typedef struct tagLOGPENUNIT lopnStyle; /設(shè)置畫(huà)筆的樣式POINT lopnWidth; /設(shè)置畫(huà)筆的寬度COLORREF lopnColor; /設(shè)置畫(huà)筆的顏色 LOGPEN;void CTestView:OnDraw(CDC* pDC)CTestDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);/

28、 TODO: add draw code for native data hereCPen NewPen(PS_SOLID,5,RGB(0,0,255);CPen *pOldPen=pDC-SelectObject(&NewPen);pDC-MoveTo(10,20);pDC-LineTo(500,200);pDC-SelectObject(pOldPen);4. 自定義畫(huà)刷自定義畫(huà)刷調(diào)用CBrush類(lèi)成員函數(shù)CBrush、CreateSolidBush、CreateHatchBrush、CreatePatternBrush和CreateBrushIndirect 等可以創(chuàng)建畫(huà)刷。CB

29、rush(COLORREF crColor);CBrush(int nIndex,COLORREF crColor);BOOL CreateSolidBrush(COLORREF crColor);BOOL CreateHatchBrush(int nIndex,COLORREF crColor);BOOL CreatePatternBrush(CBitmap *pBitmap);BOOL CreateBrushIndirect(const LOGBRUSH* lpLogBrush);nIndex:指定圖案的模式。可供選擇的模式如下: HS_BDIAGONAL:從左到右向下成45度的對(duì)角線。

30、HS_CROSS:水平線和垂直線相交的十字交叉線。 HS_DIAGCROSS:夾角為45度的斜十字交叉線。 HS_FDIAGONAL:從左到右向上成45度的對(duì)角線。 HS_HORIZONAL:水平陰影線。 HS_VERTICAL: 垂直陰影線。pBitmap:指定位圖對(duì)象lpLogBrush:指向包含畫(huà)刷信息的LOGBRUSH結(jié)構(gòu)變量void CTestView:OnDraw(CDC* pDC)CTestDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);/ TODO: add draw code for native data here CBrush N

31、ewBrush1(RGB(0,255,0);CBrush *pOldBrush1=pDC-SelectObject(&NewBrush1);pDC-Rectangle(50,50,200,300);pDC-SelectObject(pOldBrush1);2.3.2 2.3.2 填充函數(shù)填充函數(shù).繪制矩形邊框void FrameRect(LPCRECT lpRect,CBrush* pBrush); 2. 用畫(huà)刷子填充矩形區(qū)域void FillRect(LPCRECT lpRect,CBrush* pBrush);.用指定顏色填充矩形區(qū)域void FillSolidRect(LPCRE

32、CT lpRect,COLORREF clr);void FillSolidRect(int x int y,int cx,int cy,COLORREF clr);4. 用當(dāng)前顏色的相反色填充void InvertRect(LPCRECT lpRect);void CTestView:OnDraw(CDC* pDC)CTestDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);CRect rect1(50,50,150,100);CRect rect2(160,50,260,100);CRect rect3(50,110,150,160);CRect r

33、ect4(160,110,260,160);CBrush brush1(RGB(0,0,255);CBrush brush2(RGB(255,0,0);pDC-FillRect(rect1,&brush1);pDC-FrameRect(rect2,&brush2);pDC-FillSolidRect(rect3,RGB(0,255,0);pDC-FillRect(rect4,&brush1);pDC-InvertRect(rect4); 在VC+程序中輸出圖形和文本時(shí),如果不在OnDraw函數(shù)中輸出,則需要設(shè)置輸出對(duì)象的設(shè)備上下文,然后才能調(diào)用相應(yīng)的CDC類(lèi)的成員函數(shù),

34、最后還需要保證將設(shè)備上下文釋放給Windows,恢復(fù)原來(lái)的狀態(tài)以備下次調(diào)用。2.4.1 調(diào)用設(shè)備上下文調(diào)用設(shè)備上下文CDC* GetDC( );返回值:指定的客戶區(qū)設(shè)備上下文指針。返回值:指定的客戶區(qū)設(shè)備上下文指針。2.4.2釋放設(shè)備上下文釋放設(shè)備上下文int ReleaseDC(CDC* pDC);2.5.1 設(shè)備坐標(biāo)與邏輯坐標(biāo)設(shè)備坐標(biāo)與邏輯坐標(biāo) 設(shè)備坐標(biāo)也稱(chēng)為物理坐標(biāo),是指輸出設(shè)備上的坐標(biāo)。設(shè)備坐標(biāo)也稱(chēng)為物理坐標(biāo),是指輸出設(shè)備上的坐標(biāo)。屏幕上的設(shè)備坐標(biāo)原點(diǎn)在屏幕的左上角,屏幕上的設(shè)備坐標(biāo)原點(diǎn)在屏幕的左上角,X軸方向向右,軸方向向右,Y軸方向向下,單位為軸方向向下,單位為1像素。像素。 邏輯

35、坐標(biāo)是系統(tǒng)用作記錄的坐標(biāo),坐標(biāo)原點(diǎn)、邏輯坐標(biāo)是系統(tǒng)用作記錄的坐標(biāo),坐標(biāo)原點(diǎn)、X軸、軸、Y軸方向是由其使用的坐標(biāo)模式?jīng)Q定的。軸方向是由其使用的坐標(biāo)模式?jīng)Q定的。u邏輯坐標(biāo)與設(shè)備坐標(biāo)往往是不一致的。邏輯坐標(biāo)與設(shè)備坐標(biāo)往往是不一致的。u在在VC+6.0中,鼠標(biāo)光標(biāo)的坐標(biāo)是屏幕坐標(biāo),而所有的中,鼠標(biāo)光標(biāo)的坐標(biāo)是屏幕坐標(biāo),而所有的GDI繪圖函數(shù)都使用邏輯坐標(biāo)。繪圖函數(shù)都使用邏輯坐標(biāo)。 設(shè)備坐標(biāo)與邏輯坐標(biāo)的轉(zhuǎn)換函數(shù):設(shè)備坐標(biāo)與邏輯坐標(biāo)的轉(zhuǎn)換函數(shù):void DPtoLP(LPPOINT lpPoints,int nCount=1) constvoid DPtoLP(LPRECT lpRect) constvo

36、id DPtoLP(LPSIZE lpSize) constvoid LPtoDP(LPPOINT lpPoints,int nCount=1) constvoid LPtoDP(LPRECT lpRect) constvoid LPtoDP(LPSIZE lpSize) constn lpPoints:指向指向POINT結(jié)構(gòu)或結(jié)構(gòu)或CPoint對(duì)象的數(shù)組;對(duì)象的數(shù)組;n nCount:數(shù)組中的點(diǎn)數(shù);數(shù)組中的點(diǎn)數(shù);n lpRect:指定進(jìn)行坐標(biāo)轉(zhuǎn)換的矩形區(qū)域;指定進(jìn)行坐標(biāo)轉(zhuǎn)換的矩形區(qū)域;n lpSize指向指向SIZE結(jié)構(gòu)或結(jié)構(gòu)或CSize對(duì)象對(duì)象2.5.2 映射模式映射模式 映射模式也稱(chēng)為坐

37、標(biāo)模式,用于定義圖形方式、文本的映射模式也稱(chēng)為坐標(biāo)模式,用于定義圖形方式、文本的單位和坐標(biāo)增長(zhǎng)方式。單位和坐標(biāo)增長(zhǎng)方式。 1. 指定新的映射模式指定新的映射模式virtual int SetMapMode(int nMapMode); 2. 獲取的映射模式獲取的映射模式int GetMapMode() const;2.5.3 視區(qū)與邏輯窗口視區(qū)與邏輯窗口視區(qū)是應(yīng)用程序窗口的有效輸出區(qū)域,使用設(shè)備坐視區(qū)是應(yīng)用程序窗口的有效輸出區(qū)域,使用設(shè)備坐標(biāo),為了在視區(qū)內(nèi)能使用標(biāo),為了在視區(qū)內(nèi)能使用GDI輸出函數(shù),還要在視區(qū)上設(shè)輸出函數(shù),還要在視區(qū)上設(shè)置邏輯窗口。置邏輯窗口。1.設(shè)置視區(qū)設(shè)置視區(qū) virtua

38、l Csize SetViewportExt(int cx,int cy); virtual Csize SetViewportExt(SIZE size); virtual CPoint SetViewportOrg(int x,int y); virtual CPoint SetViewportOrg(POINT point);2. 設(shè)置邏輯窗口設(shè)置邏輯窗口 virtual Csize SetWindowExt(int cx,int cy); virtual Csize SetWindowExt(SIZE size); CPoint SetWindowOrg(int x,int y); C

39、Point SetWindowOrg(POINT point);n cx,cy:指定視區(qū)或窗口的指定視區(qū)或窗口的X軸和軸和Y軸范圍軸范圍n size:指定視區(qū)或窗口的范圍指定視區(qū)或窗口的范圍n x,y:指定視區(qū)或窗口的原點(diǎn)指定視區(qū)或窗口的原點(diǎn)n point:指定視區(qū)或窗口的原點(diǎn)指定視區(qū)或窗口的原點(diǎn)#include void CTestView:OnDraw(CDC*pDC) CRect rect; GetClientRect(&rect); rect.top+=10; rect.left+=10; rect.right-=10; rect.bottom-=10; pDC-SetMapM

40、ode(MM_ANISOTRPIC); /設(shè)置映射模式 pDC_SetViewportORG(10,10); /設(shè)置視區(qū)原點(diǎn) pDC-SetViewportExt(rect.right-rect.left,rect.bottom-rect.top)/設(shè)置視區(qū)范圍 pDC-SetWindowOrg(10,10); /設(shè)置邏輯窗口原點(diǎn) pDC-SetWindowExt(1800,10000); /設(shè)置邏輯窗口范圍 pDC-MoveTo(0,5000); Cpen pen(PS_SOLID,2,RGB(0,0,255); Cpen *pOld=pDC-SelectObject(&pen); for(int i=0;iLineTo(i,j); pDC-SelectObject(pOld);2.6.1菜單設(shè)計(jì)菜單設(shè)計(jì)1. 在工作區(qū)的Resource View標(biāo)簽中,單擊Menu項(xiàng)左邊“+”,然后雙擊其子項(xiàng)IDR_MAINFRAME.2. 雙擊右邊空白菜單,在Caption文本框中輸入菜單名稱(chēng),設(shè)計(jì)主菜單。3.雙擊主菜單下面

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論