對於Windows平台,顯示器的分辯率、顏色數、重新整理率等特性很重要,尤其是對於多媒體 應用軟體和遊戲軟體。在很多情況下,使用者當前的螢幕設定並不適合軟體的運行需要,軟體 通常的做法是提示使用者將螢幕設定到軟體要求的分辯率及顏色數,再重新啟動軟體。這樣無 疑會增加普通使用者操作上的負擔和困難,降低了軟體的友好性和易用性。理想的作法是:在 軟體開始時,動態改變螢幕設定來達到軟體啟動並執行要求。在軟體運行結束後,再自動把屏 幕設定改回原來的設定值。這一切過程都在不知不覺中完成。本例示範了動態設定系統顯示 分辯率,只要系統的硬體的支援,你可以將解析度設定為1024*768或800*600;色彩設定為8 位、24位、32位等。程式編譯運行後的介面效果如圖一所示:
圖一、設定系統解析度的程式介面效果圖
一、編程方法
我們知道, 顯示器所顯示的內容對應於顯存,在顯示器上最小的單位是象素(Pixel,這裡僅考慮邏輯象 素),顯存的最小的單位是位(Bits)。 顯示器工作的特徵主要體現在色彩數和解析度兩方面 。顯示器所顯示的色彩的數目取決於單位象素所使用的顯存的位元(Bits)。在顯存中,如果8 位顯存(即一個向象素使用了一位元組的顯存)對應於顯示器上的一個象素,那麼顯示器所顯示 的色彩數目為28=256色;同樣,如果當前的色彩為16位,那麼顯示器所顯示的色彩數目為 216=65536種色彩。顯示器的解析度指的是水平解析度和垂直解析度,經常所說的800X600, 就是指在水平方面上所顯示的象素為800個,在垂直方面上所顯示的象素為600個。
在 VC中提供了修改顯示裝置(如顯示器、印表機等等,本文只就顯示器而言)屬性的函數 ChangeDisplaySettings(),該函數能夠按照你的需要對顯示裝置作出相應的修改。其函數 的原型為:LONG ChangeDisplaySettings(LPDEVMODE lpDevMode, DWORD dwflags),其參數 的含義如下:
lpDevMode:一個指向DEVMODE資料結構的指標,DEVMODE的資料結構描 述了欲設定顯示器的各類屬性值。通常情況下使用到的成員變數有:
dmSize:所用 DEVMODE資料結構的大小(以Bytes為單位);
dmBitsPerPel :每象素所使用的顯存 位元(Bits);
dmPelsWidth :水平解析度(點數);
dmPelsHeight Pixel height :垂直解析度(點數);
dmDisplayFrequency :顯示重新整理率,以赫茲為單位 ;
dmFields:通常情況下,不同的顯示裝置(如印表機)用到的DEVMODE資料結構的 內容不同,比如設定印表機時,你不會用到dmDisplayFrequency屬性。所以,在你使用 DEVMODE資料結構時,應向系統說明你具體用到的有效資料成員,dmFields的用處便在於此。 如果在程式中只用到dmPelsWidth(水平解析度)和dmPelsHeight(垂直解析度),那麼該值 應為DM_PELSWIDTH|DM_PELSHEIGHT。
Dwflags:表明對顯示裝置的修改方式。具體取 值有以下幾種:0 :動態改變顯示裝置屬性;CDS_UPDATEREGISTRY:動態改變顯示裝置屬性 並修改註冊表相關設定,下次啟動電腦時,本次所做的修改依然有效;CDS_TEST:測試所 做的修改是否有效。
上述函數調用後傳回值如下:DISP_CHANGE_SUCCESSFUL:修改成 功;DISP_CHANGE_RESTART :修改後需重新啟動(在顯示器設定中選擇了"應用新的顏色 前重新啟動電腦"); DISP_CHANGE_FAILED :修改失敗;DISP_CHANGE_BADMODE:修 改模式錯誤(比如你的顯示器是單色的,但你卻將之修改為256色的)。如果在函數調用時,參 數lpDevMode為NULL且dwflags 為0, 則顯示裝置使用註冊表當前值來設定顯示特性。以上是 ChangeDisplaySettings()函數的最常見的用法,更詳細的說明請參見MSDN。