實現WinCE的轉屏(屏幕旋轉):轉自互聯網

實現WinCE的轉屏(屏幕旋轉)

    在WinCE中實現屏幕的旋轉(當然角度只能是90度的整數陪),首先確認顯示設備的驅動是否支持旋轉功能。在顯示設備支持的前提下,可以通過以下兩種方法實現屏幕的旋轉:

一、通過修改註冊表實現

    默認情況下,屏幕都是正常顯示的,也就是說翻轉角度爲0度。可以通過修改註冊表來做屏幕翻轉,通過修改”Angle”的值來完成,具體設置如下:
   
[HKEY_LOCAL_MACHINESystemGDIRotation]
   
"Angle"=dword:5A ;翻轉90度,這裏的5A就是90的十六進制 
   
可以設置爲0度,90度,180度和270度。也就是05AB410E,通過設置這些值可以達到屏幕翻轉的目的。你可以在Build image的時候就做這件事情,只要在project.reg文件裏面加入上面的設置,然後重新make image,這樣新的image啓動以後就會按照你的設定來顯示。也可以在WinCE啓動以後,編個讀寫註冊表的小程序,來修改這個值,然後重新啓動就可以了(系統要支持HIVE-Based Registry)

二、通過ChangeDisplaySettingEx系統API實現

    ChangeDisplaySettingEx函數的詳細說明請參見MSDN相關文檔,這裏我們只做簡單的說明,其函數原形如下:
   
LONG ChangeDisplaySettingsEx(
       
LPCTSTR lpszDeviceName, //設置名稱(沒被使用,設置爲NULL
       
LPDEVMODE lpDevMode, // 圖形模式(指向一個DEVMODE結構指針)
       
HWND hwnd,            // 沒被使用;但必需設置爲NULL
       
DWORD dwflags,         // 圖形模式選項
       
LPVOID lParam          //  參數(可爲空)
       
);

如下例子函數實現了在WinCE下把屏幕轉到下一個角度的功能,代碼如下:

    int RotationScreenNextAngles( void )
    {
        int RotationAngles;
        int CurrentAngle;
        int NewAngle;
        DEVMODE DevMode;

注:本函數在VS2008下測試通過

        memset( &DevMode, 0,sizeof(DevMode) );
        DevMode.dmSize   = sizeof   (DevMode);
        DevMode.dmFields = DM_DISPLAYQUERYORIENTATION;

        // Check for rotation support by getting the rotation angles supported.
        if( DISP_CHANGE_SUCCESSFUL == ChangeDisplaySettingsEx(NULL, &DevMode,NULL, CDS_TEST,NULL) )
        {
                RotationAngles = DevMode.dmDisplayOrientation;
        }else
        {
                RotationAngles = -1;
                return -1;
        }

        // Get the current rotation angle.  
        memset( &DevMode, 0, sizeof(DevMode) );
        DevMode.dmSize   = sizeof(DevMode);
        DevMode.dmFields = DM_DISPLAYORIENTATION; 
        if( DISP_CHANGE_SUCCESSFUL == ChangeDisplaySettingsEx( NULL, &DevMode, NULL, CDS_TEST, NULL) )
        {
                CurrentAngle = DevMode.dmDisplayOrientation;
        }else
        {
                CurrentAngle = -1; 
                return -2;
        }

        // Rotate to the "next " angle.
        NewAngle = CurrentAngle; 
        do 
       
                NewAngle <<= 1; 
                if( NewAngle == DMDO_0) 
               
                        NewAngle = DMDO_90; 
               
                if( NewAngle > DMDO_270)  
               
                        NewAngle = DMDO_0; 
                }
        }while(!(NewAngle & RotationAngles) && (NewAngle != DMDO_0));

        memset(&DevMode, 0, sizeof(DevMode)); 
        DevMode.dmSize               = sizeof(DevMode); 
        DevMode.dmFields             = DM_DISPLAYORIENTATION; 
        DevMode.dmDisplayOrientation = NewAngle;

        if ( DISP_CHANGE_SUCCESSFUL == ChangeDisplaySettingsEx(NULL, &DevMode, NULL, CDS_RESET, NULL) ) 
       
                //rotation success
                return 0;
       
        else 
       
                //rotation fail
                return -3;
       
    }

說明:
    以上兩種方法中第一種方法需重啓WinCE才能看到效果,而第二種方法在WinCE重啓後將還原成系統默認.

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