在WinCE中实现Screen Rotation(屏幕旋转)
在WinCE中做Screen Rotation,首先確認(rèn)顯示設(shè)備的驅(qū)動是否支持Screen Rotation功能。在顯示設(shè)備支持的前提下,可以通過以下兩種方法做Screen Rotation:
1.通過修改注冊表做Rotation
默認(rèn)情況下,屏幕都是正常顯示的,也就是說翻轉(zhuǎn)角度為0度。可以通過修改注冊表來做屏幕翻轉(zhuǎn),通過修改”Angle”的值來完成,具體設(shè)置如下:
[HKEY_LOCAL_MACHINESystemGDIRotation]
"Angle"=dword:5A ;翻轉(zhuǎn)90度,羅嗦一句,5A就是90的十六進(jìn)制
可以設(shè)置為0度,90度,180度和270度。也就是0,5A,B4和10E,通過設(shè)置這些值可以達(dá)到屏幕翻轉(zhuǎn)的目的。你可以在Build image的時候就做這件事情,只要在project.reg文件里面加入上面的設(shè)置,然后重新make image,這樣新的image啟動以后就會按照你的設(shè)定來顯示。也可以在WinCE啟動以后,編個讀寫注冊表的小程序,來修改這個值,然后重新啟動就可以了(系統(tǒng)要支持HIVE-Based Registry)。
? ? 2.通過ChangeDisplaySettingEx(..)做Rotation
應(yīng)該說,該函數(shù)用來改變顯示設(shè)置,具體可參見MSDN。我再來簡單說一下:
函數(shù)如下:
LONG ChangeDisplaySettingsEx(
LPCTSTR lpszDeviceName,
LPDEVMODE lpDevMode,
HWND hwnd,
DWORD dwflags,
LPVOID lParam
);
lpszDeviceName:沒有被使用,設(shè)置為NULL。
lpDevMode: 指向一個DEVMODE結(jié)構(gòu)指針。
hwnd: 預(yù)留。必須設(shè)置為NULL。
dwflags:???????? ? 0:目前Screen的圖形模式可以動態(tài)改變
???????????????????????? CDS_RESET:即使請求的設(shè)置和當(dāng)前設(shè)置一樣,也去改變。
???????????????????????? CDS_TEST:請求的圖形模式被設(shè)置,則系統(tǒng)進(jìn)行測試。
???????????????????????? CDS_VIDEOPARAMETERS:被設(shè)置,則lParam傳入一個指向VIDEOPARAMETERS結(jié)構(gòu)的指針。
lParam:??????????? 如果dwflags設(shè)置為CDS_VIDEOPARAMETERS,則傳入一個指向VIDEOPARAMETERS結(jié)構(gòu)的指針;否則設(shè)置為NULL。
關(guān)于DEVMODE結(jié)構(gòu),還是挺復(fù)雜的,一般在CE里面不會都用,這里只介紹幾個我用到的:
dwSize: 描述DEVMODE結(jié)構(gòu)的大小,設(shè)置為sizeof(DEVMODE)。
dmFields: 初始化標(biāo)記位。在作Rotation的時候,會用到的是DM_DISPLAYQUERYORIENTATION和DM_DISPLAYORIENTATION。前一個用來查詢目前的顯示驅(qū)動是否支持Rotation,后一用來實(shí)現(xiàn)屏幕翻轉(zhuǎn)。
dmDisplayOrientation:設(shè)置翻轉(zhuǎn)的角度。具體如下:
???????????????? 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下,調(diào)用該函數(shù)作Rotation的時候,我們會首先判斷目前的設(shè)備是否支持Rotation,如果設(shè)備支持Rotation,就可以進(jìn)行Rotation操作,下面的程序?qū)⑵聊环D(zhuǎn)為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; }上面兩種方法都可以實(shí)現(xiàn)Screen Rotation,第一種通過修改注冊表的方法不能立刻實(shí)現(xiàn)Rotation,要等設(shè)備reboot以后才會生效。第二種方法不需要重新啟動,函數(shù)調(diào)用成功后,屏幕就會被翻轉(zhuǎn),但是下次啟動以后又會恢復(fù)默認(rèn)值。
轉(zhuǎn)載于:https://www.cnblogs.com/mugua/archive/2009/03/16/1412871.html
總結(jié)
以上是生活随笔為你收集整理的在WinCE中实现Screen Rotation(屏幕旋转)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Javascript取select的选中
- 下一篇: 使用SDL打造游戏世界之入门篇 - 5