Chinaunix首页 | 论坛 | 博客
  • 博客访问: 370133
  • 博文数量: 132
  • 博客积分: 3066
  • 博客等级: 中校
  • 技术积分: 781
  • 用 户 组: 普通用户
  • 注册时间: 2009-04-14 16:19
文章分类

全部博文(132)

文章存档

2012年(1)

2010年(50)

2009年(81)

我的朋友

分类: C/C++

2009-06-23 18:30:08

在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,程序如下:

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((L”Support.”));
       CurrentAngle = DevMode.dmDisplayOrientation;
    }
    else
    {
       MessageBox((L"Not Support."));
    }

  如果设备支持Rotation,就可以进行Rotation操作,下面的程序将屏幕翻转为90度,程序如下:

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((L"Rotation Error."));
    }
else
{
       MessageBox((L”Rotation OK.”));
    }

  上面两种方法都可以实现Screen Rotation,第一种通过修改注册表的方法不能立刻实现Rotation,要等设备reboot以后才会生效。第二种方法不需要重新启动,函数调用成功后,屏幕就会被翻转,但是下次启动以后又会恢复默认值。

阅读(506) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~