ok6410 wince6.0 进入OS后屏幕旋转方法 .

网上搜到两个方法。其一在OS里实现翻转,一劳永逸;其二在应用程序里实现翻转,掉电后消失。

---------------------------------------------------------------------------------------------------------------------------------------------------

在WinCE中做Screen Rotation,首先确认显示设备的驱动是否支持Screen Rotation功能。在显示设备支持的前提下,可以通过以下两种方法做Screen Rotation:

1. 通过修改注册表做Rotation

  默认情况下,屏幕都是正常显示的,也就是说翻转角度为0度。可以通过修改注册表来做屏幕翻转,通过修改”Angle”的值来完成,具体设置如下:

  [HKEY_LOCAL_MACHINE/System/GDI/Rotation]

  "Angle"=dword:5A     

  可以设置为0度,90度,180度和270度。也就是0,5A,B4和10E,通过设置这些值可以达到屏幕翻转的目的。你可以在Build image的时候就做这件事情,只要在project.reg文件里面加入上面的设置,然后重新make image,这样新的image启动以后就会按照你的设定来显示。也可以在WinCE启动以后,编个读写注册表的小程序,来修改这个值,然后重新启动就可以了(系统要支持HIVE-Based Registry)。

 

 

但修改platform.reg后没有达到预期效果。在启动信息的最末尾有这样几句话:

[DISPDRV] S3C6410Disp:Close FLprogressbar thread 
[DISPDRV] S3C6410Disp::S3C6410Disp()
-OALIntrRequestSysIntr(irq = 21, sysIntr = 39)
2D Sysintr : 39
[DISPDRV:] S3C6410Disp() : m_pDispConReg->VIDTCON2 = 879df
[OAL] LcdWidth(480)  LcdHeight(272)
ChangeDisplaySettingsEx changed rotation angle to 2

可以看出,旋转角度已经设置了。因此可以肯定是驱动中有什么地方抑制住了。在s3c6410_disp.cpp中找到打印 "ChangeDisplaySettingsEx changed rotation angle to %d/n"

这句话的地方,在一个#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;

//modified by lyxer

    m_iRotate =GetRotateModeFromReg();

    g_bTempFirstRotation = TRUE;

#else

    //m_iRotate = GetRotateModeFromReg();

#endif

    SetRotateParams();

 

修改后必须 sysgen才可以。

 

烧OS,OK。

 

2.    在应用程序里实现屏幕翻转

       首先测试硬件是否支持翻转:

 DEVMODE DevMode; 
 int CurrentAngle;

 memset (&DevMode, 0, sizeof (DevMode));
 DevMode.dmSize = sizeof (DevMode);
 DevMode.dmFields = DM_DISPLAYQUERYORIENTATION;
 
 if (DISP_CHANGE_SUCCESSFUL == ChangeDisplaySettingsEx(NULL, &DevMode, NULL, CDS_TEST, NULL))
 {
  MessageBox(_T("Support."));
  CurrentAngle = DevMode.dmDisplayOrientation;
 }
 else
 {
  MessageBox(_T("Not Support."));
 }

        若硬件支持翻转,则进行如下翻转:

 DEVMODE DevMode;

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

 if (DISP_CHANGE_SUCCESSFUL != ChangeDisplaySettingsEx(NULL, &DevMode, NULL, CDS_RESET, NULL))
 {
  MessageBox(_T("Rotation Error."));
 }
 else
 {
  MessageBox(_T("Rotation OK."));
 }
------------------------------------------------------------------------------

应用程序方法的代码为MSDN上的范例。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/13771794/viewspace-722869/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/13771794/viewspace-722869/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值