我在我的头上,我希望这里有人可以提供帮助。
我正在使用在Windows Mobile OS版本5和/或6上运行的应用程序,该应用程序是用嵌入式C ++编写的。问题是,当用户做一些切换显示方向的事情时,应用程序中的控件会全部搞乱并移动,例如打开设备的键盘。
在这一点上,我一直在看着这个,并且有点绝望。所以,我想我现在希望有一个快速而肮脏的解决方案,如果一个甚至存在。如果可能的话,我想尝试有效地将设备锁定为纵向显示,或者可能找到一种检测方向开关的方法,这样我就可以始终如一地强制显示回到纵向模式。
我一直在阅读文章(见帖子底部的部分列表),但是还没有能够解决这个问题。
是否存在某些可触发的事件,然后应用代码(尚未解决)来重置方向?
以下列出了我一直试图理解的一些文章:
以编程方式更改屏幕方向 http://msdn.microsoft.com/en-us/library/ms812499.aspx
ChangeDisplaySettingsEx功能 http://msdn.microsoft.com/en-us/library/dd183413(VS.85).aspx
ChangeDisplaySettingsEx http://msdn.microsoft.com/en-us/library/aa923082.aspx
Windows Mobile应用程序开发入门
http://www.eetimes.com/design/other/4006712/Getting-Started-With-Windows-Mobile-Application-Development
应用程序如何检测并响应屏幕旋转
http://msdn.microsoft.com/en-us/library/bb158688.aspx
DEVMODE http://msdn.microsoft.com/en-us/library/dd183565(VS.85).aspx
答案 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 : ...
}