如何在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是一个很好的例子。