惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Google DeepMind News
Google DeepMind News
Apple Machine Learning Research
Apple Machine Learning Research
博客园_首页
爱范儿
爱范儿
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
罗磊的独立博客
M
MIT News - Artificial intelligence
D
Docker
量子位
T
Tailwind CSS Blog
人人都是产品经理
人人都是产品经理
月光博客
月光博客
有赞技术团队
有赞技术团队
J
Java Code Geeks
A
About on SuperTechFans
P
Proofpoint News Feed
Jina AI
Jina AI
Y
Y Combinator Blog
T
The Blog of Author Tim Ferriss
The GitHub Blog
The GitHub Blog
Microsoft Security Blog
Microsoft Security Blog
V
V2EX
GbyAI
GbyAI
F
Fortinet All Blogs

博客园 - tony.zjb

中国市场 IIC GPN14 49美元Android PC驾到!威盛APC初探 C# 16进制与字符串、字节数组之间的转换 什么是RAW数据? s3c6410 SD卡启动的Secure mode Linux常用的 wince进入回收站== bsp是什么? vc技巧 _stdcall(WINAPI) 与 _cdecl的区别 用C函数来转换Unicode和ANSI文字 - tony.zjb - 博客园 Win32 字符编码 明辨接口实现和虚函数重载的区别 阅读代码 异步 remoting 全新的2008年。。。。。。 vfpConn
转载:在WinCE中实现Screen Rotation
tony.zjb · 2008-10-28 · via 博客园 - tony.zjb

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

1.       通过修改注册表做Rotation

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

[HKEY_LOCAL_MACHINE"System"GDI"Rotation]

    "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以后才会生效。第二种方法不需要重新启动,函数调用成功后,屏幕就会被翻转,但是下次启动以后又会恢复默认值。