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; }