WinCEモバイルデバイス画面回転方向の取得
2931 ワード
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
",CString(__FUNCTION__),giOrientation)); // [GetOrientation]Orientation: 0
return giOrientation;
}