第08章繪圖、字體和位圖.ppt_第1頁
第08章繪圖、字體和位圖.ppt_第2頁
第08章繪圖、字體和位圖.ppt_第3頁
第08章繪圖、字體和位圖.ppt_第4頁
第08章繪圖、字體和位圖.ppt_第5頁
已閱讀5頁,還剩33頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第8章 繪圖、字體和位圖,8.1 概述 8.2 簡單圖形的繪制 8.3 字體與文字處理 8.4 位圖、圖標與光標,8.1 概述,8.1.1 設(shè)備環(huán)境類 (1) CPaintDC CPaintDC類的構(gòu)造函數(shù)會自動調(diào)用BeginPaint,而它的析構(gòu)函數(shù)則會自動調(diào)用EndPaint。 (2) CClientDC 和CWindowDC CWindowDC和CClientDC構(gòu)造函數(shù)分別調(diào)用GetWindowDC和GetDC,但它們的析構(gòu)函數(shù)都是調(diào)用ReleaseDC函數(shù)。 (3)CMetaFileDC CMetaFileDC封裝了在一個Windows圖元文件中繪圖的方法。 8.1.1 坐標映射 為

2、了能保證打印的結(jié)果不受設(shè)備的影響,Windows定義了一些映射模式,這些映射模式?jīng)Q 定了設(shè)備坐標和邏輯坐標之間的關(guān)系。它們是: MM_TEXT 每個邏輯單位等于一個設(shè)備像素,x向右為正,y向下為正 MM_HIENGLISH 每個邏輯單位為0.001英寸,x向右為正,y向上為正 MM_HIMETRIC 每個邏輯單位為0.01毫米,x向右為正,y向上為正 MM_ANISOTROPICx,y可變比例 MM_ISOTROPIC x,y等比例 MM_LOENGLISH 每個邏輯單位為0.01英寸,x向右為正,y向上為正 MM_LOMETRIC 每個邏輯單位為0.1毫米,x向右為正,y向上為正 MM_TW

