版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、1、設(shè)備場(chǎng)境概念2、使用GDI繪圖對(duì)象3、使用GDI坐標(biāo)系統(tǒng)4、使用GDI繪圖Windows應(yīng)用程序不支持標(biāo)準(zhǔn)輸出函數(shù)(如printf),應(yīng)用程序輸出包括文字在內(nèi)的所有數(shù)據(jù)均是以圖形方式“繪制”到窗口上的。Windows通過(guò)圖形設(shè)備接口GDI對(duì)圖形輸出進(jìn)行支持。GDI為應(yīng)用程序提供了與顯示器、打印機(jī)等輸出設(shè)備無(wú)關(guān)的圖形輸出接口,使得程序員從各種顯示、打印設(shè)備的直接處理中解脫出來(lái)。GDI由幾百個(gè)函數(shù)和與此相關(guān)的數(shù)據(jù)類型、宏定義和結(jié)構(gòu)體組成。主要有:獲取和釋放(或創(chuàng)建和刪除)設(shè)備描述表函數(shù)、獲取設(shè)備信息函數(shù)、使用GDI繪圖對(duì)象函數(shù)、繪圖函數(shù)、設(shè)置和獲取設(shè)備參數(shù)函數(shù)等,其顯示的圖形類型(簡(jiǎn)稱圖元)有
2、:直線、曲線、填充、位圖、文本等。1設(shè)備場(chǎng)境Windows對(duì)圖形顯示設(shè)備進(jìn)行了封裝,形成了一個(gè)統(tǒng)一的虛擬圖形顯示設(shè)備。應(yīng)用程序可以在這個(gè)虛擬設(shè)備上進(jìn)行繪圖,而虛擬設(shè)備圖形轉(zhuǎn)換為物理設(shè)備圖形的任務(wù)則由設(shè)備驅(qū)動(dòng)程序去完成。這個(gè)虛擬圖形設(shè)備用一個(gè)包含各種設(shè)備屬性的數(shù)據(jù)結(jié)構(gòu)來(lái)表示,稱為設(shè)備場(chǎng)境DC(device content),又稱設(shè)備上下文。如圖所示,設(shè)備場(chǎng)境DC是指可以用來(lái)輸出圖形的對(duì)象,例如顯示器、打印機(jī)、某個(gè)窗口等等,設(shè)備場(chǎng)境句柄HDC是指向某個(gè)設(shè)備場(chǎng)境的類似指針的數(shù)據(jù)類型。也就是說(shuō),從應(yīng)用程序的角度來(lái)看,設(shè)備場(chǎng)境DC就是Windows提供的一個(gè)“畫板”,程序在其上繪圖。當(dāng)程序員想在一個(gè)圖形
3、輸出設(shè)備(例如顯示器或者打印機(jī))上繪圖時(shí),必須首先獲得設(shè)備場(chǎng)境句柄,然后以此為參數(shù)調(diào)用GDI函數(shù)繪圖。圖13.14 設(shè)備場(chǎng)景DC示意Windows提供了幾種獲取設(shè)備場(chǎng)境句柄的方法。如果在處理一條消息時(shí)獲取了設(shè)備場(chǎng)境句柄,那么應(yīng)該在退出窗口過(guò)程WndProc之前釋放它或者刪除它。一旦釋放了DC句柄,它就不能再使用了。最常用的獲取設(shè)備場(chǎng)境句柄的方法是在處理WM_PAINT消息時(shí),使用BeginPaint和EndPaint調(diào)用:其中ps、hdc定義如下:hdc=BeginPaint(hWnd, &ps); /客戶區(qū)準(zhǔn)備繪圖客戶區(qū)準(zhǔn)備繪圖 /GDI繪圖調(diào)用繪圖調(diào)用.EndPaint(hWnd,
4、&ps); /客戶區(qū)繪圖結(jié)束客戶區(qū)繪圖結(jié)束PAINTSTRUCT ps;HDC hdc;變量hdc是設(shè)備場(chǎng)境句柄類型HDC變量,變量ps是類型PAINTSTRUCT的結(jié)構(gòu)體變量,該結(jié)構(gòu)包含一個(gè)名為rcPaint的RECT矩形結(jié)構(gòu)成員,rcPaint定義一個(gè)包圍窗口客戶區(qū)無(wú)效范圍的矩形。使用從BeginPaint獲得的DC句柄,只能在這個(gè)區(qū)域內(nèi)繪圖。只要使用了BeginPaint就必須要用且只能用EndPaint釋放DC句柄。WM_PAINT消息是當(dāng)窗口客戶區(qū)域的一部分或全部變?yōu)椤盁o(wú)效”,以至于必須“刷新”時(shí)發(fā)生。例如新建窗口、窗口大小的調(diào)整、窗口移動(dòng)、被覆蓋部分的恢復(fù)都會(huì)產(chǎn)生刷新請(qǐng)求。
5、如圖所示,窗口A被另一個(gè)窗口B覆蓋的區(qū)域稱為“無(wú)效”區(qū)域,因?yàn)楫?dāng)窗口B從覆蓋區(qū)域移走后,圖中陰影部分對(duì)于窗口A來(lái)說(shuō)必須要刷新,否則它是窗口B的圖形。圖13.15 需要重畫的無(wú)效區(qū)域應(yīng)用程序還可以在處理非WM_PAINT消息時(shí)獲取設(shè)備場(chǎng)境句柄,例如:hdc=GetDC(hWnd); /hdc得到客戶區(qū)得到客戶區(qū)DC句柄句柄 /GDI繪圖調(diào)用繪圖調(diào)用.ReleaseDC(hWnd,hdc); /釋放客戶區(qū)釋放客戶區(qū)DC句柄句柄GetDC得到的設(shè)備場(chǎng)境句柄是窗口hWnd客戶區(qū)的句柄。這組調(diào)用與BeginPaint和EndPaint的區(qū)別是利用從GetDC返回的句柄可以在整個(gè)客戶區(qū)上繪圖,然而GetD
6、C不會(huì)使客戶區(qū)中任何區(qū)域可能的無(wú)效區(qū)域變成有效,從顯示效果上來(lái)看,GetDC的繪圖結(jié)果將會(huì)在下次WM_PAINT消息刷新后“消失”了。應(yīng)用程序還可以獲取整個(gè)窗口的設(shè)備場(chǎng)境句柄,例如:GetWindowDC得到的設(shè)備場(chǎng)境句柄,除客戶區(qū)之外,還包括窗口的標(biāo)題欄、菜單、滾動(dòng)條和外框。使用GetDC和GetWindowDC得到的設(shè)備場(chǎng)境句柄,只能調(diào)用ReleaseDC釋放。hdc=GetWindowDC(hWnd); /hdc得到窗口得到窗口DC句柄句柄 /GDI繪圖調(diào)用繪圖調(diào)用.ReleaseDC(hWnd,hdc); /釋放窗口釋放窗口DC句柄句柄BeginPaint、GetDC和GetWindo
7、wDC獲得的設(shè)備場(chǎng)境句柄與顯示器的窗口是相關(guān)的,獲取設(shè)備場(chǎng)境句柄的另一個(gè)更通用的函數(shù)是CreateDC,例如:其中l(wèi)pszDriver參數(shù)指定設(shè)備驅(qū)動(dòng)名稱,lpszDevice指定設(shè)備名稱,lpszOutput和lpInitData一般設(shè)為NULL。hdc=CreateDC(lpszDriver,lpszDevice,lpszOutput,lpInitData); /hdc得到設(shè)備得到設(shè)備DC句柄句柄 /GDI繪圖調(diào)用繪圖調(diào)用.DeleteDC(hdc); /刪除設(shè)備刪除設(shè)備DC句柄句柄例如:得到整個(gè)屏幕的設(shè)備場(chǎng)境句柄,而:得到打印機(jī)的設(shè)備場(chǎng)境句柄,其中l(wèi)pszDevice是打印機(jī)設(shè)備的名稱。
8、hdc=CreateDC(DISPLAY,NULL,NULL,NULL);hdc=CreateDC(NULL,lpszDevice,NULL,NULL);當(dāng)使用位圖時(shí),需要?jiǎng)?chuàng)建一個(gè)內(nèi)存設(shè)備場(chǎng)境,例如:創(chuàng)建了一個(gè)基于hdc設(shè)備特性的內(nèi)存設(shè)備場(chǎng)境句柄hdcMem。在hdcMem句柄上繪制的圖形不會(huì)顯示出來(lái),它只是在內(nèi)存中“繪圖”,因此一般需要調(diào)用GDI位圖函數(shù)將它復(fù)制到可顯示DC句柄上才能看到繪圖結(jié)果。使用CreateDC和CreateCompatibleDC得到的設(shè)備場(chǎng)境句柄,只能調(diào)用DeleteDC刪除。hdcMem=CreateCompatibleDC(hdc); /hdcMem得到內(nèi)存得到
9、內(nèi)存DC /GDI繪圖調(diào)用繪圖調(diào)用.DeleteDC(hdcMem); /刪除內(nèi)存刪除內(nèi)存DC句柄句柄2GDI繪圖對(duì)象GDI繪圖對(duì)象是繪制圖形的工具,表13-14列出了常用的Windows繪圖工具。表13-14 Windows繪圖工具工具類型工具類型說(shuō)明說(shuō)明畫筆(畫筆(Pen)畫筆工具定義了繪制圖形和文字所使用的寬度、顏色和線條類畫筆工具定義了繪制圖形和文字所使用的寬度、顏色和線條類型。型。畫刷(畫刷(Brush)畫刷工具定義了用于填充形狀的圖案和顏色。畫刷工具定義了用于填充形狀的圖案和顏色。字體(字體(Font)字體工具定義了繪制文本所使用的字體。字體工具定義了繪制文本所使用的字體。調(diào)色板(
10、調(diào)色板(Palette)調(diào)色板工具定義了在給定設(shè)備上繪制圖形的顏色系統(tǒng)。調(diào)色板工具定義了在給定設(shè)備上繪制圖形的顏色系統(tǒng)。裁剪區(qū)(裁剪區(qū)(Region)裁剪區(qū)工具定義了用于繪制復(fù)雜圖形的裁剪區(qū)域。裁剪區(qū)工具定義了用于繪制復(fù)雜圖形的裁剪區(qū)域。位圖(位圖(Bitmap)位圖工具定義了輸出圖形的圖像數(shù)據(jù)。位圖工具定義了輸出圖形的圖像數(shù)據(jù)。GDI繪圖對(duì)象的使用必須按如下步驟進(jìn)行:創(chuàng)建繪圖對(duì)象或調(diào)用GetStockObject獲取預(yù)定義繪圖對(duì)象。調(diào)用SelectObject將繪圖對(duì)象選進(jìn)設(shè)備場(chǎng)境DC中。調(diào)用DeleteObject刪除繪圖對(duì)象(GetStockObject獲取的對(duì)象除外)。創(chuàng)建和刪除繪圖對(duì)
11、象一般有兩個(gè)時(shí)機(jī)。一個(gè)時(shí)機(jī)是在WM_CREATE消息處理中創(chuàng)建繪圖對(duì)象,在WM_DESTROY消息處理中刪除繪圖對(duì)象,即在窗口建立時(shí)創(chuàng)建對(duì)象,窗口銷毀時(shí)刪除對(duì)象。這樣得到的繪圖對(duì)象在整個(gè)窗口運(yùn)行期間一直有效,優(yōu)點(diǎn)是不用頻繁地創(chuàng)建和刪除對(duì)象,缺點(diǎn)是繪圖對(duì)象始終占用內(nèi)存,存儲(chǔ)開銷大。另一個(gè)時(shí)機(jī)是在設(shè)備場(chǎng)境句柄有效期間,例如在BeginPaint、GetDC、GetWindowDC、CreateDC、CreateCompatibleDC之后創(chuàng)建繪圖對(duì)象,在EndPaint、ReleaseDC、DeleteDC之后刪除繪圖對(duì)象。Windows規(guī)定不能刪除設(shè)備場(chǎng)境當(dāng)前選擇的繪圖對(duì)象。下表列出了各種GDI
12、繪圖對(duì)象的創(chuàng)建函數(shù)。表13-15 GDI繪圖對(duì)象創(chuàng)建函數(shù)創(chuàng)建函數(shù)創(chuàng)建函數(shù)功能功能CreatePen創(chuàng)建邏輯畫筆。創(chuàng)建邏輯畫筆。CreatePenIndirect用給定的用給定的LOGPEN結(jié)構(gòu)創(chuàng)建邏輯畫筆。結(jié)構(gòu)創(chuàng)建邏輯畫筆。CreateSolidBrush創(chuàng)建邏輯畫刷。創(chuàng)建邏輯畫刷。CreatePatternBrush用給定的位圖句柄創(chuàng)建畫刷。用給定的位圖句柄創(chuàng)建畫刷。CreateHatchBrush創(chuàng)建有陰影線的畫刷。創(chuàng)建有陰影線的畫刷。CreateDIBPatternBrushPt用給定的設(shè)備無(wú)關(guān)位圖創(chuàng)建畫刷。用給定的設(shè)備無(wú)關(guān)位圖創(chuàng)建畫刷。CreateBrushIndirect用給定的用給
13、定的LOGBRUSH結(jié)構(gòu)創(chuàng)建畫刷。結(jié)構(gòu)創(chuàng)建畫刷。CreateBitmapIndirect 創(chuàng)建以創(chuàng)建以BITMAP結(jié)構(gòu)數(shù)據(jù)為基礎(chǔ)的位圖。結(jié)構(gòu)數(shù)據(jù)為基礎(chǔ)的位圖。CreateBitmap創(chuàng)建以顏色值組成的數(shù)據(jù)塊為基礎(chǔ)的位圖。創(chuàng)建以顏色值組成的數(shù)據(jù)塊為基礎(chǔ)的位圖。續(xù)表13-15 GDI繪圖對(duì)象創(chuàng)建函數(shù)創(chuàng)建函數(shù)創(chuàng)建函數(shù)功能功能CreateCompatibleBitmap創(chuàng)建與設(shè)備兼容的內(nèi)存位圖。創(chuàng)建與設(shè)備兼容的內(nèi)存位圖。CreateFont創(chuàng)建邏輯字體。創(chuàng)建邏輯字體。CreateFontIndirect用給定的用給定的LOGFONT結(jié)構(gòu)創(chuàng)建字體。結(jié)構(gòu)創(chuàng)建字體。CreatePalette創(chuàng)建邏輯調(diào)色板。
14、創(chuàng)建邏輯調(diào)色板。CreateHalftonePalette創(chuàng)建半色調(diào)調(diào)色板。創(chuàng)建半色調(diào)調(diào)色板。CreateRectRgn創(chuàng)建矩形裁剪區(qū)。創(chuàng)建矩形裁剪區(qū)。CreateEllipticRgn創(chuàng)建橢圓形裁剪區(qū)。創(chuàng)建橢圓形裁剪區(qū)。CreateEllipticRgnIndirect用給定的用給定的RECT結(jié)構(gòu)創(chuàng)建橢圓形裁剪區(qū)。結(jié)構(gòu)創(chuàng)建橢圓形裁剪區(qū)。續(xù)表13-15 GDI繪圖對(duì)象創(chuàng)建函數(shù)創(chuàng)建函數(shù)創(chuàng)建函數(shù)功能功能CreatePolygonRgn創(chuàng)建多邊形裁剪區(qū)。創(chuàng)建多邊形裁剪區(qū)。CreatePolyPolygonRgn在多邊形基礎(chǔ)上創(chuàng)建裁剪區(qū)。在多邊形基礎(chǔ)上創(chuàng)建裁剪區(qū)。CreateRectRgnIndire
15、ct用給定的用給定的RECT結(jié)構(gòu)創(chuàng)建矩形裁剪區(qū)。結(jié)構(gòu)創(chuàng)建矩形裁剪區(qū)。CreateRoundRectRgn 創(chuàng)建帶圓角的矩形裁剪區(qū)。創(chuàng)建帶圓角的矩形裁剪區(qū)。Windows系統(tǒng)在應(yīng)用程序初始化時(shí)提供了一套默認(rèn)的繪圖工具,例如默認(rèn)的畫筆工具顏色是黑色,所以這時(shí)繪制出來(lái)的線條都是黑色的。如果應(yīng)用程序認(rèn)為默認(rèn)繪圖工具不合適,則需要另行創(chuàng)建繪圖對(duì)象,并將其選進(jìn)設(shè)備場(chǎng)境中,函數(shù)原型為:參數(shù)hdc是欲使用繪圖對(duì)象的DC句柄,hgdiobj是繪圖對(duì)象句柄,即繪圖對(duì)象創(chuàng)建函數(shù)的返回值。SelectObject的返回值是前一個(gè)繪圖對(duì)象句柄,繪制圖形時(shí)安全的做法是將默認(rèn)繪圖對(duì)象句柄保存下來(lái),在釋放或刪除DC句柄前將默
16、認(rèn)繪圖對(duì)象選進(jìn)DC句柄。HGDIOBJ SelectObject(HDC hdc,HGDIOBJ hgdiobj);3GDI坐標(biāo)系統(tǒng)大多數(shù)GDI繪圖函數(shù)需要坐標(biāo)值或尺寸,使用邏輯單位,實(shí)際圖形輸出時(shí),Windows將邏輯單位轉(zhuǎn)換為設(shè)備單位,即像素。這種轉(zhuǎn)換是由映射方式、窗口和視口的原點(diǎn)及其范圍控制的。(1)映射方式Windows定義了8種映射方式,它們的標(biāo)識(shí)符和含義見表所示。表13-16 映射方式映射方式映射方式邏輯單位邏輯單位x軸方向軸方向y軸方向軸方向MM_TEXT像素像素向右向右向下向下MM_LOMETRIC0.1mm向右向右向上向上MM_HIMETRIC0.01mm向右向右向上向上MM
17、_LOENGLISH0.01英寸英寸向右向右向上向上MM_HIENGLISH0.001英寸英寸向右向右向上向上MM_TWIPS1/1440英寸英寸向右向右向上向上MM_ISOTROPIC任意(任意(x=y)可變可變可變可變MM_ANISOTROPIC任意(任意(x!=y)可變可變可變可變可以調(diào)用SetMapMode為DC設(shè)置映射方式,函數(shù)原型為:參數(shù)fnMapMode是8種映射方式之一??梢垣@取當(dāng)前DC的映射方式,函數(shù)原型為:int SetMapMode(HDC hdc,int fnMapMode);int GetMapMode(HDC hdc);設(shè)備場(chǎng)境默認(rèn)的映射方式為MM_TEXT。在這種
18、映射方式下,邏輯單位與物理單位相同,都是以像素為單位。例如:會(huì)在距離客戶區(qū)左端8像素、上端16像素的位置開始輸出“Hello”。TextOut(hdc,8,16,Hello,5);如果映射方式設(shè)置為MM_LOMETRIC,例如:則邏輯單位是十分之一毫米,那么會(huì)在距離客戶區(qū)左端5毫米、上端1毫米的位置開始輸出字符串,這樣的映射方式更適合打印機(jī)。SetMapMode(hdc,MM_LOMETRIC);TextOut(hdc,50,-10,Hello,5);(2)設(shè)備坐標(biāo)系Windows對(duì)所有非GDI函數(shù),甚至一部分GDI函數(shù)使用設(shè)備坐標(biāo),以像素為單位。從顯示設(shè)備來(lái)看,存在三種不同的設(shè)備坐標(biāo)系。如圖
19、所示是三種設(shè)備坐標(biāo)系。圖13.16 3種設(shè)備坐標(biāo)系整個(gè)屏幕是一個(gè)“屏幕坐標(biāo)”,屏幕的左上角為(0,0)點(diǎn);如果使用CreateDC創(chuàng)建屏幕設(shè)備場(chǎng)境句柄時(shí),默認(rèn)情況下邏輯坐標(biāo)將被映射為屏幕坐標(biāo)。整個(gè)窗口是一個(gè)“窗口坐標(biāo)”,包括標(biāo)題欄、窗口外框、菜單、滾動(dòng)條等,(0,0)點(diǎn)是窗口的左上角;如果用GetWindowDC獲取窗口設(shè)備場(chǎng)境句柄,則邏輯坐標(biāo)會(huì)轉(zhuǎn)換成客戶區(qū)坐標(biāo)。最常使用的設(shè)備坐標(biāo)是“客戶區(qū)坐標(biāo)”,(0,0)點(diǎn)是客戶區(qū)的左上角,當(dāng)使用GetDC或BeginPaint獲得設(shè)備場(chǎng)境句柄時(shí),邏輯坐標(biāo)默認(rèn)會(huì)轉(zhuǎn)換為客戶區(qū)坐標(biāo)。用函數(shù)ClientToScreen和ScreenToClient可以將客戶區(qū)坐
20、標(biāo)轉(zhuǎn)換成屏幕坐標(biāo),或者反過(guò)來(lái)將屏幕坐標(biāo)轉(zhuǎn)換成客戶區(qū)坐標(biāo),可以使用GetWindowRect函數(shù)獲取屏幕坐標(biāo)下的窗口位置和大小。(3)視口和窗口視口(viewport)是計(jì)算機(jī)屏幕上一塊顯示區(qū)域,隨著在GDI中所使用的設(shè)備場(chǎng)境句柄的不同,該區(qū)域可以是客戶區(qū)、整個(gè)窗口或整個(gè)屏幕。視口是基于設(shè)備坐標(biāo)(像素)的。通常視口和客戶區(qū)相同,(0,0)點(diǎn)在客戶區(qū)左上角,x的值向右增加,y的值向下增加。與視口中顯示的圖形相對(duì)應(yīng)的原始圖形區(qū)域稱為窗口。注意,在這里使用的術(shù)語(yǔ)“窗口”不是指屏幕上顯示的窗口對(duì)象,而是從現(xiàn)實(shí)世界角度所看到的圖形。窗口是基于邏輯坐標(biāo)的,邏輯坐標(biāo)可以是像素、毫米、英寸或者任何其他單位。如圖
21、說(shuō)明了窗口和視口的關(guān)系。圖13.17 視口與窗口關(guān)系對(duì)于所有的映射方式,利用下面兩個(gè)公式可以將窗口坐標(biāo)轉(zhuǎn)換為視口坐標(biāo):其中 是待轉(zhuǎn)換的邏輯點(diǎn), 是轉(zhuǎn)換后的設(shè)備坐標(biāo)點(diǎn), 是邏輯坐標(biāo)的窗口原點(diǎn), 是設(shè)備坐標(biāo)的視口原點(diǎn), 是邏輯坐標(biāo)的窗口范圍, 是設(shè)備坐標(biāo)的視口范圍。此公式意味著邏輯窗口原點(diǎn)總被映射為設(shè)備視口原點(diǎn)。()xViewExtxViewportxWindowxWinOrgxViewOrgxWinExt()yViewExtyViewportyWindowyWinOrgyViewOrgyWinExt,xWindow yWindow,xViewport yViewport,xWinOrg yWin
22、Org,xViewOrg yViewOrg,xWinExt yWinExt,xViewExt yViewExtWindows提供了兩個(gè)函數(shù)將設(shè)備點(diǎn)與邏輯點(diǎn)相互轉(zhuǎn)換,函數(shù)原型為:BOOL DPtoLP(HDC hdc,LPPOINT lpPoints,int nCount);BOOL LPtoDP(HDC hdc,LPPOINT lpPoints,int nCount);DPtoLP函數(shù)將設(shè)備點(diǎn)轉(zhuǎn)換為邏輯點(diǎn),LPtoDP函數(shù)將邏輯點(diǎn)轉(zhuǎn)換為設(shè)備點(diǎn),lpPoints是指向POINT結(jié)構(gòu)數(shù)組的指針,nCount表示存儲(chǔ)在lpPoints中要轉(zhuǎn)換的點(diǎn)的個(gè)數(shù)。例如可將GetClientRect獲取的客戶區(qū)
23、大?。ㄔO(shè)備單位)轉(zhuǎn)換為邏輯坐標(biāo),代碼如下:RECT ▭GetClientRect(hWnd,&rect);DPtoLP(hdc,(LPPOINT)&rect,2);(4)處理MM_TEXT對(duì)于MM_TEXT映射方式,默認(rèn)的原點(diǎn)和范圍如下:窗口原點(diǎn):(0,0)可以改變視口原點(diǎn):(0,0)可以改變窗口范圍:(1,1)不可改變視口范圍:(1,1)不可改變視口范圍與窗口范圍的比例為1,所以不用在邏輯坐標(biāo)與設(shè)備坐標(biāo)之間進(jìn)行縮放,上述兩式可以簡(jiǎn)化為:這種映射方式稱為“文本”映射方式,即與人們閱讀文本從左至右、從上至下的習(xí)慣相同,如圖(a)所示。xViewportxWind
24、owxWinOrgxViewOrgyViewportyWindowyWinOrgyViewOrg圖13.18 視口與窗口坐標(biāo)轉(zhuǎn)換Windows提供函數(shù)可用來(lái)改變視口和窗口的原點(diǎn),原型如下:SetWindowOrgEx改變窗口原點(diǎn),SetViewportOrgEx改變視口原點(diǎn),(x,y)為新的原點(diǎn)值,lpPoint用來(lái)接收先前的原點(diǎn)值,設(shè)為NULL表示不用接收。一般情況下,很少同時(shí)使用這兩個(gè)函數(shù),因?yàn)榇翱诤鸵暱谠c(diǎn)同時(shí)改變會(huì)使坐標(biāo)變換的計(jì)算復(fù)雜化。BOOL SetWindowOrgEx(HDC hdc,int X,int Y,LPPOINT lpPoint);BOOL SetViewportOr
25、gEx(HDC hdc,int X,int Y,LPPOINT lpPoint);例如,假定客戶區(qū)寬為cxClient、高為cyClient,如果想將邏輯原點(diǎn)定義為客戶區(qū)的中心,可進(jìn)行如下調(diào)用:SetViewportOrgEx的參數(shù)總是使用設(shè)備單位?,F(xiàn)在邏輯原點(diǎn)從(0,0)將映射為設(shè)備點(diǎn)(cxClient/2,cyClient/2),客戶區(qū)坐標(biāo)系變成如圖(b)所示。SetViewportOrgEx(hdc,cxClient/2,cyClient/2,NULL);邏輯x軸的范圍從-cxClient/2到+cxClient/2,邏輯y軸的范圍從-cyClient/2到cyClient/2。例如想從
26、客戶區(qū)的左上角開始顯示字符串,則需要負(fù)坐標(biāo):用下面的SetWindowOrgEx調(diào)用可以獲得與上面相同的效果:TextOut(hdc,-cxClient/2,-cyClient/2,Hello,5);SetWindowOrgEx(hdc,-cxClient/2,-cyClient/2,NULL);SetWindowOrgEx的參數(shù)總是使用邏輯單位。在這個(gè)調(diào)用之后,邏輯點(diǎn)(-cxClient/2,-cyClient/2)映射為設(shè)備點(diǎn)(0,0),即客戶區(qū)的左上角。而下面同時(shí)調(diào)用:的結(jié)果是邏輯點(diǎn)(-cxClient/2,-cyClient/2)將映射為設(shè)備點(diǎn)(cxClient/2,cyClient/
27、2),客戶區(qū)坐標(biāo)系變成如圖(c)所示。SetViewportOrgEx(hdc,cxClient/2,cyClient/2,NULL);SetWindowOrgEx(hdc,-cxClient/2,-cyClient/2,NULL);(1)繪圖方式在Windows中,繪圖的最終結(jié)果可以通過(guò)設(shè)定不同的繪圖方式來(lái)控制,其函數(shù)原型為:參數(shù)fnDrawMode為繪圖模式,返回值為先前的繪圖模式。常用的繪圖模式見表13-17。當(dāng)Windows使用畫筆畫線時(shí),它實(shí)際上執(zhí)行畫筆像素顏色值與目標(biāo)位置處原來(lái)像素顏色值的位運(yùn)算,稱為“光柵運(yùn)算”。int SetROP2(HDC hdc,int fnDrawMode
28、);表13-17 繪圖方式fnDrawMode運(yùn)算(畫筆運(yùn)算(畫筆P、目、目標(biāo)標(biāo)D)說(shuō)明說(shuō)明R2_BLACK0像素總是黑色像素總是黑色R2_COPYPENP像素是畫筆顏色(默認(rèn)繪圖方式)像素是畫筆顏色(默認(rèn)繪圖方式)R2_MASKNOTPENP|D像素是目標(biāo)和畫筆的相反顏色所共有的顏色像素是目標(biāo)和畫筆的相反顏色所共有的顏色的組合的組合R2_MASKPENP&D像素是畫筆和目標(biāo)所共有的顏色的組合像素是畫筆和目標(biāo)所共有的顏色的組合R2_MASKPENNOTP&D像素是畫筆和目標(biāo)的相反顏色所共有的顏色像素是畫筆和目標(biāo)的相反顏色所共有的顏色的組合的組合R2_MERGENOTPEN P|
29、D像素是目標(biāo)顏色和畫筆的相反顏色的組合像素是目標(biāo)顏色和畫筆的相反顏色的組合R2_MERGEPENP|D像素是畫筆顏色和目標(biāo)顏色的組合像素是畫筆顏色和目標(biāo)顏色的組合續(xù)表13-17 繪圖方式fnDrawMode運(yùn)算(畫筆運(yùn)算(畫筆P、目、目標(biāo)標(biāo)D)說(shuō)明說(shuō)明R2_MERGEPENNOT P|D像素是畫筆顏色和目標(biāo)的相反顏色的組合像素是畫筆顏色和目標(biāo)的相反顏色的組合R2_NOPD像素保持不變,即仍是目標(biāo)顏色像素保持不變,即仍是目標(biāo)顏色R2_NOTD像素是目標(biāo)的相反顏色像素是目標(biāo)的相反顏色R2_NOTCOPYPENP像素是畫筆的相反顏色像素是畫筆的相反顏色R2_NOTMASKPEN(P&D)像素
30、是像素是R2_MASKPEN的相反顏色的相反顏色R2_NOTMERGEPEN (P|D)像素是像素是R2_MERGEPEN的相反顏色的相反顏色R2_NOTXORPEN(PD)像素是像素是R2_XORPEN的相反顏色的相反顏色R2_WHITE1像素總是白色像素總是白色續(xù)表13-17 繪圖方式fnDrawMode運(yùn)算(畫筆運(yùn)算(畫筆P、目、目標(biāo)標(biāo)D)說(shuō)明說(shuō)明R2_XORPENPD像素是畫筆顏色和目標(biāo)顏色進(jìn)行異或運(yùn)算后像素是畫筆顏色和目標(biāo)顏色進(jìn)行異或運(yùn)算后的顏色的顏色(2)畫點(diǎn)和線如下是GDI畫點(diǎn)和線的繪圖函數(shù)。/畫點(diǎn)畫點(diǎn)COLORREF SetPixel(HDC hdc,int X,int Y,C
31、OLORREF crColor);/移動(dòng)畫筆到指定位置移動(dòng)畫筆到指定位置BOOL MoveToEx(HDC hdc,int X,int Y,LPPOINT lpPoint);/畫直線畫直線BOOL LineTo(HDC hdc,int nXEnd,int nYEnd);/畫由一系列點(diǎn)相連的直線畫由一系列點(diǎn)相連的直線BOOL Polyline(HDC hdc,CONST POINT *lppt,int cPoints);BOOL PolylineTo(HDC hdc,CONST POINT *lppt,DWORD cCount);(2)畫點(diǎn)和線如下是GDI畫點(diǎn)和線的繪圖函數(shù)。/畫多組相連的直線畫
32、多組相連的直線BOOL PolyPolyline(HDC hdc,CONST POINT *lppt,CONST DWORD *lpdwPolyPoints,DWORD cCount);/畫圓弧畫圓弧BOOL Arc(HDC hdc,int nLeftRect,int nTopRect,int nRightRect,int nBottomRect,int nXStartArc,int nYStartArc,int nXEndArc,int nYEndArc);/畫貝塞爾樣條曲線畫貝塞爾樣條曲線BOOL PolyBezier(HDC hdc,CONST POINT *lppt,DWORD cPo
33、ints);BOOL PolyBezierTo(HDC hdc,CONST POINT *lppt,DWORD cCount);例如:在點(diǎn)(20,20)處畫一個(gè)紅點(diǎn),COLORREF類型用于指定顏色值。顏色值是由紅、綠、藍(lán)三個(gè)顏色分量組成,每種顏色分量的值為0255,0表示無(wú)此顏色,255表示此顏色最大值。一般使用RGB宏定義產(chǎn)生顏色值,定義如下:SetPixel(hdc,20,20,RGB(255,0,0);#define RGB(r,g,b) (COLORREF)(BYTE)(r)|(WORD)(BYTE)(g)8)|(DWORD)(BYTE)(b)16)例如:從(100,100)到(20
34、0,200)畫一條直線。MoveToEx用于將畫筆移動(dòng)到畫線起點(diǎn),LineTo從當(dāng)前的起點(diǎn)畫線到終點(diǎn)。MoveToEx(hdc,100,100,NULL);LineTo(hdc,200,200);如果希望用別的線條顏色或者線寬畫線,那么需要?jiǎng)?chuàng)建不同的畫筆對(duì)象,例如:hPen=CreatePen(PS_SOLID,4,RGB(255,0,255); /創(chuàng)建紫色畫筆創(chuàng)建紫色畫筆hOldPen=SelectObject(hdc,hPen); /將畫筆選進(jìn)將畫筆選進(jìn)DC中,此后畫線均用此畫筆,中,此后畫線均用此畫筆,直到另選畫筆為止直到另選畫筆為止LineTo(hdc,300,100); /畫紫色線畫
35、紫色線(3)畫矩形框、圓和多邊形如下是GDI畫封閉形狀的繪圖函數(shù),封閉形狀用畫筆畫線,用畫刷填充形狀。/畫橢圓畫橢圓BOOL Ellipse(HDC hdc,int nLeftRect,int nTopRect,int nRightRect,int nBottomRect);/畫矩形框畫矩形框BOOL Rectangle(HDC hdc,int nLeftRect,int nTopRect,int nRightRect,int nBottomRect);/畫帶圓角的矩形框畫帶圓角的矩形框BOOL RoundRect(HDC hdc,int nLeftRect,int nTopRect,int
36、nRightRect,int nBottomRect,int nWidth,int nHeight);/畫餅圖畫餅圖BOOL Pie(HDC hdc,int nLeftRect,int nTopRect,int nRightRect,int nBottomRect,int nXRadial1,int nYRadial1,int nXRadial2,int nYRadial2);/畫弦畫弦BOOL Chord(HDC hdc,int nLeftRect,int nTopRect,int nRightRect,int nBottomRect,int nXRadial1,int nYRadial1,
37、int nXRadial2,int nYRadial2);/填充矩形填充矩形int FillRect(HDC hDC,CONST RECT *lprc,HBRUSH hbr);/畫矩形邊界畫矩形邊界int FrameRect(HDC hDC,CONST RECT *lprc,HBRUSH hbr);/畫封閉的多邊形畫封閉的多邊形BOOL Polygon(HDC hdc,CONST POINT *lpPoints,int nCount);/畫多組封閉的多邊形畫多組封閉的多邊形BOOL PolyPolygon(HDC hdc,CONST POINT *lpPoints,CONST INT *lpP
38、olyCounts,int nCount);如果希望用別的填充顏色或者填充圖案,那么需要?jiǎng)?chuàng)建不同的畫刷對(duì)象,例如:hbr=CreateSolidBrush(RGB(255,0,0); /創(chuàng)建紅色畫刷創(chuàng)建紅色畫刷hOldBrush=SelectObject(hdc,hbr); /將畫刷選進(jìn)將畫刷選進(jìn)DC中,此后填充均用此畫刷,中,此后填充均用此畫刷,直到另選畫刷為止直到另選畫刷為止Rectangle(hdc,300,100,400,200); /畫矩形框且填充紅色畫矩形框且填充紅色(4)畫文字如下是GDI文字輸出的繪圖函數(shù)。/在指定坐標(biāo)開始輸出在指定坐標(biāo)開始輸出cbString個(gè)字符,如果輸出全
39、部字符串,個(gè)字符,如果輸出全部字符串,cbString設(shè)為設(shè)為-1BOOL TextOut(HDC hdc,int nXStart,int nYStart,LPCTSTR lpString,int cbString);/在一個(gè)矩形范圍內(nèi)輸出字符串,在一個(gè)矩形范圍內(nèi)輸出字符串,uFormat值表示使用對(duì)齊等格式值表示使用對(duì)齊等格式int DrawText(HDC hDC,LPCTSTR lpString,int nCount,LPRECT lpRect,UINT uFormat);/設(shè)置文本顏色設(shè)置文本顏色COLORREF SetTextColor(HDC hdc,COLORREF crColo
40、r);/設(shè)置文本背景顏色設(shè)置文本背景顏色COLORREF SetBkColor(HDC hdc,COLORREF crColor);(4)畫文字如下是GDI文字輸出的繪圖函數(shù)。/設(shè)置文本字符間距設(shè)置文本字符間距int SetTextCharacterExtra(HDC hdc,int nCharExtra);/設(shè)置文本對(duì)齊方式設(shè)置文本對(duì)齊方式UINT SetTextAlign(HDC hdc,UINT fMode);/設(shè)置背景色模式,設(shè)置背景色模式,iBkMode=OPAQUE使用背景色,使用背景色,iBkMode=TRANSPARENT背景是透明的背景是透明的int SetBkMode(HD
41、C hdc,int iBkMode);例如:TextOut(hdc,8,16,Hello,5); /輸出文字輸出文字SetTextColor(hdc,RGB(255,255,255); /設(shè)置文字顏色設(shè)置文字顏色SetBkColor(hdc,RGB(0,0,0); /設(shè)置文字背景顏色設(shè)置文字背景顏色GetClientRect(hWnd, &rt); /獲取客戶區(qū)大小獲取客戶區(qū)大小DrawText(hdc,szHello,-1,&rt,DT_SINGLELINE|DT_CENTER|DT_VCENTER); /在客戶區(qū)中央輸出在客戶區(qū)中央輸出如果希望在窗口中實(shí)現(xiàn)類似printf的
42、格式化輸出,可以先調(diào)用sprintf將數(shù)據(jù)“輸出”到字符數(shù)組中,再調(diào)用GDI函數(shù)繪制出來(lái)。例如:GDI文字輸出比標(biāo)準(zhǔn)輸出流的輸出效果更美觀,因?yàn)樗梢栽O(shè)置文字顏色、背景色、按像素單位設(shè)置字符間距、使用字體、設(shè)置字號(hào)等等。char buf100;sprintf(buf,s=%f,3.1415926*13.2*13.2); /輸出圓面積輸出圓面積s=*r*rTextOut(hdc,300,20,buf,strlen(buf);(5)畫位圖和圖標(biāo)GDI可以直接輸出位圖圖像,步驟如下。首先調(diào)用LoadBitmap函數(shù)加載位圖資源,例如:調(diào)用GetObject可以得到位圖的寬和高,例如:hBmp=Loa
43、dBitmap(hInst,MAKEINTRESOURCE(IDB_PICTURE);/加載位圖加載位圖資源資源GetObject(hBmp,sizeof(BITMAP),&bm); /bm.bmWidth,bm.bmHeight分別分別為寬和高為寬和高其次,為便于在內(nèi)存中對(duì)位圖進(jìn)行繪圖操作,位圖對(duì)象不是直接選進(jìn)顯示設(shè)備DC中,而是創(chuàng)建一個(gè)內(nèi)存DC,將位圖對(duì)象選進(jìn)內(nèi)存DC中。例如:hdcMem=CreateCompatibleDC (hdc); /創(chuàng)建內(nèi)存創(chuàng)建內(nèi)存DChOldBmp=(HBITMAP)SelectObject(hdcMem,hBmp);/位圖選進(jìn)內(nèi)存位圖選進(jìn)內(nèi)存DC為了
44、將內(nèi)存DC的圖形結(jié)果顯示出來(lái),可以調(diào)用位圖像素復(fù)制函數(shù),原型為:例如:/等比復(fù)制等比復(fù)制hdcSrc的圖形到的圖形到hdcDest中,中,dwRop表示像素光柵運(yùn)算模式表示像素光柵運(yùn)算模式BOOL BitBlt(HDC hdcDest,int nXDest,int nYDest,int nWidth,int nHeight,HDC hdcSrc,int nXSrc,int nYSrc,DWORD dwRop);/拉伸復(fù)制拉伸復(fù)制hdcSrc的圖形到的圖形到hdcDest中,中,dwRop表示像素光柵運(yùn)算模式表示像素光柵運(yùn)算模式BOOL StretchBlt(HDC hdcDest,int nX
45、OriginDest,int nYOriginDest,int nWidthDest,int nHeightDest,HDC hdcSrc,int nXOriginSrc,int nYOriginSrc,int nWidthSrc,int nHeightSrc,DWORD dwRop);/將位圖復(fù)制到顯示設(shè)備將位圖復(fù)制到顯示設(shè)備(420,0)處處BitBlt(hdc,420,0,bm.bmWidth,bm.bmHeight,hdcMem,0,0,SRCCOPY); /復(fù)制到復(fù)制到hdc可以調(diào)用DrawIcon函數(shù)輸出圖標(biāo),其函數(shù)原型為:例如:BOOL DrawIcon(HDC hDC,int
46、X,int Y,HICON hIcon);hIcon=LoadIcon(hInst,MAKEINTRESOURCE(IDI_APP); /從資源加載圖標(biāo)從資源加載圖標(biāo)DrawIcon(hdc,200,200,hIcon); /畫圖標(biāo)畫圖標(biāo)(6)雙緩沖技術(shù)GDI將圖形直接繪制在顯示設(shè)備上時(shí),如果繪制內(nèi)容較多或者繪制時(shí)間較長(zhǎng),會(huì)出現(xiàn)顯示閃爍。為解決這個(gè)問(wèn)題,可采用雙緩沖技術(shù)(double buffering)。圖13.19 雙緩沖繪圖示意如圖所示,雙緩沖原理是在內(nèi)存中創(chuàng)建一個(gè)與屏幕繪圖區(qū)域一致的內(nèi)存DC,然后在其上繪制圖形,由于閃爍是在內(nèi)存中,因此不可見。繪制完成后采用BitBlt快速將圖形送到顯
47、示設(shè)備上,從而避免顯示閃爍。利用雙緩沖技術(shù),可以編寫動(dòng)畫和游戲所要求的畫面。但GDI繪圖過(guò)程本身是比較慢的,如果需要編寫快速顯示的動(dòng)畫或游戲場(chǎng)景時(shí),最好采用專業(yè)圖形開發(fā)庫(kù),例如DirectX和OpenGL等。Windows窗口調(diào)整時(shí)會(huì)產(chǎn)生WM_ERASEBKGND消息,這個(gè)消息的作用是通知窗口用背景畫刷填充背景,結(jié)果也會(huì)導(dǎo)致顯示閃爍。因此應(yīng)用程序可以增加OnEraseBkgnd消息處理,用來(lái)禁止背景填充,其代碼如下:雙緩沖技術(shù)實(shí)現(xiàn)代碼如下:LRESULT OnEraseBkgnd(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam) /擦除背景
48、消息處理擦除背景消息處理 return FALSE; /不擦除背景不擦除背景LRESULT OnPaint(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam) /重繪消息處理重繪消息處理 PAINTSTRUCT ps; HDC hdc, hdcMem; HBITMAP hBmp, hOldBmp; HBRUSH hbr; RECT rt; COLORREF cr; int nWidth,nHeight; hdc=BeginPaint(hWnd,&ps); /客戶區(qū)繪圖開始客戶區(qū)繪圖開始/雙緩沖開始雙緩沖開始- GetClientRec
49、t(hWnd,&rt); /獲取客戶區(qū)大小獲取客戶區(qū)大小 hdcMem=CreateCompatibleDC(hdc); /創(chuàng)建內(nèi)存創(chuàng)建內(nèi)存DC,建立雙緩沖內(nèi)存區(qū)域,建立雙緩沖內(nèi)存區(qū)域 nWidth = rt.right-rt.left; nHeight = rt.bottom-rt.top; hBmp=CreateCompatibleBitmap(hdc,nWidth,nHeight); /創(chuàng)建與顯示區(qū)域創(chuàng)建與顯示區(qū)域相同的位圖對(duì)象相同的位圖對(duì)象 hOldBmp=(HBITMAP)SelectObject(hdcMem,hBmp);/位圖對(duì)象選進(jìn)內(nèi)存位圖對(duì)象選進(jìn)內(nèi)存DC cr = G
50、etBkColor(hdc); /獲取背景色獲取背景色 hbr = CreateSolidBrush(cr); /創(chuàng)建背景色實(shí)體畫刷創(chuàng)建背景色實(shí)體畫刷 FillRect(hdcMem,&rt,hbr); /使用背景色填充內(nèi)存使用背景色填充內(nèi)存DC OnBufferPaint(hWnd,hdcMem); /開始雙緩沖繪圖開始雙緩沖繪圖 BitBlt(hdc,rt.left,rt.top,nWidth,nHeight,hdcMem,rt.left,rt.top,SRCCOPY); /快速?gòu)?fù)制內(nèi)存快速?gòu)?fù)制內(nèi)存DC到顯示到顯示DC設(shè)備上設(shè)備上 DeleteObject(hbr); /刪除畫刷對(duì)
51、象刪除畫刷對(duì)象 SelectObject(hdcMem,hOldBmp); /恢復(fù)默認(rèn)位圖對(duì)象恢復(fù)默認(rèn)位圖對(duì)象 DeleteObject(hBmp); /刪除位圖對(duì)象刪除位圖對(duì)象 DeleteDC(hdcMem); /刪除內(nèi)存刪除內(nèi)存DC/雙緩沖結(jié)束雙緩沖結(jié)束- EndPaint(hWnd,&ps); /客戶區(qū)繪圖結(jié)束客戶區(qū)繪圖結(jié)束 return 0; /處理了這條消息必須返回處理了這條消息必須返回0OnBufferPaint函數(shù)中的繪圖就是在雙緩沖DC上進(jìn)行的。如果將上面代碼中的雙緩沖開始至結(jié)束間的代碼替換為:可以看到用與不用雙緩沖技術(shù),繪圖效果區(qū)別是很大的。OnBufferPain
52、t(hWnd,hdc);【例13.4】 編寫使用GDI繪圖的程序。程序基于SDK編程框架(參考例13.3)編寫,增加WM_PAINT消息處理。程序需要定義一個(gè)位圖資源IDB_CAR。例13.4 1 /頭文件頭文件- 2 #include /Windows頭文件頭文件 3 #include resource.h /資源頭文件資源頭文件 4 #include 5 /全局定義全局定義- 6 HINSTANCE hInst; /應(yīng)用程序?qū)嵗浔鷳?yīng)用程序?qū)嵗浔?7 HWND hMainWnd; /主窗口句柄主窗口句柄 8 char szWindowTitle=MainWindow; /主窗口標(biāo)題主窗口
53、標(biāo)題 9 char szWindowClass=SDKWIN32APP; /主窗口類名主窗口類名 10 struct WIN_MSGMAP_ENTRY /消息映射表結(jié)構(gòu)消息映射表結(jié)構(gòu) 11 UINT nMessage; /消息碼消息碼 12 LRESULT (*pfn)(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam); 13 ;例13.4 14 #define BEGIN_MESSAGE_MAP() const struct WIN_MSGMAP_ENTRY _messageEntries= 15 #define ON_MSG(nMess
54、age,pfn) nMessage, pfn, 16 #define END_MESSAGE_MAP() 0, NULL ; 17 /消息處理函數(shù)原型消息處理函數(shù)原型- 18 LRESULT OnPaint(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam); 19 /消息映射表宏定義消息映射表宏定義- 20 BEGIN_MESSAGE_MAP() 21 ON_MSG(WM_PAINT, OnPaint) /重繪消息映射重繪消息映射 22 END_MESSAGE_MAP() 23 /窗口過(guò)程窗口過(guò)程- 24 LRESULT CALLBACK
55、WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam) 25 例13.4 26 WORD i; 27 for(i=0;_messageEntriesi.nMessage; i+) 28 /如果消息映射表中有該消息,則調(diào)用對(duì)應(yīng)的消息處理函數(shù)如果消息映射表中有該消息,則調(diào)用對(duì)應(yīng)的消息處理函數(shù) 29 if (message=_messageEntriesi.nMessage) 30 if(message!=WM_DESTROY)/非非WM_DESTROY消息處理后立即返回消息處理后立即返回 31 return (*_messageEnt
56、riesi.pfn)(hWnd,message,wParam,lParam); 32 /如果是如果是WM_DESTROY消息處理但不返回,繼續(xù)后處理消息處理但不返回,繼續(xù)后處理 33 (*_messageEntriesi.pfn)(hWnd,message,wParam,lParam); 34 break; 35 36 37 if (message=WM_DESTROY) /WM_DESTROY后處理后處理 38 PostQuitMessage(0); /發(fā)出發(fā)出WM_QUIT消息,結(jié)束應(yīng)用程序消息,結(jié)束應(yīng)用程序例13.4 39 return 0; /處理了這條消息必須返回處理了這條消息必須返
57、回0 40 41 return DefWindowProc(hWnd,message,wParam,lParam); /其他消息其他消息調(diào)用默認(rèn)處理調(diào)用默認(rèn)處理 42 43 /注冊(cè)窗口類注冊(cè)窗口類- 44 ATOM MyRegisterClass(HINSTANCE hInstance) 45 46 WNDCLASSEX wcex; 47 wcex.cbSize = sizeof(WNDCLASSEX); 48 wcex.style = CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS; 49 wcex.lpfnWndProc = (WNDPROC)WndProc; /設(shè)置主窗
58、口過(guò)程設(shè)置主窗口過(guò)程 50 wcex.cbClsExtra = 0; 51 wcex.cbWndExtra = 0; 52 wcex.hInstance = hInstance; /應(yīng)用程序?qū)嵗龖?yīng)用程序?qū)嵗?3.4 53 wcex.hIcon = LoadIcon(hInstance,(LPCTSTR)IDI_APP); 54 wcex.hCursor = LoadCursor(NULL,IDC_ARROW); 55 wcex.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); 56 wcex.lpszMenuName = (LPCSTR
59、)IDR_APP; /主窗口主菜單主窗口主菜單 57 wcex.lpszClassName = szWindowClass; /主窗口類名主窗口類名 58 wcex.hIconSm = LoadIcon(hInstance,(LPCTSTR)IDI_APPSMALL); 59 return RegisterClassEx(&wcex); /注冊(cè)窗口類注冊(cè)窗口類 60 61 /初始化窗口初始化窗口- 62 BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) 63 64 DWORD ds=WS_OVERLAPPEDWINDOW|WS_C
60、LIPCHILDREN; /主框主框架風(fēng)格,剪切子控件架風(fēng)格,剪切子控件 65 hInst=hInstance; /保存應(yīng)用程序?qū)嵗4鎽?yīng)用程序?qū)嵗?3.4 66 hMainWnd=CreateWindow(szWindowClass,szWindowTitle,ds,CW_USEDEFAULT,0,750,300,NULL,NULL,hInstance,NULL); /創(chuàng)建主窗口創(chuàng)建主窗口 67 if (!hMainWnd) return FALSE; 68 ShowWindow(hMainWnd, nCmdShow); /顯示主窗口顯示主窗口 69 UpdateWindow(hMainWnd); /更新主窗口更新主窗口 70 return TRUE; 71 72 /消息循環(huán)消息循環(huán)- 73 int Run() /消息循環(huán)消息循環(huán) 74 75 M
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 產(chǎn)權(quán)交易合同意向書
- 個(gè)人綜合授信貸款合同范文
- 個(gè)人房屋租賃合同樣本范本
- 個(gè)人房產(chǎn)轉(zhuǎn)讓合同樣本修訂版
- 中小學(xué)教師工資集體合同范本
- 業(yè)務(wù)員委托合同范本
- 個(gè)人小額信貸合同樣本
- 個(gè)人設(shè)備租賃標(biāo)準(zhǔn)合同
- 個(gè)人車輛保險(xiǎn)合同標(biāo)準(zhǔn)模板
- 個(gè)人友情借款合同樣本
- 2025年廣西教育出版社有限公司招聘筆試參考題庫(kù)含答案解析
- 中醫(yī)膏方臨床應(yīng)用與制備工藝規(guī)范 DB32/T 4870-2024
- JJG(交通) 208-2024 車貨外廓尺寸動(dòng)態(tài)現(xiàn)場(chǎng)檢測(cè)設(shè)備
- 蘇北四市(徐州、宿遷、淮安、連云港)2025屆高三第一次調(diào)研考試(一模)英語(yǔ)試卷(含答案)
- 2025年信息系統(tǒng)集成服務(wù)公司組織架構(gòu)和業(yè)務(wù)流程
- 西藏自治區(qū)拉薩市城關(guān)區(qū)多校2024-2025學(xué)年六年級(jí)上學(xué)期期中英語(yǔ)試題
- 胸外科講課全套
- 2023年海南省公務(wù)員錄用考試《行測(cè)》真題卷及答案解析
- 公安法制培訓(xùn)
- 中醫(yī)診斷學(xué)八綱辨證課件
- 淺談如何有效提高小學(xué)數(shù)學(xué)教學(xué)質(zhì)量課件
評(píng)論
0/150
提交評(píng)論