在WinCE中實現Screen Rotation

      在WinCE中做Screen Rotation,首先確認顯示設備的驅動是否支持Screen Rotation功能。在顯示設備支持的前提下,可以通過以下兩種方法做Screen Rotation:

      1.       通過修改註冊表做Rotation 

默認情況下,屏幕都是正常顯示的,也就是說翻轉角度爲0度。可以通過修改註冊表來做屏幕翻轉,通過修改”Angle”的值來完成,具體設置如下:
[HKEY_LOCAL_MACHINE/System/GDI/Rotation]
    "Angle"=dword:5A          ;翻轉90度,羅嗦一句,5A就是90的十六進制
      
可以設置爲0度,90度,180度和270度。也就是0,5A,B4和10E,通過設置這些值可以達到屏幕翻轉的目的。你可以在Build image的時候就做這件事情,只要在project.reg文件裏面加入上面的設置,然後重新make image,這樣新的image啓動以後就會按照你的設定來顯示。也可以在WinCE啓動以後,編個讀寫註冊表的小程序,來修改這個值,然後重新啓動就可以了(系統要支持HIVE-Based Registry)。
    2. 通過ChangeDisplaySettingEx(..)做Rotation
應該說,該函數用來改變顯示設置,具體可參見MSDN。我再來簡單說一下:
       函數如下:
LONG ChangeDisplaySettingsEx(
         LPCTSTR lpszDeviceName,
         LPDEVMODE lpDevMode,
         HWND hwnd,
         DWORD dwflags,
         LPVOID lParam
);
              lpszDeviceName:沒有被使用,設置爲NULL。
              lpDevMode        指向一個DEVMODE結構指針。
              hwnd                 預留。必須設置爲NULL。
              dwflags            
                                          0:目前Screen的圖形模式可以動態改變
                                          CDS_RESET:即使請求的設置和當前設置一樣,也去改變。
                                          CDS_TEST:請求的圖形模式被設置,則系統進行測試。                
                                          CDS_VIDEOPARAMETERS:被設置,則lParam傳入一個指向VIDEOPARAMETERS結構的指針。
              lParam              如果dwflags設置爲CDS_VIDEOPARAMETERS,則傳入一個指向VIDEOPARAMETERS結構的指針;否則設置爲NULL;
       關於DEVMODE結構,還是挺複雜的,一般在CE裏面不會都用,這裏只介紹幾個我用到的:
         dwSize       描述DEVMODE結構的大小,設置爲sizeof(DEVMODE)。
         dmFields    初始化標記位。在作Rotation的時候,會用到的是DM_DISPLAYQUERYORIENTATION和DM_DISPLAYORIENTATION。前一個用來查詢目前的顯示驅動是否支持Rotation,後一用來實現屏幕翻轉。
     dmDisplayOrientation:設置翻轉的角度。具體如下:
                      
DMDO_0
The screen is rotated by 0 degrees.
DMDO_90
The screen is rotated by 90 degrees counterclockwise.
DMDO_180
The screen is rotated by 180 degrees.
DMDO_270
The screen is rotated by 270 degrees counterclockwise.
 一般在WinCE下,調用該函數作Rotation的時候,我們會首先判斷目前的設備是否支持Rotation,程序如下:
       memset (&DevMode, 0, sizeof (DevMode));
       DevMode.dmSize   = sizeof (DevMode);
       DevMode.dmFields = DM_DISPLAYQUERYORIENTATION;
       if (DISP_CHANGE_SUCCESSFUL == ChangeDisplaySettingsEx(NULL, &DevMode, NULL, CDS_TEST, NULL))
       {
              MessageBox((L”Support.”));
              CurrentAngle = DevMode.dmDisplayOrientation;
       }
       else
       {
              MessageBox((L"Not Support."));
       }
       如果設備支持Rotation,就可以進行Rotation操作,下面的程序將屏幕翻轉爲90度,程序如下:
       memset(&DevMode, 0, sizeof (DevMode));
       DevMode.dmSize = sizeof (DevMode);
       DevMode.dmFields = DM_DISPLAYORIENTATION;
       DevMode.dmDisplayOrientation = DMDO_90;
       if (DISP_CHANGE_SUCCESSFUL != ChangeDisplaySettingsEx(NULL, &DevMode, NULL, CDS_RESET, NULL))
       {
              MessageBox((L"Rotation Error."));
       }
else
{
              MessageBox((L”Rotation OK.”));
       }
 
       上面兩種方法都可以實現Screen Rotation,第一種通過修改註冊表的方法不能立刻實現Rotation,要等設備reboot以後纔會生效。第二種方法不需要重新啓動,函數調用成功後,屏幕就會被翻轉,但是下次啓動以後又會恢復默認值。
                                                                                                                                        作者:ARM-WinCE
 
 
 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章