一、
下面是一段屏幕旋转结果的注册表保存代码,保存成功了,但是下次开机屏幕还是默认不旋转的,怎样才能使下次开机能保存关机前设置的结果啊?请高手指点!
//注册表保存:未成功!void RegSaveRotate(DWORD value)
{
DWORD rvalue=0;
// set tmp value
switch(value)
{
// CE store the short type data low-high upside down
case DMDO_0:
rvalue=0;
break;
case DMDO_90:
rvalue=0x5A; // 5A
break;
case DMDO_180:
rvalue=0xB4; // B4
break;
case DMDO_270:
rvalue=0x010E; // 010E
break;
default:
rvalue=0;
break;
}
// set value
HKEY hKEY;
LPCTSTR data_Set=_T("System\\GDI\\ROTATION");
long ret0=::RegOpenKeyEx(HKEY_LOCAL_MACHINE,data_Set, 0, KEY_ALL_ACCESS, &hKEY);
if(ret0!=ERROR_SUCCESS)
{
DWORD dwDisposition;
::RegCreateKeyEx(HKEY_LOCAL_MACHINE,_T("System\\GDI\\ROTATION"),
0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS
, NULL, &hKEY, &dwDisposition) ;
}
BYTE lm=0;
long ret1=::RegSetValueEx(hKEY,_T("Angle"),0,REG_DWORD_LITTLE_ENDIAN,(LPBYTE)&rvalue,sizeof(rvalue));
ret1=::RegSetValueEx(hKEY,_T("LandscapeMode"),0,REG_BINARY,(LPBYTE)&lm,sizeof(lm));
long ret2=::RegCloseKey(hKEY);
}
二、
呵呵,找到资料了:
可以看出,旋转角度已经设置了。因此可以肯定是驱动中有什么地方抑制住了。在s3c6410_disp.cpp中找到#ifdef TEMP_FIX_ROTATION_BUG。搜索这个宏定义,看到在某处在这个宏定义下有m_iRotate = 0; 。这个变量被用作m_pPrimarySurface->SetRotation(m_nScreenWidth, m_nScreenHeight, m_iRotate); 而在这个宏定义下,通篇没有改变它的地方。于是在赋值为0的地方,改为
#ifdef TEMP_FIX_ROTATION_BUG
//m_iRotate = 0; //deleted
m_iRotate =GetRotateModeFromReg(); //added
g_bTempFirstRotation = TRUE;
#else
m_iRotate = GetRotateModeFromReg();
#endif
SetRotateParams();
修改后必须 clean sysgen之后重烧NK.bin,OK。
我的测试也是OK!屏幕旋转保存成功!!!
可惜还有个小问题:就是开机画面和开机进度条没有旋转!不过也凑合了!
三、立即呈现旋转
使用以下代码可以实现:
memset(&deviceMode, 0, sizeof(deviceMode));
deviceMode.dmSize = sizeof(deviceMode);
deviceMode.dmFields = DM_DISPLAYORIENTATION;
deviceMode.dmDisplayOrientation = DMDO_90; // DMDO_180,DMDO_270
ChangeDisplaySettingsEx(NULL, &deviceMode,NULL, CDS_RESET, NULL);