CreateDC的使用事宜

2021-07-08 21:27:50 字數 3523 閱讀 1203

windows中的圖形基本上是由從gdi.exe模組中輸出的函式處理的(儘管一些繪製函式實際上具有user.exe的入口點),gdi.exe模組呼叫在不同驅動程式檔案中的例程,其中有乙個.drv驅動程式檔案用於控制顯示螢幕,並且可能有乙個或多個其他的.drv驅動程式檔案用來控制印表機或繪圖儀。    

windows   gdi使用兩種座標系統。使用虛擬座標系統可以使程式不依賴於具體的硬體,使用裝置座標系統可以使程式和硬體緊密相聯。    

gdi含有在windows應用程式內部執行、且與裝置無關的圖形操作函式,這些函式可產生各種各樣的線、正文和點陣圖,它們可以輸出到許多不同的輸出裝置上。gdi允許乙個應用程式產生筆、刷子、字型和點陣圖,以供特定的輸出操作使用。下面列出gdi中幾組比較常用的函式:    

·裝置上下文函式    

·橢圓和多邊形函式    

·繪圖工具函式    

·位圖函式    

·繪圖屬性函式    

·正文函救    

·對映函式。    

·座標函式    

·元檔案(metafile)函式    

·區域函式    

·裁剪(clipping)函式·    

視窗應用程式輸出圖形的操作步驟如下:    

①取得指定視窗的當前顯示裝置上下丈,顯示裝置上下文實際上是乙個資料結構,它包括該視窗的引數及各種圖形、文字屬性的現行設定值,它們對以後的圖形、文字輸   出命令起控制作用。    

②選擇使用者座標系及對映方式。    

③設定使用者座標系中的觀察視窗和裝置座標系中的顯示視區。    

④輸出圖形、文字和圖象。    

⑤釋放所使用的顯示裝置上下文。    

當想要在圖形輸出裝置(例如螢幕或印表機)上繪製圖形時,必須首先獲得裝置上下文的控制代碼。先給出這個控制代碼,windows才允許程式使用裝置,在gdi函式中將控制代碼作為乙個引數傳入,向windows標明需要使用的裝置。    

裝置上下文中包含許多屬性,當gdi在不同的裝置上工作時都要用到這些屬性。使用這些屬性可使gdi只關心起始和終止座標的大小,而不必關心有關物件的其他屬性,如顏色、背景等等,因為這些都是裝置上下文的一部分。當需要修改這些屬性時,只需呼叫乙個修改裝置上下文中屬性的引數,以後的程式中都使用修改後的裝置上下文屬性。裝置上下文是連線windows應用程式、裝置驅動程式以及輸出裝置的紐帶。    

獲取裝置上下文控制代碼有多種方法。最一般的方法是當處理一條訊息時獲得了裝置上下文、並在退出視窗之前釋放它。一般的處理方法如下:    

在處理wm_paint訊息時    

case   wm_paint:    

hdc=beginpaint(hwnd,&ps)    

endpaint   (hwnd,&ps);    

其資料結構為:    

hdc   hwnd;    

paintstruct   ps;    

而在windows.h中定義了paintstruct的資料結構。    

type   struct   tagpaintstruct   {    

hdc   hdc;    

bool   ferase;    

rect   rcpaint;    

bool   frestore;    

bool   flncupdate;    

byte   rgbreserved[16];    

}paintstruct;    

其中,hdc用於標識顯式上下文,ferase指出背景是否重畫,rcpaint是塗色矩形,其餘的域均為保留。這裡的hdc是beginpaint返回的裝置上下文控制代碼,有了從deginpaint獲取的裝置上下文控制代碼,就可以也只能在ps指出的rcpaint的矩形內繪圖,endpaint呼叫使這一區域有效。    

第二種方法如下所示,使用這種方法獲取和釋放裝置上下文可以在整個使用者區內畫圖,圖形在整個使用者區域內都有效:    

hdc=getdc   (hwnd   );    

…畫圖操作…    

releasedc   (hwnd   ,   hdc   );    

使用下面第三種方法獲取和釋放裝置上下文,可以在整個視窗內畫圖,圖形在整個視窗內有效:    

hdc=getwindowdc(hwnd);    

…畫圖操作…    

releasedc(hwnd,hdc);    

使用下面第四種方法獲取和釋放裝置上下文,可以在整個顯示器區域內畫圖,圖形在整個顯示器區域內部有效:    

hdc=createdc   (lpszdriver   ,lpszdevice   ,lpszoutput   ,   lpdata);    

…畫圖操作…    

releasedc(hdc);    

其中lpszdriver指向裝置驅動程式的dos檔名(不帶副檔名),lpszdevice指向專用裝置名(例如epson   fx-80),lpszoutput指向物理輸出介質(檔案或輸出埠)的dos檔名或裝置名,lpdata指向含有裝置驅動程式的裝置專用的初始化資料的devmode資料結構。例如:    

hdc=createdc("display",null,null,null);    

使用螢幕畫圖,而:    

hdc=   createdc   ("ibmgrx","ibm   graphics","lpt1",null   );    

在印表機上輸出圖形,這裡的lpdata置為預設值,可以在win.ini中找到初始化值。    

如果不需要獲取裝置上下文,即不需要在裝置上下文中操作,只需了解有關裝置上下文的資訊,可以用如下語句:    

hdcinfo   =   createdc   (lpszdriver,   lpszdevice,lpszoutput,   lpdata   );    

……    

detetedc   (hdcinfo);    

另外,還可以使用裝置上下文來對位圖的記憶體進行控制,如下所示:    

hdcmem   =   createcompatibledc   (hdc)    

oeletedc(hdcmem   );    

乙個元檔案是以二進位制形式編碼的gdi呼叫集合,可通過獲取乙個元檔案裝置上下文來建立乙個檔案:    

hdcmeta=createmetafile(lpszfilename);    

……    

hmf=closemetafile(hdcmeta);    

在元檔案裝置上下文有效期間,使用hdcmeta所進行的任何gdi呼叫都成為元檔案的一部分,當呼叫closemetafile時,裝置上下文控制代碼變化無效,函式返回元檔案(hmf)的控制代碼。    

nvalue=getdevicecaps   (hdc,nindex);    

這裡的hdc標識裝置上下文,nindex確定返回值,它可以是window.h中所定義的28個識別符號中的乙個,例如nindex=driveversion,則該函式返回的是版本號。    

CreateDC的使用事宜

windows中的圖形基本上是由從gdi exe模組中輸出的函式處理的 儘管一些繪製函式實際上具有user exe的入口點 gdi exe模組呼叫在不同驅動程式檔案中的例程,其中有乙個 drv驅動程式檔案用於控制顯示螢幕,並且可能有乙個或多個其他的 drv驅動程式檔案用來控制印表機或繪圖儀。wind...

C語言中關於指標等相關理解和使用事宜

指標是乙個變數,其值是另乙個變數的位址,位址代表的是在記憶體中的位置。需要記住的是,陣列變數本身就是乙個指標。int ip 乙個整型的指標 double dp 乙個 double 型的指標 float fp 乙個浮點型的指標 char ch 乙個字元型的指標 其實指標永遠都只是乙個代表乙個位址的十六...

獲取擴充套件屏以及CreateDC的使用

void cmulti displaydlg getallmonitors devid while ret dev list devices std list iterator it for it dev list.begin it dev list.end it dev mode list mod...