WinCE6.0实现屏幕旋转(Screen Rotation)

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


(注:第一种方法在我的Mini2440开发板上重启生效;第二种方法经修改程序后,测试成功!代码见下文。)

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,如果设备支持Rotation,就可以进行Rotation操作,下面的程序将屏幕翻转为270度,程序如下:

BOOL SetRotation(DWORD dwDegrees) 
{ 
	DEVMODE devmode; 

	memset(&devmode, 0, sizeof(devmode));  // 初始化整个结构体
	devmode.dmSize = sizeof(devmode);      // 设置结构体大小,必须要做的
	devmode.dmFields = DM_DISPLAYQUERYORIENTATION;   // 查询是否支持Rotation

	// 调用函数,查看是否支持Rotation
	if( DISP_CHANGE_SUCCESSFUL != ChangeDisplaySettingsEx(NULL,&devmode, NULL,CDS_TEST,NULL)) 
	{
		AfxMessageBox( _T("Not Support!!!") ); 
		return FALSE;    // 不支持屏幕旋转,退出
	}

	memset(&devmode, 0, sizeof(devmode));  // 重新初始化结构体
	devmode.dmSize = sizeof(devmode); 
	devmode.dmFields = DM_DISPLAYORIENTATION; // 实现屏幕旋转
	devmode.dmDisplayOrientation = dwDegrees;

	// 实现屏幕旋转
	switch( ChangeDisplaySettingsEx(NULL,&devmode,NULL,0,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; 

} 


 

 此代码在原博文的基础上做了修改,经Mini2440开发板测试成功!原博文中的代码能调用成功,但是没有效果,而且CDS_TEST做了两次!

原文地址:http://www.cnblogs.com/mugua/archive/2009/03/16/1412871.html

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值