如何在Windows Mobile 5&amp ;;中检测屏幕方向更改事件6 App,嵌入式C ++?

时间:2010-08-12 23:16:23

标签: c++ events windows-mobile screen-orientation

我在我的头上,我希望这里有人可以提供帮助。

我正在使用在Windows Mobile OS版本5和/或6上运行的应用程序,该应用程序是用嵌入式C ++编写的。问题是,当用户做一些切换显示方向的事情时,应用程序中的控件会全部搞乱并移动,例如打开设备的键盘。

在这一点上,我一直在看着这个,并且有点绝望。所以,我想我现在希望有一个快速而肮脏的解决方案,如果一个甚至存在。如果可能的话,我想尝试有效地将设备锁定为纵向显示,或者可能找到一种检测方向开关的方法,这样我就可以始终如一地强制显示回到纵向模式。

我一直在阅读文章(见帖子底部的部分列表),但是还没有能够解决这个问题。

是否存在某些可触发的事件,然后应用代码(尚未解决)来重置方向?

以下列出了我一直试图理解的一些文章:

2 个答案:

答案 0 :(得分:4)

此功能应检测屏幕是否处于protrait模式:

BOOL IsPortrait()
{
  DEVMODE devmode;
  ZeroMemory(&devmode, sizeof(DEVMODE));
  devmode.dmSize = sizeof(DEVMODE);
  devmode.dmDisplayOrientation = DMDO_0;
  devmode.dmFields = DM_DISPLAYORIENTATION;
  ChangeDisplaySettingsEx(NULL, &devmode, NULL, CDS_TEST, NULL);

  return devmode.dmDisplayOrientation == DMDO_0;
}

此功能应旋转为纵向模式:

void RotatePortrait(void)
{
  DEVMODE devmode;
  ZeroMemory(&devmode, sizeof(DEVMODE));
  devmode.dmSize = sizeof(DEVMODE);
  devmode.dmFields = DM_DISPLAYORIENTATION;
  devmode.dmDisplayOrientation = DMDO_0;

  ChangeDisplaySettingsEx(NULL, &devmode, NULL, 0, NULL);
}

您需要一个处理WM_SETTINGCHANGE消息的顶级窗口(无父级)来检测旋转。

//...in WndProc...
case WM_SETTINGCHANGE:
  if (!IsPortrait())
  {
    RotatePortrait();
  }
  break;

答案 1 :(得分:1)

使用ChangeDisplaySettingsEx()标志调用CDS_TEST仅测试是否可以设置模式 ;它不会查询当前设置。而是将EnumDisplaySettingsEx()ENUM_CURRENT_SETTINGS一起使用:

DEVMODE devmode;
ZeroMemory(&devmode, sizeof(devmode));
devmode.dmSize = sizeof(DEVMODE);
EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &devmode);

// returned rotation is relative to the natural (default) rotation for this display
switch(devmode.dmDisplayOrientation)
    {
    case DMDO_90  : ...
    case DMDO_180 : ...
    case DMDO_270 : ...
    case DMDO_DEFAULT : ...
    }