适用于:Microsoft Windows XP
简介
有些情况下,应用程序需要更改屏幕方向,因为有的功能被设计为在特定模式下运行得最好。其中一个例子就是 Microsoft Office PowerPoint 中的“幻灯片放映”:PowerPoint 以横向模式运行。即使正在纵向模式下使用 Tablet PC,当开始幻灯片放映时,应用程序也会切换到横向方向。当用户结束幻灯片放映时,PowerPoint 会切换回原来的设置。
概述
更改显示设置可以通过使用两个 Win32 API 来完成,这两个 API 都具有指向 DEVMODE 结构的指针,它们分别包含与显示设置有关的所有信息: 
◆使用 EnumDisplaySettings 读取当前显示设置,并枚举所有受支持的显示设置。  
◆使用 ChangeDisplaySettings 切换到新的显示设置。
使用示例
要编译示例源代码,计算机中必须安装 Microsoft Visual Studio .NET 2003。该示例应用程序有一个用户界面,它具有以下功能: 
◆查看当前显示设备所支持的所有显示设置。  
◆查看当前显示设置的参数。  
◆切换至任何受支持的显示设置。  
◆顺时针和逆时针旋转屏幕方向。 
获取当前显示设置
要获取当前显示设置,请将 iModeNum 参数中的 ENUM_CURRENT_SETTINGS 常量传递给 EnumDisplaySettings API,如以下 C++ 代码所示。
| DEVMODE dm;
 // initialize the DEVMODE structure
 
 ZeroMemory(&dm, sizeof(dm));
 
 dm.dmSize = sizeof(dm);
 if (0 != EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &dm))
 {
 
 // inspect the DEVMODE structure to obtain details
 
 // about the display settings such as
 
 //  - Orientation
 
 //  - Width and Height
 
 //  - Frequency
 
 //  - etc.
 
 }
 | 
枚举所有受支持的显示设置
要枚举当前显示设备支持的所有显示设置,请将 iModeNum 参数中的 0 传递给 EnumDisplaySettings API,然后继续以递增的 iModeNum 值调用它,直到该函数返回零,如以下 C++ 代码所示。
| int index = 0;
 DEVMODE dm;
 
 // initialize the DEVMODE structure
 
 ZeroMemory(&dm, sizeof(dm));
 
 dm.dmSize = sizeof(dm);
 while (0 != EnumDisplaySettings(NULL, index++, &dm))
 {
 
 // inspect the DEVMODE structure to obtain details
 
 // about the display settings such as
 
 //  - Orientation
 
 //  - Width and Height
 
 //  - Frequency
 
 //  - etc.
 
 }
 | 
更改显示设置
要更改显示设置,请将指向有效 DEVMODE 结构的指针传递给 ChangeDisplaySettings API。以下 C++ 代码演示如何使屏幕方向顺时针旋转 90 度。请注意,这段代码只对支持相应显示设置的设备起作用。遵守ChangeDisplaySettings API 的返回值十分重要,因为有些操作为了在图形模式下工作,需要计算机重启。
| DEVMODE dm;
 // initialize the DEVMODE structure
 
 ZeroMemory(&dm, sizeof(dm));
 
 dm.dmSize = sizeof(dm);
 if (0 != EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &dm))
 {
 
 // swap height and width
 
 DWORD dwTemp = dm.dmPelsHeight;
 
 dm.dmPelsHeight= dm.dmPelsWidth;
 
 dm.dmPelsWidth = dwTemp;
 // determine new orientaion
 switch (dm.dmDisplayOrientation)
 
 {
 
 case DMDO_DEFAULT:
 
 dm.dmDisplayOrientation = DMDO_270;
 
 break;
 
 case DMDO_270:
 
 dm.dmDisplayOrientation = DMDO_180;
 
 break;
 
 case DMDO_180:
 
 dm.dmDisplayOrientation = DMDO_90;
 
 break;
 
 case DMDO_90:
 
 dm.dmDisplayOrientation = DMDO_DEFAULT;
 
 break;
 
 default:
 
 // unknown orientation value
 
 // add exception handling here
 
 break;
 
 }
 
 long lRet = ChangeDisplaySettings(&dm, 0);
 
 if (DISP_CHANGE_SUCCESSFUL != lRet)
 
 {
 
 // add exception handling here
 
 }
 
 }
 |