3、IPS 每個邏輯單位為一個點的1/20(一個點是1/72 英寸), x向右為正,y向上為正。,8.1 概述,在MM_ISOTROPIC映射模式下,縱橫比總是1:1,換句話說,無論比例因子如何變化,圓總是圓的;但在MM_ANISOTROPIC映射模式下,x和y的比例因子可以獨立地變化,即圓可以被拉扁成橢圓形狀。 將一個橢圓繪制在視窗中央,且當(dāng)視圖的大小發(fā)生改變時,橢圓的形狀也會隨之改變: void CMyView:OnDraw(CDC* pDC) CRect rectClient; GetClientRect(rectClient);/ 獲得當(dāng)前窗口的客戶區(qū)大小 pDC-SetMapMode(M

4、M_ANISOTROPIC);/ 設(shè)置MM_ANISOTROPIC映射模式 pDC-SetWindowExt(1000,1000);/ 設(shè)置窗口范圍 pDC-SetViewportExt(rectClient.right,-rectClient.bottom);/ 設(shè)置視口范圍 pDC-SetViewportOrg(rectClient.right/2,rectClient.bottom/2);/ 設(shè)置視口原點 pDC-Ellipse(CRect(-500,-500,500,500); 8.1.3 圖形設(shè)備接口 1. 使用GDI對象 在選擇GDI對象進行繪圖時,往往遵循著下列的步驟: (1)

5、在堆棧中定義一個GDI對象(如CPen、CBrush對象),然后用相應(yīng)的函數(shù)(如CreatePen、CreateSolidBrush)創(chuàng)建此GDI對象。,8.1 概述,(2) 將構(gòu)造的GDI對象選入當(dāng)前設(shè)備環(huán)境中,但不要忘記將原來的GDI對象保存起來。 (3) 繪圖結(jié)束后,恢復(fù)當(dāng)前設(shè)備環(huán)境中原來的GDI對象。 (4) 由于GDI對象是在堆棧中創(chuàng)建中,當(dāng)程序結(jié)束后,框架會自動刪除程序創(chuàng)建的GDI對象。 具體操作可像下面的代碼過程: void CMyView:OnDraw( CDC* pDC ) CPen penBlack; / 定義一個畫筆變量 penBlack.CreatePen( PS_SO

6、LID, 2, RGB(0,0,0); / 創(chuàng)建畫筆 / 將此畫筆選入當(dāng)前設(shè)備環(huán)境并保存原來的畫筆 CPen* pOldPen = pDC-SelectObject( / 恢復(fù)設(shè)備環(huán)境中原來的畫筆 2. 庫存的GDI對象 Windows包含了一些庫存的可以利用的GDI對象。CDC的成員函數(shù)SelectStockObject可以把一個庫存對象選入當(dāng)前設(shè)備環(huán)境中,并返回原先被選中的對象指針,同時使原先被選中的對象從設(shè)備環(huán)境中分離出來。如下面的代碼:,8.1 概述,void CMyView:OnDraw( CDC* pDC ) CPen newPen( PS_SOLID, 2, RGB(0,0,0)

7、 ) ) pDC-SelectObject( / newPen被分離出來 函數(shù)SelectStockObject可選用的庫存GDI對象類型可以是下列值之一: BLACK_BRUSH 黑色畫刷 DKGRAY_BRUSH 深灰色畫刷 GRAY_BRUSH 灰色畫刷 HOLLOW_BRUSH 中空畫刷 LTGRAY_BRUSH 淺灰色畫刷 NULL_BRUSH 空畫刷 WHITE_BRUSH 白色畫刷 BLACK_PEN 黑色畫筆 NULL_PEN 空畫筆 WHITE_PEN 白色畫筆 DEVICE_DEFAULT_FONT 設(shè)備默認字體 SYSTEM_FONT 系統(tǒng)字體,8.1 概述,8.1.4

8、顏色和顏色對話框 在MFC中,CDC使用的是RGB顏色空間。其中,COLORREF是用來表示RGB顏色的一個32位的數(shù)據(jù)類型,它可以用下列的十六進制表示一個RGB值: 0 x00bbggrr 在具體操作RGB顏色時,還可使用下列的宏操作: GetBValue 獲得32位RGB顏色值中的藍色分量 GetGValue 獲得32位RGB顏色值中的綠色分量 GetRValue 獲得32位RGB顏色值中的紅色分量 RGB 將指定的R、G、B分量值轉(zhuǎn)換成一個32位的RGB顏色值。 MFC的CColorDialog類為我們應(yīng)用程序提供了顏色選擇通用對話框,它具有下列的構(gòu)造函數(shù): CColorDialog(

9、COLORREF clrInit = 0, DWORD dwFlags = 0, CWnd* pParentWnd = NULL ); 我們可以在CColorDialog提供的顏色列表中選擇一種顏色或定制一種顏色。當(dāng)該對話框“OK”退出(即DoModal返回 IDOK)時,還可以調(diào)用下列成員獲得相應(yīng)的顏色。 COLORREF GetColor( ) const;/ 返回用戶選擇的顏色。 void SetCurrentColor( COLORREF clr );/ 強制使用clr作為當(dāng)前選擇的顏色 static COLORREF * GetSavedCustomColors( );/ 返回用戶自

10、己定義顏色 例如,下面的代碼片斷: CColorDialogdlg; if (dlg. DoModal() != IDOK) return; COLORREF myColor = dlg.GeColor();,8.1 概述,8.1.5 簡單數(shù)據(jù)類CPoint、CSize和CRect 1 CPoint、CSize和CRect類的構(gòu)造函數(shù) CPoint類帶參數(shù)的常用構(gòu)造函數(shù)原型如下: CPoint( int initX, int initY ); CPoint( POINT initPt ); CSize類帶參數(shù)的常用構(gòu)造函數(shù)原型如下: CSize( int initCX, int initCY

11、); CSize( SIZE initSize ); CRect類帶參數(shù)的常用構(gòu)造函數(shù)原型如下: CRect( int l, int t, int r, int b ); CRect( const RECT 2 CPoint、CSize和CRect的基本運算符操作 (1) “+”操作 若向CPoint對象加上一個CSize對象,則返回CPoint對象。 若向CRect對象加上一個CPoint對象或CSize對象,則返回CRect對象。 若向CRect對象加上一個CSize對象,則將一個RECT(或CRect)值偏移(移動)CSize大小,,8.1 概述,(2) “-”操作 若從CPoint對象

12、減去一個CSize對象,則返回一個CPoint對象。 若從CPoint對象減去一個CPoint對象,則返回一個CSize對象。 若從CRect對象減去一個CPoint對象或CSize對象,則返回一個CRect對象。 3 CRect類的常用操作 由于一個CRect類對象包含用于定義矩形的左上角和右下角點的成員變量,因此在傳遞 LPRECT、LPCRECT或RECT結(jié)構(gòu)作為參數(shù)的任何地方,都可以使用CRect對象來代替。 成員函數(shù)InflateRect和DeflateRect用來擴大和縮小一個矩形。由于它們的操作是相互的, 也就是說,若指定InflateRect函數(shù)的參數(shù)為負值,那么操作的結(jié)果是縮

13、小矩形,因此下面只給 出InflateRect函數(shù)的原型: void InflateRect( int x, int y ); void InflateRect( SIZE size ); void InflateRect( LPCRECT lpRect ); void InflateRect( int l, int t, int r, int b ); 成員函數(shù)IntersectRect和UnionRect分別用來將兩個矩形進行相交和合并,當(dāng)結(jié)果為空時 返回FALSE,否則返回TRUE。它們的原型如下: BOOL IntersectRect( LPCRECT lpRect1, LPCRECT

14、 lpRect2 ); BOOL UnionRect( LPCRECT lpRect1, LPCRECT lpRect2 );,8.1 概述,其中,lpRect1和lpRect2用來指定操作的兩個矩形。例如: CRect rectOne(125, 0, 150, 200); CRect rectTwo( 0, 75, 350, 95); CRect rectInter; rectInter.IntersectRect(rectOne, rectTwo);/ 結(jié)果為(125, 75, 150, 95) ASSERT(rectInter = CRect(125, 75, 150, 95); rec

15、tInter.UnionRect (rectOne, rectTwo);/ 結(jié)果為(0, 0, 350, 200) ASSERT(rectInter = CRect(0, 0, 350, 200);,8.2簡單圖形的繪制,8.2.1 創(chuàng)建畫筆 創(chuàng)建一個修飾畫筆,可以使用CPen類的CreatePen函數(shù),其原型如下: BOOL CreatePen( int nPenStyle, int nWidth, COLORREF crColor ); 其中,參數(shù)nPenStyle、nWidth、crColor分別用來指定畫筆的風(fēng)格、寬度和顏色。 BOOL CreatePenIndirect( LPLOG

16、PEN lpLogPen ); 此函數(shù)用由LOGPEN結(jié)構(gòu)指針指定的相關(guān)參數(shù)創(chuàng)建畫筆,LOGPEN結(jié)構(gòu)如下: typedef struct tagLOGPEN /* lgpn */ UINT lopnStyle;/ 畫筆風(fēng)格,同上 POINT lopnWidth;/ POINT結(jié)構(gòu)的y不起作用,而用x表示畫筆寬度 COLORREF lopnColor;/ 畫筆顏色 LOGPEN; 值得注意的是: n 當(dāng)修飾畫筆的寬度大于1個像素時,畫筆的風(fēng)格只能取PS_NULL、PS_SOLID或 PS_INSIDEFRAME,定義為其他風(fēng)格不會起作用。 n 畫筆的創(chuàng)建工作也可在畫筆的構(gòu)造函數(shù)中進行,它具有下

17、列原型: CPen( int nPenStyle, int nWidth, COLORREF crColor );,8.2簡單圖形的繪制,8.2.2 創(chuàng)建畫刷 畫刷用于指定填充的特性,許多窗口、控件以及其他區(qū)域都需要用畫刷進行填充繪制, 它比畫筆的內(nèi)容更加豐富。 畫刷的屬性通常包括填充色、填充圖案和填充樣式三種。 CBrush類根據(jù)畫刷屬性提供了相應(yīng)的創(chuàng)建函數(shù),例如創(chuàng)建填充色畫刷和填充樣式畫刷的函數(shù)為CreateSolidBrush和CreateHatchBrush,它們的原型如下: BOOL CreateSolidBrush( COLORREF crColor );/ 創(chuàng)建填充色畫刷 BOO

18、L CreateHatchBrush( int nIndex, COLORREF crColor );/ 創(chuàng)建填充樣式畫刷 與畫筆相類似,也有一個LOGBRUSH 邏輯結(jié)構(gòu)用于畫刷屬性的定義,并通過CBrush的成員函數(shù)CreateBrushIndirect來創(chuàng)建,其原型如下: BOOL CreateBrushIndirect( const LOGBRUSH* lpLogBrush ); 其中,LOGBRUSH 邏輯結(jié)構(gòu)如下定義: typedef struct tagLOGBRUSH / lb UINT lbStyle; / 風(fēng)格 COLORREF lbColor; / 填充色 LONG lb

19、Hatch; / 填充樣式 LOGBRUSH;,8.2簡單圖形的繪制,另外,還需注意: n 畫刷的創(chuàng)建工作也可在其構(gòu)造函數(shù)中進行,它具有下列原型: CBrush( COLORREF crColor ); CBrush( int nIndex, COLORREF crColor ); CBrush( CBitmap* pBitmap ); n畫刷也可用位圖來指定其填充圖案,但該位圖應(yīng)該是88像素,若位圖太大,Windows則只使用其左上角的8行8列的像素。 n畫刷僅對繪圖函數(shù)Chord、Ellipse、FillRect、FrameRect、InvertRect、Pie、Polygon、PolyP

20、olygon、Rectangle、RoundRect有效。 例Ex_GDI 繪制簡單圖形,其結(jié)果如右圖所示。 創(chuàng)建的單文檔應(yīng)用程序為Ex_GDI,將代碼添加 在CEx_GDIView:OnDraw中,則有: void CEx_GDIView:OnDraw(CDC* pDC) CEx_GDIDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); int data20 = 19,21,32,40,41,39,42,35, 33,23,21,20,24,11,9,19,22,32,40,42; CRectrc; GetClientRect(rc);/ 獲得客戶區(qū)

21、的大小,8.2簡單圖形的繪制,rc.DeflateRect(50,50);/ 將矩形大小沿x和y方向各減小50 intgridXnums = 10, gridYnums = 8; intdx = rc.Width()/gridXnums; intdy = rc.Height()/gridYnums; CRect gridRect(rc.left,rc.top,rc.left+dx*gridXnums,rc.top+dy*gridYnums); / 調(diào)整矩形大小 CPen gridPen(0,0,RGB(0,100,200); CPen* oldPen = pDC-SelectObject(/

22、重新創(chuàng)建畫筆,8.2簡單圖形的繪制,pDC-SelectObject(/ 繪制折線,8.2簡單圖形的繪制,/ 恢復(fù)原來繪圖屬性 pDC-SelectObject(oldPen); pDC-SelectObject(oldBrush); 需要說明的是: n大多數(shù)的繪圖函數(shù)一般都是添加在用戶視圖中的OnDraw函數(shù)內(nèi),這時因為OnDraw是CView類的一個虛成員函數(shù),每當(dāng)視窗需要被重新繪制時,系統(tǒng)都要調(diào)用OnDraw函數(shù)。當(dāng)與OnDraw類似的還有OnPaint函數(shù)。 n 若對同一個GDI對象重新構(gòu)造,則必須調(diào)用Detach函數(shù)把該對象從GDI中分離出來。 n在畫直線時,總存在一個稱為“當(dāng)前位置

23、”的特殊位置。有了“當(dāng)前位置”的自動更新,就可避免了每次畫線時都要給出兩點的坐標。當(dāng)然,這個當(dāng)前位置還可用函數(shù) CDC:GetCurrentPosition來獲得,其原型如下: CPoint GetCurrentPosition( ) const;,8.3 字體與文字處理,8.3.1 字體和字體對話框 1. 字體的屬性和創(chuàng)建 字體的屬性有很多,但其主要屬性主要有字樣、風(fēng)格和尺寸三個。 邏輯字體的具體屬性可由LOGFONT結(jié)構(gòu)來描述。 typedef struct tagLOGFONT LONG lfHeight; / 字體的邏輯高度 LONG lfWidth; / 字符的平均邏輯寬度 LONG

24、 lfEscapement; / 傾角 LONG lfOrientation; / 書寫方向 LONG lfWeight; / 字體的粗細程度 BYTE lfItalic; / 斜體標志 BYTE lfUnderline; / 下劃線標志 BYTE lfStrikeOut; / 刪除線標志 BYTE lfCharSet; / 字符集,漢字必須為GB2312_CHARSET BYTE lfOutPrecision; / 字符輸出精度 BYTE lfClipPrecision; / 裁剪精度 BYTE lfQuality; / 邏輯字體與物理字體的相似程度,8.3 字體與文字處理,BYTE lfP

25、itchAndFamily; / 字符的間隔和字體的類型 TCHAR lfFaceNameLF_FACESIZE;/ 字樣名稱 LOGFONT; 在結(jié)構(gòu)成員中,lfHeight表示字符的邏輯高度,這里的高度是字符的純高度 。 若對于MM_TEXT映射模式,當(dāng)用指定的點的大小來確定字符高度時,我們可以使用下列的公式: lfHeight = -MulDiv(PointSize, GetDeviceCaps(hDC, LOGPIXELSY), 72); 根據(jù)定義的邏輯字體,用戶就可以調(diào)用CFont類的CreateFontIndirect函數(shù)創(chuàng)建文本輸出所需要的字體,如下面的代碼: LOGFONT l

26、f;/ 定義邏輯字體的結(jié)構(gòu)變量 memset(,8.3 字體與文字處理,pDC-SelectObject(oldfont);/ 恢復(fù)設(shè)備環(huán)境原來的屬性 cf.DeleteObject();/ 刪除字體對象 2. 使用字體對話框 CFontDialog類為我們提供了字體及其文本顏色選擇的通用對話框。它的構(gòu)造函數(shù)如下: CFontDialog( LPLOGFONT lplfInitial = NULL, DWORD dwFlags = CF_EFFECTS | CF_SCREENFONTS, CDC* pdcPrinter = NULL, CWnd* pParentWnd = NULL ); 當(dāng)字

27、體對話框DoModal返回IDOK后,可使用下列的成員函數(shù): void GetCurrentFont( LPLOGFONT lplf );/ 返回用戶選擇的LOGFONT字體 CString GetFaceName( ) const;/ 返回用戶選擇的字體名稱 CString GetStyleName( ) const;/ 返回用戶選擇的字體樣式名稱 int GetSize( ) const;/ 返回用戶選擇的字體大小 COLORREF GetColor( ) const;/ 返回用戶選擇的文本顏色 int GetWeight( ) const;/ 返回用戶選擇的字體粗細程度 BOOL IsS

28、trikeOut( ) const;/ 判斷是否有刪除線 BOOL IsUnderline( ) const;/ 判斷是否有下劃線 BOOL IsBold( ) const;/ 判斷是否是粗體 BOOL IsItalic( ) const;/ 判斷是否是斜體,8.3 字體與文字處理,例如下列代碼是通過字體對話框來創(chuàng)建一個字體的: LOGFONT lf; CFontcf; memset(,8.3 字體與文字處理,TabbedTextOut也是用當(dāng)前字體在指定位置處顯示一個文本,但它還根據(jù)指定的制表位(Tab)設(shè)置相應(yīng)字符位置,函數(shù)成功時返回輸出文本的大小。 需要說明的是,默認時,上述文本輸出函數(shù)

29、既不使用也不更新“當(dāng)前位置”。若要使用和更新“當(dāng)前位置”,則必須調(diào)用SetTextAlign,并將參數(shù)nFlags設(shè)置為TA_UPDATECP。 8.3.3 本格式化屬性 文本的格式屬性通常包括文本顏色、對齊方式、字符間隔以及文本調(diào)整等。 在CDC類中,SetTextColor、SetBkColor和SetBkMode函數(shù)就是分別用來設(shè)置文本顏色、文本背景色和背景模式,而與之相對應(yīng)的GetTextColor、GetBkcolor和GetBkMode函數(shù)則是分別獲取這三項屬性的。它們的原型如下: virtual COLORREF SetTextColor( COLORREF crColor );

30、 COLORREF GetTextColor( ) const; virtual COLORREF SetBkColor( COLORREF crColor ); COLORREF GetBkColor( ) const; int SetBkMode( int nBkMode ); int GetBkMode( ) const; 文本對齊方式的設(shè)置和獲取是由CDC函數(shù)SetTextAlign和GetTextAlign決定的。它們的原型如下: UINT SetTextAlign( UINT nFlags ); UINT GetTextAlign( ) const;,8.3 字體與文字處理,上述兩

31、個函數(shù)中所用到的文本對齊標志如下表所示。 8.3.4計算字符的幾何尺寸 在CDC類中,GetTextMetrics(LPTEXTMETRIC lpMetrics)是用來獲得指定映射模式下相關(guān)設(shè)備環(huán)境的字符幾何尺寸及其它屬性的,其TEXTMETRIC結(jié)構(gòu)描述如下: typedef struct tagTEXTMETRIC int tmHeight; / 字符的高度 (ascent + descent) int tmAscent; / 高于基準線部分的值 int tmDescent;/ 低于基準線部分的值 int tmInternalLeading; / 字符內(nèi)標高 int tmExternalL

32、eading; / 字符外標高,8.3 字體與文字處理,int tmAveCharWidth; / 字體中字符平均寬度 int tmMaxCharWidth; / 字符的最大寬度 int tmWeight; / 字體的粗細 BYTE tmItalic; / 非0表示斜體 BYTE tmUnderlined; / 非0表示加下劃線 BYTE tmStruckOut;/ 非0表示帶有刪除線 BYTE tmFirstChar;/ 字體的第一個字符 BYTE tmLastChar; / 字體的最后一個字符 BYTE tmDefaultChar;/ 指定不在字體中的字符的替換字符 BYTE tmBrea

33、kChar; / 用于定義換行字符 BYTE tmPitchAndFamily; / 字符的間隔和字體的類型 BYTE tmCharSet; / 字符集 int tmOverhang; / 一些特殊字體的額外寬度 int tmDigitizedAspectX; / 字體的水平比例 int tmDigitizedAspectY; / 字體的垂直比例 TEXTMETRIC; 通常,字符的總高度是用tmHeight和tmExternalLeading的總和來表示的。,8.3 字體與文字處理,在CDC類中,計算字符串的寬度和高度的函數(shù)主要兩個:GetTextExtent函數(shù)和GetTabbedText

34、Extent函數(shù)。它們的原型如下: CSize GetTextExtent( LPCTSTR lpszString, int nCount ) const; CSize GetTextExtent( const CString,8.3 字體與文字處理,while (ar.ReadString(str) m_strContents.Add(str); (4) 為CEx_TextView類添加LOGFONT類型的成員變量m_lfText,用來保存當(dāng)前所使用的邏輯字體。 (5) 在CEx_TextView類構(gòu)造函數(shù)中添加m_lfText的初始化代碼: CEx_TextView:CEx_TextVie

35、w() memset( (6) 用ClassWizard為CEx_TextView類添加WM_LBUTTONDBLCLK(雙擊鼠標)的消息映射函數(shù),并增加下列代碼:,8.3 字體與文字處理,void CEx_TextView:OnLButtonDblClk(UINT nFlags, CPoint point) CFontDialog dlg(,8.3 字體與文字處理,/ 計算每行高度 TEXTMETRIC tm; pDC-GetTextMetrics( ,8.3 字體與文字處理,pDC-SelectObject(oldFont); int nLines = pDoc-m_strContents

36、.GetSize() + 1;/ 多算一行 CSize sizeTotal; sizeTotal.cx = lineMaxWidth; sizeTotal.cy = lineHeight * nLines; SetScrollSizes(MM_TEXT, sizeTotal);/ 設(shè)置滾動邏輯窗口的大小 (8) 編譯運行并測試,打開任意一個文本文件,結(jié)果如下圖5所示。,8.4 位圖、圖標與光標,8.4.1使用圖形編輯器 利用Visual C+ 6.0提供的圖形編輯器,可以完成下列操作: n 繪制新的位圖、圖標和光標。 n 選用或定制顯示設(shè)備 n 設(shè)置光標“熱點” n 使用256色繪制圖標和光標

37、 下面僅介紹顯示設(shè)備的選用和定制以及光標“熱點”的設(shè)置。 1 選用和定制顯示設(shè)備 用戶在創(chuàng)建新圖標或光標的時候,圖形編輯器首先創(chuàng)建的是一個適合于VGA環(huán)境中的圖像。默認情況下,圖形編輯器所支持的顯示設(shè)備如下表所示。 2.設(shè)置光標熱點,8.4 位圖、圖標與光標,Windows系統(tǒng)借助光標“熱點”來確定光標實際的位置。默認時,光標熱點是圖像左上角(0,0)的點,當(dāng)然,這個熱點位置可能重新指定,具體步驟如下: (1)打開光標資源。 (2)在圖形編輯器的控制條上,單擊Hot Spot按鈕。 (3)在光標圖像上單擊要指定的像素點,此時會看到在控制條上自動顯示所點中的像素點的坐標。 (4) 重復(fù)2、3兩步

38、,直到指定的熱點位置滿意為止。 8.4.1 位圖 Windows的位圖有兩種類型:一種稱之為GDI位圖,另一種是DIB位圖。 1 CBitmap類 CBitmap類封裝了Windows的GDI位圖操作所需的大部分函數(shù),這主要包括位圖的初始化函數(shù)。例如: BOOL LoadBitmap( LPCTSTR lpszResourceName ); BOOL LoadBitmap( UINT nIDResource ); BOOL LoadOEMBitmap( UINT nIDBitmap ); 若用戶直接創(chuàng)建一個位圖對象,可使用CBitmap類中的CreateBitmap、 CreateBitmap

39、Indirect以及CreateCompatibleBitmap函數(shù),其原型如下。 BOOL CreateBitmap( int nWidth, int nHeight, UINT nPlanes, UINT nBitcount, const void* lpBits );,8.4 位圖、圖標與光標,BOOL CreateBitmapIndirect( LPBITMAP lpBitmap ); 該函數(shù)直接用BITMAP結(jié)構(gòu)來創(chuàng)建一個位圖對象。 BOOL CreateCompatibleBitmap( CDC* pDC, int nWidth, int nHeight ); 該函數(shù)為某設(shè)備環(huán)境創(chuàng)

40、建一個指定的寬度(nWidth)和高度(nHeight)的位圖對象。 2 GDI位圖的顯示 由于位圖不能直接顯示在實際設(shè)備中,因此對于GDI位圖的顯示則必須遵循下列步驟: (1) 調(diào)用CBitmap類的CreateBitmap、CreateCompatibleBitmap以及 CreateBitmapIndirect函數(shù)創(chuàng)建一個適當(dāng)?shù)奈粓D對象。 (2) 調(diào)用CDC:CreateCompatibleDC函數(shù)創(chuàng)建一個內(nèi)存設(shè)備環(huán)境,以便位圖在內(nèi)存中保存下來,并與指定設(shè)備(窗口設(shè)備)環(huán)境相兼容; (3) 調(diào)用CDC:SelectObject函數(shù)將位圖對象選入內(nèi)存設(shè)備環(huán)境中; (4) 調(diào)用CDC:Bit

41、Blt或CDC:StretchBlt函數(shù)將位圖復(fù)制到實際設(shè)備環(huán)境中。 (5) 使用之后,恢復(fù)原來的內(nèi)存設(shè)備環(huán)境。 例Ex_BMP 顯示BMP位圖文件。 創(chuàng)建一個單文檔應(yīng)用程序Ex_BMP,從外部文件中調(diào)入一張位圖作為應(yīng)用程序的位圖資源(IDB_BITMAP1),則下面的代碼是將其顯示在視圖的客戶區(qū)內(nèi): void CEx_BMPView:OnDraw(CDC* pDC) CEx_BMPDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc);,8.4 位圖、圖標與光標,CBitmap m_bmp; m_bmp.LoadBitmap(IDB_BITMAP1);/

42、調(diào)入位圖資源 BITMAP bm; m_bmp.GetObject(sizeof(BITMAP),8.4 位圖、圖標與光標,8.4.3 圖標 一個應(yīng)用程序允許有兩個尺寸不一的圖標來標識自己的身份:一種是普通圖標,也稱為大圖標,它是32 x 32的位圖。另一種是小圖標,它是大小為16 x 16的位圖。 1 圖標的調(diào)入和清除 在MFC中,使用CWinApp:LoadIcon函數(shù)可將一個圖標資源調(diào)入并返回一個圖標句柄。函數(shù)原型如下: HICON LoadIcon( LPCTSTR lpszResourceName ) const; HICON LoadIcon( UINT nIDResource )

43、 const; 其中,lpszResourceName和nIDResource分別表示圖標資源的字符串名和標識。 如果不想創(chuàng)建新的圖標資源,也可使用系統(tǒng)中預(yù)定義好的標準圖標,這時需調(diào)用 CWinApp:LoadStandardIcon 函數(shù),其原型如下: HICON LoadStandardIcon( LPCTSTR lpszIconName ) const; 其中,lpszIconName可以是下列值之一: IDI_APPLICATION 默認的應(yīng)用程序圖標 IDI_HAND 手形圖標(用于嚴重警告) IDI_QUESTION 問號圖標(用于提示消息) IDI_EXCLAMATION 警告消

44、息圖標(驚嘆號) IDI_ASTERISK 消息圖標 全局函數(shù)DestroyIcon可以用來刪除一個圖標,并釋放為圖標分配的內(nèi)存,其原型如下 BOOL DestroyIcon( HICON hIcon );,8.4 位圖、圖標與光標,2 圖標的繪制 函數(shù)CDC:DrawIcon用來將一個圖標繪制在指定的位置處,其原型如下: BOOL DrawIcon( int x, int y, HICON hIcon ); BOOL DrawIcon( POINT point, HICON hIcon ); 其中,(x, y)和point用來指定圖標繪制的位置,而hIcon用來指定要繪制的圖標句柄。 3 應(yīng)

45、用程序圖標的改變 在用MFC AppWizard創(chuàng)建的應(yīng)用程序中,圖標資源IDR_MAINFRAME用來表示應(yīng)用程序窗口的圖標。實際上,程序中還可使用GetClassLong和SetClassLong函數(shù)重新指定應(yīng)用程序窗口的圖標,函數(shù)原型如下: DWORD SetClassLong( HWND hWnd, int nIndex, LONG dwNewLong); DWORD GetClassLong( HWND hWnd, int nIndex); nIndex用來指定與WNDCLASSEX結(jié)構(gòu)相關(guān)的索引,它可以是下列值之一: GCL_HBRBACKGROUND 窗口類的背景畫刷句柄 GCL

46、_HCURSOR 窗口類的的光標句柄 GCL_HICON窗口類的的圖標句柄 GCL_MENUNAME 窗口類的的菜單資源名稱 例Ex_Icon 圖標按一定的序列顯示, 模擬動畫效果。 (1) 用MFC AppWziard創(chuàng)建一個單文檔應(yīng)用程序Ex_Icon。,8.4 位圖、圖標與光標,(2) 創(chuàng)建六個圖標,大小為1616,ID號分別為默認的IDI_ICON1 IDI_ICON4。用圖形編輯器繪制圖標,結(jié)果如下圖所示。 (3) 為CMainFrame類添加一個成員函數(shù)ChangeIcon,用來切換應(yīng)用程序的圖標。該函數(shù)的代碼如下: void CMainFrame:ChangeIcon(UINT

47、nIconID) HICON hIconNew = AfxGetApp()-LoadIcon(nIconID); HICON hIconOld = (HICON)GetClassLong(m_hWnd, GCL_HICON); if (hIconNew != hIconOld) ,8.4 位圖、圖標與光標,DestroyIcon(hIconOld); SetClassLong(m_hWnd, GCL_HICON, (long)hIconNew); RedrawWindow();/ 重繪窗口 (4) 在CMainFrame:OnCreate函數(shù)的最后添加計時器設(shè)置代碼: int CMainFra

48、me:OnCreate(LPCREATESTRUCT lpCreateStruct) if (CFrameWnd:OnCreate(lpCreateStruct) = -1)return -1; . SetTimer(1, 500, NULL); return 0; (5) 用ClassWizard為CMainFrame類添加WM_TIMER的消息映射函數(shù),并增加下列代碼: void CMainFrame:OnTimer(UINT nIDEvent) static int icons = IDI_ICON1, IDI_ICON2, IDI_ICON3, IDI_ICON4; static int index = 0;,8.4 位圖、圖標與光標,ChangeIcon(iconsindex); index+; if (index3) index = 0; CFrameWnd:OnTimer(nIDEvent); (6) 用ClassWizard為CMainFrame類添加WM_DESTROY的消息

溫馨提示

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

最新文檔

評論

0/150

提交評論