科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件以编程方式更改屏幕方向(1)

以编程方式更改屏幕方向(1)

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

本文描述如何以编程方式更改显示设备的方向、分辨率及其他方面。相应示例采用C#编写。

作者:Stefan Wick 来源:51CTO.com 2007年9月1日

关键字: 编程 屏幕 方向

  • 评论
  • 分享微博
  • 分享邮件

适用于: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

}

}

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章