1.BOOL GetDCOrgEx(HDC hdc, LPPOINT lpPoint);
函數功能:該函數得到設備上下文環(huán)境的最終轉換原點(diǎn),最終轉換原點(diǎn)指定了一個(gè)位移。系統使用該位移把設備轉換成客戶(hù)坐標。
參數:
hdc:指定設備上下文環(huán)境,該設備上下文環(huán)境的最終轉換原點(diǎn)將要被檢索。
lpPoint:指向POINT結構的指針,該函數將把它置為最終轉換原點(diǎn),以設備坐標的形式。
返回值:如果成功,返回非零值,如果失敗,返回零。
Windows NT:若想獲得更多錯誤信息,請調用GetLastError函數。
注釋?zhuān)鹤罱K轉換原點(diǎn)與屏幕的物理原點(diǎn)有關(guān)。
2. LONG ChangeDisplaySettings (LPDEVMODE lpDevMode, DWORD dwflags);
函數功能:該函數把缺省顯示設備的設置改變?yōu)橛蒷pDevMode設定的圖形模式,要改變一個(gè)特定顯示設備的設置,請使用ChangeDisplaySettingsEx函數。
參數:
lpDevMode:指向一個(gè)描述轉變圖表的DEVMODE的指針。DEVMODE的dmSize參數必須依DEVMODE結構的大小、字節進(jìn)行初始化,dmDriveExtra參數必須初始化來(lái)顯示DEVMODE隨后的驅動(dòng)數據的字節數,另外還可以選用以下參數:
dmBitsPerPel每個(gè)像素的位數,dmPelsWidth像素寬度,dmPelsHeight像度高度,dmDisplayFlage模式標志。
dmDisplayFrequency模式頻率。
dmposition在多顯示配置中設備的位置(適用于Windows 98、Windows NT 5.0及以后版本)。
除了設置好DEVMOD結構中諸多元素的值之外,還必須要正確地設置dmFields元素中的標志。這些標志表明了DEVMODE結構中哪個(gè)元素在改變顯示設置時(shí)使用了。如果在dmFields中沒(méi)有設置正確的位,那么顯示設置將不會(huì )發(fā)生變化。請設置好以下的標志:
DM_BITSPERPEL使用dmBitsPerPel的值,DM_PELSWIDTH使用dmPelsWidth的值,
DM_PELSHEIGHT使用dmPelsHeight的值,DM_DISPLAYFLAGS使用dmDisplayFlags的值,
DM_DISPLAYFREQUENCY使用dmDisplayFrequency的值。
DM_POSITION使用fdmPosition的值(適用于Windows98、WindowsNT5.0)。
如果lpDevMode為空。那么顯示設置就使用注冊表中的所有當前值。在顯示模式動(dòng)態(tài)地調整之后要想再回到缺省的模式,最簡(jiǎn)單的辦法就是把lpDevMode參數置為空,使dwFlags參數置為0。
dwflags:表明了圖形模式如何改變,它可能是如下的幾種形式中的一種:
0:表明當前屏幕的圖形模式要動(dòng)態(tài)地改變。
CDS_UPDATEREGISTRY:表明當前屏幕的圖形模式會(huì )動(dòng)態(tài)地變化,并且該圖形模式會(huì )更新注冊表。該模式信息存貯在用戶(hù)檔案中。
CDS_TEST:系統檢測是否要設置被請求的圖形模式。
CDS_FULLSCREEN:從本質(zhì)上講該模式是暫時(shí)的。
CDS_GLOBAL:該設置保存在全局設置區域內, 因此它們會(huì )影響所有的用戶(hù)。該標志僅在與標志一起使用時(shí)才有效。CDS_SET_PRIMARY:該設備成為首要設備。
CDS_RESET:設置要改變,即使請求的設置與當前設置一樣。CDS_NORESET:設置保存在注冊表中,但是它不起作用,該標志只有與CDS_UPDATEREGISTRY標志一起使用時(shí)才有效。
指定CDS_TEST允許一個(gè)應用確定哪個(gè)圖形模式真正的有效。但并不會(huì )使系統變?yōu)槟莻€(gè)有效的圖形模式。
如果CDS_UPDATEREGISTRY被指定并且它可能會(huì )動(dòng)態(tài)地改變圖形模式。則注冊表中保存該信息并且返回DISP_CHANGE_SUCCESSFUL如果不可能使用圖形模式動(dòng)態(tài)地改變,則注冊表中保存該信息并且返回DISP_CHANGE_RESTART。
Windows NT:如果指定了CDS_UPDATEREGISTRY并且在注冊表中不能保存該信息,則圖形模式不會(huì )改變,并且返回DISP_CHANGE_NOTUPDATERD。
返回值:ChangeDisplaySettings函數的返回值如下:
DISP_CHANGE_SUCCESSFUL:設備改變成功。
DISP_CHANGE_RESTART:為使圖形模式生效計算機必須重新啟動(dòng)。
DISP_CHANGE_BADFLAGS:標志的無(wú)效設置被傳送。
DISP_CHANGE_NOTUPDATED:在WindowsNT中不能把設置寫(xiě)入注冊表。
DISP_CHANGE_BADPARA:一個(gè)無(wú)效的參數被傳遞。它可以包括一個(gè)無(wú)效的標志或標志的組合。
DISP_CHANGE_FAILED:指定圖形模式的顯示驅動(dòng)失效。
DISP_CHANGE_ADMODE:不支持圖形模式。
注釋?zhuān)簽榱吮WC傳遞給ChangeDisplaySetting的DEVMODE結構是有效的,并且僅包含顯示驅動(dòng)支持的值,可以使用由EnumDisplaySettings函數返回的DEVMODE。
當顯示模式被動(dòng)態(tài)地改變時(shí),WM_DISPLAYCHANGE消息帶著(zhù)如下的消息參數傳遞給所有正在運行的應用:
wParam每像素點(diǎn)的新位數,LOWORD(lParam)新像素寬度,HIWORD(lParam)新像素高度。
下面舉一具體的例子來(lái)說(shuō)明在VC中如何修改顯示器的分辨率和色彩。假設我們想將當前顯示器的分辨率設為800X600,并使用24位色(色彩為224種)。
步驟1、新建一MFC AppWizard項目,本文為節約篇幅起見(jiàn),在向導的第一步中選擇基于對話(huà)框(Dialog Baseed)的程序。在向導的其余步驟中全部使用默認值。
步驟2、在對話(huà)框中新添加一按鈕,標題設為“測試”。
步驟3、雙擊“測試”按鈕,系統提示新建一函數OnButton1對應于該按鈕的CLICK事件。OnButton1函數的具體代碼如下:
void CChange_fenbianDlg::OnButton1()
{
DEVMODE lpDevMode;
lpDevMode.dmBitsPerPel=24;
lpDevMode.dmPelsWidth=800;
lpDevMode.dmPelsHeight=600;
lpDevMode.dmSize=sizeof(lpDevMode);
lpDevMode.dmFields =DM_PELSWIDTH|DM_PELSHEIGHT|DM_BITSPERPEL;
LONG result;
result=ChangeDisplaySettings(&lpDevMode,0);
if (result==DISP_CHANGE_SUCCESSFUL)
{
AfxMessageBox("修改成功!");
ChangeDisplaySettings(&lpDevMode,CDS_UPDATEREGISTRY);
//使用CDS_UPDATEREGISTRY表示次修改是持久的,
//并在注冊表中寫(xiě)入了相關(guān)的數據
}
else
{
AfxMessageBox("修改失敗,恢復原有設置!");
ChangeDisplaySettings(NULL,0);
}
}
說(shuō)明:上述函數中對ChangeDisplaySettings的返回值result沒(méi)有作過(guò)多的分析,在實(shí)際操作中出于程序穩健的角度出發(fā),可以對ChangeDisplaySettings的返回值作出更加詳細的判斷,以找出修改不成功的原因
3.LONG ChangeDisplaySettingsEx(LPCSTR lpszDeviceName, LPDEVMODE lpDevMode, HWND hwnd, DWORD dwflags LPVOID lParam);
函數功能:該函數把顯示設備在lpszDeviceName參數中定義的設置,改變?yōu)樵趌pDevMode參數中定義的圖形模式。
參數:
lpszDeviceName:指向一個(gè)以null結尾的字符串的指針,該字符串指定了一個(gè)顯示設備,該函數從該顯示設備中得到它的圖形模式的信息。
查看EnumDisplayDevice函數,可得與這些顯示設備有關(guān)的名字的更詳細的信息,lpszDeviceName參數可以為NULL(空),NULL值定義了缺省的顯示設備。
旋轉屏幕90度ChangeDisplaySettingsEx實(shí)例——WinCE
| DEVMODE DevMode; memset(&DevMode, 0, sizeof (DevMode)); DevMode.dmSize = sizeof (DevMode); DevMode.dmFields = DM_DISPLAYORIENTATION; if (DISP_CHANGE_SUCCESSFUL != ChangeDisplaySettingsEx(NULL, &DevMode, NULL, CDS_TEST, NULL)) { RETAILMSG(1, (L"ChangeDisplaySettingsEx failed to get the supported rotation angles (error=%d).\n", GetLastError())); } else { if(DevMode.dmDisplayOrientation == 0) { DevMode.dmDisplayOrientation = DMDO_90; if (ChangeDisplaySettingsEx(NULL, &DevMode, NULL, CDS_RESET, NULL) != DISP_CHANGE_SUCCESSFUL) { RETAILMSG(1, (L"ChangeDisplaySettingsEx failed to change the rotation angle (error=%d).\r\n", GetLastError())); }
} } |
4.BOOL EnumDisplayDevices(PVOID Unused, DWORD iDevNum, PDISPLAY_DEVICE lpDisplayDevice, DWORD dwFlags);
函數功能:該函數可得到系統中顯示設備的信息。
參數:
Unused:該參數當前不用,應設為Null。
iDevNum:指定感興趣的顯示設備的索引值,操作系統通過(guò)索引值確定每一個(gè)顯示設備。索引值是連續的整數。從0開(kāi)始,例如:如果一個(gè)系統有三個(gè)顯示設備,那么它們的索引值為0、1、2。
lpdisplayDevice:DISPLAY_DEVICE結構的指針,該結構檢索由iDevNum指定的顯示設備的信息,在調用EnumDisplayDevices之前,必須以字節為單位把DISPLAY_DEVICE結構中cb元素初始化為DISPLAY_DEVICE結構的大小。
dwFlags:約束函數行為的一組標志,當前沒(méi)有定義標志。
返回值:如果成功,則返回值非零;如果失敗,則返回值為零;如果iDevNum大于最大的設備索引,則函數失敗。
注釋?zhuān)簽榱瞬樵?xún)系統的所有顯示設備,在一個(gè)循環(huán)中調用該函數開(kāi)始時(shí)iDevNum設為0,并增加iDevNum,直到函數失敗。
5.BOOL EnumDisplaySettings(LPCTSTR lpszDeviceName, DWORD iModeNum, LPDEVMODE lpDevMode);
函數功能:該函數得到顯示設備的一個(gè)圖形模式設備,通過(guò)對該函數一系列的調用可以得到顯示設備所有的圖形模式信息。
參數:
lpszDeviceName:指向一個(gè)以null的結尾的字符串,該字符串指定了顯示設備。此函數將獲得該顯示設備的圖形模式信息。該參數可以為NULL。NULL值表明調用線(xiàn)程正運行在計算機的當前顯示設備上。如果lpszDeviceName為NULL,該字符串的形式為\\.\displayx,其中x的值可以為1、2或3。對于Windows 95和Windows 98,lpszDeviceName必須為NULL。
iModeNum:表明要檢索的信息類(lèi)型,該值可以是一個(gè)圖形模式索引,也可以是下列一值:
ENUM_CURRENT_SETTINGS:檢索顯示設備的當前設置。
ENUM_REGISTRY_SETTINGS:檢索當前存儲在注冊表中的顯示設備的設置。
圖形模式索引值從零開(kāi)始,要得到一個(gè)顯示設備的所有圖形模式信息,可以一系列地調用EnumDisplaySettings函數,并且iModeNum顯為一個(gè)非零值時(shí),則函數返回的信息是最近一次使用iModeNum置為零調用該函數時(shí)存儲的信息。
lpDevMode:DEVMODE結構的指針,該結構存儲指定圖形模式的信息,在調用EnumDisplaySettings之前,設置dmSize為sizeof(DEVMODE),并且以字節為單位,設置dmDriveExtra元素為接收專(zhuān)用驅動(dòng)數據可用的附加空間。
EnumDisplaySettings函數設置如下五個(gè)DEVMODE元素的值:dmBitsPerpel、dmPelsWidth、dmPelsHeight、dmDisplayFlags、dmDisplayFrequency。
返回值:如果成功,返回非零值;如果失敗,返回零。
Windows NT:若想獲得更多錯誤信息,請調用GetLastError函數。
注釋?zhuān)喝绻鹖ModeNum大于顯示設備最后的圖形模式索引,那么函數就會(huì )失敗,如同在iModeNum參數中描述的那樣,使用這種方法可以枚舉顯示設備所有的圖形模式。