2

我有点不知所措,希望这里的任何人都可以提供帮助。

我正在使用在 Windows Mobile OS 版本 5 和/或 6 上运行的应用程序,该应用程序是用嵌入式 C++ 编写的。问题在于,当用户执行某些操作来切换显示方向(例如打开设备的键盘)时,应用程序中的控件会变得混乱并四处移动。

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

我一直在阅读一篇又一篇文章(请参阅帖子底部的部分列表),但一直无法解决这个问题。

是否有某种事件可以触发我可以抓住,然后应用代码(尚未解决)来重置方向?

以下是我一直试图理解的一些文章的列表:

4

2 回答 2

4

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

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;
于 2010-08-17T03:08:47.243 回答
1

ChangeDisplaySettingsEx()使用CDS_TEST标志调用仅测试是否可以设置模式;它不查询当前设置。相反,使用EnumDisplaySettingsEx()with 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 : ...
    }
于 2020-10-22T22:35:26.143 回答