在WinCE中实现Screen Rotation(屏幕旋转)
在WinCE中做Screen Rotation,首先確認顯示設備的驅動是否支持Screen Rotation功能。在顯示設備支持的前提下,可以通過以下兩種方法做Screen Rotation:
1.通過修改注冊表做Rotation
默認情況下,屏幕都是正常顯示的,也就是說翻轉角度為0度。可以通過修改注冊表來做屏幕翻轉,通過修改”Angle”的值來完成,具體設置如下:
[HKEY_LOCAL_MACHINESystemGDIRotation]
"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,如果設備支持Rotation,就可以進行Rotation操作,下面的程序將屏幕翻轉為270度,程序如下:
BOOL SetRotation() { DEVMODE devmode = {0}; devmode.dmSize = sizeof(DEVMODE); devmode.dmDisplayOrientation = DMDO_270; devmode.dmFields = DM_DISPLAYQUERYORIENTATION; if( DISP_CHANGE_SUCCESSFUL != ChangeDisplaySettingsEx(NULL,&devmode, NULL,CDS_TEST,NULL)) {AfxMessageBox( _T("Not Support!!!") ); return FALSE; }devmode.dmFields = DM_DISPLAYORIENTATION; if( DISP_CHANGE_SUCCESSFUL != ChangeDisplaySettingsEx(NULL,&devmode,NULL,CDS_TEST,NULL)) {AfxMessageBox( _T("Not Support!!!") ); return FALSE; }switch( ChangeDisplaySettingsEx(NULL,&devmode,NULL,CDS_RESET,NULL)) { case DISP_CHANGE_SUCCESSFUL: break; case DISP_CHANGE_BADFLAGS: AfxMessageBox(L"Bad flags!"); break; case DISP_CHANGE_BADMODE: AfxMessageBox(L"bad mode!"); break; case DISP_CHANGE_BADPARAM: AfxMessageBox(L"badparam!"); break; case DISP_CHANGE_NOTUPDATED: AfxMessageBox(L"notupdated!"); break; case DISP_CHANGE_RESTART: AfxMessageBox(L"restart!"); break; default:AfxMessageBox(L"default!"); break; } return TRUE; }上面兩種方法都可以實現Screen Rotation,第一種通過修改注冊表的方法不能立刻實現Rotation,要等設備reboot以后才會生效。第二種方法不需要重新啟動,函數調用成功后,屏幕就會被翻轉,但是下次啟動以后又會恢復默認值。
轉載于:https://www.cnblogs.com/mugua/archive/2009/03/16/1412871.html
總結
以上是生活随笔為你收集整理的在WinCE中实现Screen Rotation(屏幕旋转)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Javascript取select的选中
- 下一篇: 使用SDL打造游戏世界之入门篇 - 5