Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Windows Mobile 5和6应用程序中检测屏幕方向改变事件,用嵌入式C++?_C++_Events_Windows Mobile_Screen Orientation - Fatal编程技术网

如何在Windows Mobile 5和6应用程序中检测屏幕方向改变事件,用嵌入式C++?

如何在Windows Mobile 5和6应用程序中检测屏幕方向改变事件,用嵌入式C++?,c++,events,windows-mobile,screen-orientation,C++,Events,Windows Mobile,Screen Orientation,我有点不知所措,希望这里的任何人都能帮助我 我正在使用一个运行在Windows Mobile OS上的应用程序,版本5和/或6,是用嵌入式C++编写的。问题在于,当用户切换显示方向时,比如打开设备键盘,应用程序中的控件会变得一团糟,四处移动 在这一点上,我一直在关注这一点,我变得有点绝望。所以,我想我现在希望有一个快速而肮脏的解决方案,如果有的话。如果可能的话,我想尝试有效地将设备锁定到纵向显示,或者找到一种检测方向开关的方法,这样我就可以始终如一地强制显示器返回纵向模式 我读了一篇又一篇文章,

我有点不知所措,希望这里的任何人都能帮助我

我正在使用一个运行在Windows Mobile OS上的应用程序,版本5和/或6,是用嵌入式C++编写的。问题在于,当用户切换显示方向时,比如打开设备键盘,应用程序中的控件会变得一团糟,四处移动

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

我读了一篇又一篇文章,看到了文章底部的部分列表,但就是没能解决这个问题

是否有某种触发事件,我可以抓住它,然后应用代码重新设置方向

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

以编程方式更改屏幕方向

更改显示设置性别功能

更改显示设置性别

调整你的应用程序

Windows Mobile应用程序开发入门

应用程序如何检测和响应屏幕旋转

DEVMODE


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

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);
}
此功能应旋转至纵向模式:

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;
使用CDS_测试标志调用ChangeDisplaySettingsEx仅测试是否可以设置模式;它不查询当前设置。相反,请将EnumDisplaySettingsEx与ENUM_当前_设置一起使用:


哇!这正是我一直想弄明白的。。。差不多一个星期了。你太棒了,格威尔。如果我能请你喝一杯的话,我会的。我发现在纵向和纵向翻转或横向和横向翻转之间切换显示时,WM_设置更改不会发送。然而,WM_DISPLAYCHANGE是一个很好的例子。