您的位置:首页 > 其它

获取 WinCE 移动设备屏幕旋转方向

2016-02-21 16:06 351 查看
获取 WinCE 移动设备屏幕旋转方向,分别从系统提供的接口和注册表获取。如果都获取不到,则采用默认值。

#ifndef DMDO_ZERO
#define DMDO_ZERO     0
#endif
#ifndef DMDO_90
#define DMDO_90       1
#endif
#ifndef DMDO_180
#define DMDO_180      2
#endif
#ifndef DMDO_270
#define DMDO_270      4
#endif

//direction flags
#define DIR_SWAPXY          0x001
#define DIR_MIRRORLEFTRIGHT 0x002
#define DIR_MIRRORUPDOWN    0x004

static int giOrientation = -1;

#define TARGET_WINCE
int GetOrientation()
{
#if defined(TARGET_WINCE)
if(giOrientation < 0)
{
HKEY Key;
// context *p = NULL;
char Buffer[256];
DEVMODE *Mode = (DEVMODE *)Buffer;    // 一个比较复杂的结构体, 定义请参看 MSDN

Mode->dmSize = 192;
Mode->dmFields = 0x01000000L;

static LONG (WINAPI *FuncChangeDisplaySettingsEx)(LPCTSTR,LPDEVMODE,HWND,DWORD,LPVOID) = NULL;

HINSTANCE CoreDLL = LoadLibrary(_T("coredll.dll"));
if (CoreDLL)
{
*(FARPROC *)&FuncChangeDisplaySettingsEx = GetProcAddress(CoreDLL,_T("ChangeDisplaySettingsEx"));
}

if(FuncChangeDisplaySettingsEx &&
0 == FuncChangeDisplaySettingsEx(NULL, Mode, NULL, CDS_TEST, NULL))
{
Mode->dmFields = 0x00800000L;
FuncChangeDisplaySettingsEx(NULL, Mode, NULL, CDS_TEST, NULL);

switch((&Mode->dmDisplayFrequency)[1]) //(Mode->dmDisplayOrientation)
{
case DMDO_ZERO:
giOrientation = 0;
break;
case DMDO_90:
giOrientation = DIR_SWAPXY | DIR_MIRRORUPDOWN;
break;
case DMDO_270:
giOrientation = DIR_SWAPXY | DIR_MIRRORLEFTRIGHT;
break;
case DMDO_180:
giOrientation = DIR_MIRRORUPDOWN | DIR_MIRRORLEFTRIGHT;
break;
default:
// giOrientation = 0;
break;
}
}

if(giOrientation < 0 && ERROR_SUCCESS == RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("System\\GDI\\ROTATION"), 0, KEY_READ, &Key))
{
DWORD dwValue;
DWORD dwRegSize = sizeof(dwValue);
DWORD dwRegType;

if(ERROR_SUCCESS == RegQueryValueEx(Key, _T("Angle"), 0, &dwRegType, (LPBYTE) &dwValue, &dwRegSize))
{
switch(dwValue)
{
case 0:
giOrientation = 0;
break;
case 90:
giOrientation = DIR_SWAPXY | DIR_MIRRORUPDOWN;
break;
case 270:
giOrientation = DIR_SWAPXY | DIR_MIRRORLEFTRIGHT;
break;
case 180:
giOrientation = DIR_MIRRORUPDOWN | DIR_MIRRORLEFTRIGHT;
break;
default:
// giOrientation = 0;
break;
}
}

RegCloseKey(Key);
}

if(giOrientation < 0)
giOrientation = 0;
}
#else
giOrientation = 0;
#endif

RETAILMSG(1,(L"[%s]Orientation: %d\r\n",CString(__FUNCTION__),giOrientation));        // [GetOrientation]Orientation: 0
return giOrientation;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: