主题 : TINY6410 开发板,屏幕旋转后如何保存设置,以便下次开机有效。 复制链接 | 浏览器收藏 | 打印
级别: 侠客
UID: 47238
精华: 1
发帖: 43
金钱: 265 两
威望: 53 点
贡献值: 1 点
综合积分: 106 分
注册时间: 2011-05-20
最后登录: 2011-08-15
楼主  发表于: 2011-06-23 11:41

 TINY6410 开发板,屏幕旋转后如何保存设置,以便下次开机有效。

管理提醒: 本帖被 xoom 执行加亮操作(2011-06-28)
下面是一段屏幕旋转结果的注册表保存代码,保存成功了,但是下次开机屏幕还是默认不旋转的,怎样才能使下次开机能保存关机前设置的结果啊?请高手指点!
//注册表保存:未成功!
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);
}
级别: 侠客
UID: 47238
精华: 1
发帖: 43
金钱: 265 两
威望: 53 点
贡献值: 1 点
综合积分: 106 分
注册时间: 2011-05-20
最后登录: 2011-08-15
1楼  发表于: 2011-06-23 11:46
其实注册表保存成功了,比如上次设置成旋转90度,设置保存OK,但是开机还是没有旋转,查注册表确实是我设置的结果,也就是说代码实现没有问题,只是不是我要的结果,应该问如何修改注册表来旋转屏幕!
级别: 侠客
UID: 47238
精华: 1
发帖: 43
金钱: 265 两
威望: 53 点
贡献值: 1 点
综合积分: 106 分
注册时间: 2011-05-20
最后登录: 2011-08-15
2楼  发表于: 2011-06-23 12:26
呵呵,找到资料了:
可以看出,旋转角度已经设置了。因此可以肯定是驱动中有什么地方抑制住了。在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!屏幕旋转保存成功!!!

可惜还有个小问题:就是开机画面和开机进度条没有旋转!不过也凑合了!
级别: 侠客
UID: 47238
精华: 1
发帖: 43
金钱: 265 两
威望: 53 点
贡献值: 1 点
综合积分: 106 分
注册时间: 2011-05-20
最后登录: 2011-08-15
3楼  发表于: 2011-06-23 12:28
呵呵,变成自问自答了,
级别: 新手上路
UID: 38141
精华: 0
发帖: 25
金钱: 125 两
威望: 25 点
贡献值: 0 点
综合积分: 50 分
注册时间: 2011-02-22
最后登录: 2013-06-20
4楼  发表于: 2011-06-23 14:46
顶一下lz....我现在也在弄这个..
请教一下lz,在没有修改s3c6410_disp.cpp之前,如何实现的旋转屏幕?
我是直接修改了s3c6410_disp.cpp之后,通过改注册表,重启之后才能旋转屏幕。
级别: 侠客
UID: 47238
精华: 1
发帖: 43
金钱: 265 两
威望: 53 点
贡献值: 1 点
综合积分: 106 分
注册时间: 2011-05-20
最后登录: 2011-08-15
5楼  发表于: 2011-06-23 14:59
使用以下代码可以实现:
    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);
级别: 侠客
UID: 36941
精华: 0
发帖: 102
金钱: 510 两
威望: 102 点
贡献值: 0 点
综合积分: 204 分
注册时间: 2011-01-24
最后登录: 2018-02-08
6楼  发表于: 2011-06-28 09:35
旋转屏幕 ???
级别: 侠客
UID: 43860
精华: 0
发帖: 131
金钱: 675 两
威望: 135 点
贡献值: 0 点
综合积分: 262 分
注册时间: 2011-04-20
最后登录: 2012-07-09
7楼  发表于: 2011-07-12 10:53
引用楼主angangch于2011-06-23 11:41发表的 TINY6410 开发板,屏幕旋转后如何保存设置,以便下次开机有效。 :
下面是一段屏幕旋转结果的注册表保存代码,保存成功了,但是下次开机屏幕还是默认不旋转的,怎样才能使下次开机能保存关机前设置的结果啊?请高手指点!
//注册表保存:未成功!
void RegSaveRotate(DWORD value)
{
    DWORD rvalue=0;
.......

请问下,这段在哪里改?本人新手,谢谢
级别: 侠客
UID: 20445
精华: 0
发帖: 77
金钱: 385 两
威望: 77 点
贡献值: 0 点
综合积分: 154 分
注册时间: 2010-05-02
最后登录: 2023-04-10
8楼  发表于: 2011-12-02 22:56
MARK