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

2021-08-19 23:40:48 字數 3846 閱讀 5515

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 = modes;

}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,則該函式返回的是版本號。     

真正影響在使用者區域上繪製過程的裝置上下文屬性是「對映方式」,與對映方式屬性密切相關的還有如下四個裝置上下義屬性:視窗原點、視窗原點、視窗範圍和視窗範圍。

unbuntu 擴充套件屏設定主屏和副屏(左右關係)

1 參考 原文如下 作為乙個程式設計師,從開始使用雙屏之後,乙個顯示屏開發,那種感覺,就是不好。好吧,剛換到ubuntu,筆記本一 個顯示屏,外接了乙個hdmi的顯示器,由於書桌的位置,只有把hdmi的顯示屏放在筆記本的左邊。但是,預設的,是筆記本的顯示屏是主屏,右邊是外接的顯示屏,一種亂了套的感覺...

獲取副檔名以及變數的生存週期

header content type text html charset utf 8 擷取副檔名 2.區域性變數 函式體內宣告的變數 區域性變數分為靜態變數 static,當第一次呼叫函式的時候相當於初始化靜態變數,當函式執行完畢後靜態變數沒有釋放而是儲存在靜態記憶體中,當再次呼叫函式的時候首先從...

mybatis plus crud以及擴充套件

所有的sql都是自動自動配置的 通過id查詢 test void selectbyid 查詢多個id test void selectbybathid 條件查詢 test void selectbymap 根據id刪除資料 test public void deletebyid 同時刪除多個資料 t...