在Windows系統(tǒng)中,系統(tǒng)提供了用于動(dòng)態(tài)改變屏幕分辨率和顯示顏色數(shù)的API函數(shù)。在這篇文章中,我將介紹使用兩種方法改變Windows的顯示模式。
要改變顯示模式,首先要獲得顯示系統(tǒng)支持的顯示模式。顯示系統(tǒng)支持的所有的顯示模式是利用API函數(shù)EnumDisplaySettings獲得的。然后有兩種方法切換顯示模式,一種是利用Windows API函數(shù)ChangeDisplaySettings另外一種方法是利用Windows附帶的一個(gè)QuickRES庫(kù),通過(guò)調(diào)用QuickRES庫(kù)實(shí)現(xiàn)顯示模式的切換。 首先在VB中建立一個(gè)工程文件,然后在Form1中加入一個(gè)ListBox控件和兩個(gè)CommandButton控件,然后在Form1的代碼窗口中加入以下代碼: Option Explicit Private Type RECT Left As Long Top As Long Right As Long Bottom As Long End Type Private Declare Function ChangeDisplaySettings Lib “user32" Alias “ChangeDisplaySettingsA" _ (lpDevMode As Any, ByVal dwflags As Long) As Long Private Declare Function EnumDisplaySettings Lib“user32" Alias“EnumDisplaySettingsA" _ (ByVal lpszDeviceName As String, ByVal iModeNum As Long, lpDevMode As Any) As Long Private Declare Function SendMessageByLong& Lib“user32" Alias“SendMessageA" _ (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) Private Declare Function InvalidateRect Lib “user32" (ByVal hwnd As Long, lprect As Any, _ ByVal bErase As Long) As Long Private Declare Function PostMessage Lib “user32" Alias “PostMessageA" (ByVal hwnd As Long, _ ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long Private Type DEVMODE dmDeviceName As String * 32 dmSpecVersion As Integer dmDriverVersion As Integer dmSize As Integer dmDriverExtra As Integer dmFields As Long dmOrientation As Integer dmPaperSize As Integer dmPaperLength As Integer dmPaperWidth As Integer dmScale As Integer dmCopies As Integer dmDefaultSource As Integer dmPrintQuality As Integer dmColor As Integer dmDuplex As Integer dmYResolution As Integer dmTTOption As Integer dmCollate As Integer dmFormName(1 To 32) As Byte dmLogPixels As Integer dmBitsPerPel As Long dmPelsWidth As Long dmPelsHeight As Long dmDisplayFlags As Long dmDisplayFrequency As Long dmICMMethod As Long 'Windows 95 only dmICMIntent As Long ’ Windows 95 only dmMediaType As Long ' Windows 95 only dmDitherType As Long ' Windows 95 only dmReserved1 As Long ' Windows 95 only dmReserved2 As Long ' Windows 95 only End Type Const DM_BITSPERPEL = &H40000 Const DM_PELSWIDTH = &H80000 Const DM_PELSHEIGHT = &H100000 Const DM_DISPLAYFLAGS = &H200000 Const DM_DISPLAYFREQUENCY = &H400000 Const DISP_CHANGE_SUCCESSFUL = 0 Const DISP_CHANGE_RESTART = 1 Const DISP_CHANGE_FAILED = -1 Const DISP_CHANGE_BADMODE = -2 Const DISP_CHANGE_NOTUPDATED = -3 Const DISP_CHANGE_BADFLAGS = -4 Const DISP_CHANGE_BADPARAM = -5 Const CDS_UPDATEREGISTRY = 1 Const CDS_FORCE As Long = &H80000000 Const CDS_RESET = &H40000000 Const HWND_BROADCAST = &HFFFF& Const WM_SYSCOLORCHANGE = &H15 Const WM_PALETTECHANGED = &H311 Const WM_DISPLAYCHANGE = &H7E Const WM_SETTINGCHANGE = &H1A Dim ModeCube(63) As DEVMODE Dim lproc As Long Sub EndApp() Icon_Del (Form1.Command1.hwnd) End End Sub Sub ShowIcon() Dim l As Long If (Icon_Add(Form1.Command1.hwnd, Form1.Picture)) Then lproc = SetWindowLong(Form1.Command1.hwnd, GWL_WNDPROC, AddressOf DialogProc) Else MsgBox (“無(wú)法建立程序圖標(biāo)!") End End If End Sub Sub LoadDisplayMode() Dim i As Long Dim l1 As Long Dim astr As String i = 0 '遍歷所有的顯示模式并在List1中顯示出來(lái) Do ModeCube(i).dmFields = DM_BITSPERPEL Or DM_PELSWIDTH Or DM_PELSHEIGHT Or _ DM_DISPLAYFLAGS Or DM_DISPLAYFREQUENCY ModeCube(i).dmSize = Len(ModeCube(i)) '獲得顯示模式并保存到數(shù)組中 l1 = EnumDisplaySettings(vbNullString, i, ModeCube(i)) If l1 Then astr = Str$(ModeCube(i).dmPelsWidth) + “*" + Trim$(Str$(ModeCube(i).dmPelsHeight)) +“ " Select Case ModeCube(i).dmBitsPerPel Case 4 astr = astr + “16色" Case 8 astr = astr + “256色" Case 16 astr = astr +“16位高彩" Case 24 astr = astr + “24位真彩" Case Else astr = astr + Str$(ModeCube(i).dmBitsPerPel) End Select i = i + 1 End If List1.AddItem astr Loop Until (l1 = False) '獲得最后一個(gè)顯示模式之后EnumDisplaySettings會(huì)返回False End Sub Private Sub Command1_Click() Dim aDev As DEVMODE Dim b, xxa, xxb, xxc, xxd As Long If List1.ListIndex < 0 Then Exit Sub aDev = ModeCube(List1.ListIndex) 'CDS_FORCE在Microsoft的開(kāi)發(fā)文檔中沒(méi)有說(shuō)明 b = ChangeDisplaySettings(aDev, CDS_FORCE) '改變完顯示模式設(shè)置之后向所有的窗口發(fā)送顯示模式改變消息 xxc= Send Message ByLong(HWND_BROADCAST, WM_SYSCOLORCHANGE, 0&, 0&) xxa = SendMessageByLong(HWND_BROADCAST, WM_PALETTECHANGED, Me.hwnd, 0&) xxb = PostMessage(HWND_BROADCAST, WM_SYSCOLORCHANGE, 0&, 0&) xxd = InvalidateRect(0&, ByVal 0, 1&) End Sub Private Sub Command2_Click() Dim aDev As DEVMODE Dim tempVar As String Dim RetVal Dim shellString As String If List1.ListIndex < 0 Then Exit Sub aDev = ModeCube(List1.ListIndex) tempVar = LTrim$(Str(aDev.dmPelsWidth)) + “x" + LTrim$(Str(aDev.dmPelsHeight)) + “x" + LTrim$(Str(aDev.dmBitsPerPel)) Debug.Print tempVar shellString =“Rundll.exe DeskCp16.dll,QUICKRES_RUNDLLENTRY " shellString = shellString + tempVar '調(diào)用Windows中的QuickRes庫(kù)來(lái)改變顯示模式,如果你的系統(tǒng)中沒(méi)有安裝QuickRes系統(tǒng)將會(huì)產(chǎn)生一個(gè)錯(cuò)誤 RetVal = Shell(shellString, 1) End Sub Private Sub Form_Load() Command1.Caption = “使用API函數(shù)改變分辨率" Command2.Caption =“使用QuickRes庫(kù)" LoadDisplayMode End Sub 運(yùn)行程序,點(diǎn)擊選擇ListBox中的顯示模式,然后按下“使用API函數(shù)改變分辨率”鍵或者“使用QuickRes庫(kù)”鍵,就可以切換顯示模式到所需要的模式了。 需要說(shuō)明的一點(diǎn)是,在程序中的改變顯示模式的語(yǔ)句 b = ChangeDisplaySettings(aDev, CDS_FORCE) 中的常量CDS_FORCE是一個(gè)未公開(kāi)(UnDocument)的定義,在微軟的幫助文檔是沒(méi)有有關(guān)的說(shuō)明的。 以上的程序在Win98、VB6下運(yùn)行通過(guò)。(長(zhǎng)沙 陳銳) |
|