65.9K
CodeProject 正在变化。 阅读更多。
Home

Pocket PC 屏幕旋转

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.71/5 (6投票s)

2007年4月12日

CPOL

2分钟阅读

viewsIcon

53397

一个关于如何旋转Pocket PC屏幕的基本示例。

引言

这周我需要实现一个功能,根据所选屏幕的内容来旋转我的应用程序运行的Pocket PC屏幕。我开始了一些研究,但没有找到任何相关信息。实际上,我甚至找不到一个起点。

我想到可以使用SystemParametersInfo API来实现这个功能,所以我就去MSDN查看了它的参数。似乎没有任何东西能满足我的需求。

于是,我开始浏览整个Windows CE 3.0 SDK。再次,我什么也没找到。

我决定查看一下ChangeDisplaySettingsEx API,我之前已经多次使用过它,但用于Win32应用程序,而不是Pocket PC应用程序。通过查看DEVMODE结构,我看到了成员dmDisplayOrientation,并意识到我快要弄清楚如何实现这个功能了。

事实上,ChangeDisplaySettingsEx同时存在于两个SDK中(Pocket PC和Win32)。

一旦我找到了这个结构成员,就很容易弄清楚如何将其付诸实践。

使用代码

使用这个API来翻转/旋转Pocket PC屏幕非常简单,但重要的是要提到,它不存在于Windows CE 3.0或更早版本中,并且屏幕翻转的能力也取决于显示设备是否支持它。

在尝试翻转屏幕之前,最好检查设备是否支持该功能,并根据结果警告用户设备不支持屏幕旋转。

在进入代码本身之前,我想列出下面的角度常量

DMDO_0

表示显示器处于纵向模式。

DMDO_90

表示显示器处于横向模式,适合右手用户。

DMDO_180

表示显示器处于倒置纵向模式。

DMDO_270

表示显示器处于横向模式,适合左手用户。

这些常量是我们想要将显示器置于给定位置时使用的,它们也可以用来确定设备支持哪些位置。

下面我说明如何检查设备支持哪些位置

//
// Check the device for capabilty to rotate the display
// 

DEVMODE DeviceMode;

memset(&DeviceMode, NULL, sizeof(DEVMODE));

DeviceMode.dmSize = sizeof(DeviceMode);
DeviceMode.dmFields = DM_DISPLAYQUERYORIENTATION;

ChangeDisplaySettingsEx(NULL, &DeviceMode, NULL, CDS_TEST, NULL);

现在你可以对结构成员dmDisplayOrientation执行按位运算,以找出支持哪些常量。当然,如果dmDisplayOrientation中不存在这些常量中的任何一个,则表示设备不支持屏幕旋转。

一旦你知道设备支持屏幕旋转,你就可以查询屏幕的当前位置,方法如下

//
// Determine the current position of the screen
// 

DEVMODE DeviceMode;
    
memset(&DeviceMode, NULL, sizeof(DeviceMode));
DeviceMode.dmSize=sizeof(DeviceMode);
DeviceMode.dmFields = DM_DISPLAYORIENTATION;

if ( 
   DISP_CHANGE_SUCCESSFUL == ChangeDisplaySettingsEx(
                            NULL, 
                            &DeviceMode, 
                            NULL, 
                            CDS_TEST, 
                            NULL
                            )
  )
//ChangeDisplaySettingsEx executed successfully
{
    switch (DeviceMode.dmDisplayOrientation)
    {
    case DMDO_0:
    //The display is currently in portrait mode

    case DMDO_90:
    //The display is currently in landscape mode 
    //for people who uses right hand

    case DMDO_180:
    //The display is currently in upside-down portrait mode

    case DMDO_270:
    //The display is currently in landscape mode 
    //for people who uses left hand

    }

}
        return DeviceMode.dmDisplayOrientation;
else
//Error executing ChangeDisplaySettingsEx

最后,如何设置所需的位置

//
// Change the position of the screen
//

DEVMODE DeviceMode;
    
memset(&DeviceMode, NULL, sizeof(DeviceMode));
DeviceMode.dmSize=sizeof(DeviceMode);
DeviceMode.dmFields = DM_DISPLAYORIENTATION;
DeviceMode.dmDisplayOrientation = DMDO_90; //Put your desired 
                       //position right here.

if (DISP_CHANGE_SUCCESSFUL == ChangeDisplaySettingsEx(
                            NULL,
                            &DeviceMode,
                            NULL,
                            CDS_RESET,
                            NULL
                             )
   )
   //Screen was rotated successfully
else
   //Screen could not be rotated
© . All rights reserved.