Pocket PC 屏幕旋转






3.71/5 (6投票s)
一个关于如何旋转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