Как обнаружить событие изменения ориентации экрана в приложении Windows Mobile 5 & 6 со встроенным C ++? - PullRequest
1 голос
/ 13 августа 2010

Я в пути над головой и надеюсь, что кто-нибудь здесь сможет помочь.

Я работаю с приложением, работающим в ОС Windows Mobile версии 5 и / или 6, написанным на Embedded C ++. Проблема в том, что элементы управления в приложении все перепутаны и перемещаются, когда пользователь делает что-то для изменения ориентации дисплея, например, открывает клавиатуру устройства.

В этот момент я смотрю на это вечно и немного отчаялся. Итак, я полагаю, что теперь я надеюсь на быстрое и грязное решение, если оно вообще существует. Я хотел бы попытаться по возможности эффективно заблокировать устройство для портретного отображения или, возможно, найти способ обнаружить переключатель ориентации, чтобы я мог последовательно принудительно вернуть дисплей в портретный режим.

Я читал статью за статьей (см. Частичный список внизу поста), но просто не смог разобраться с этим.

Есть ли какое-то событие, на котором я могу схватиться, а затем применить код (еще не выработанный) для сброса ориентации?

Вот список некоторых статей, которые я пытался понять:

1 Ответ

4 голосов
/ 17 августа 2010

Эта функция должна определять, находится ли экран в режиме протрейта:

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;
...