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

推荐订阅源

Simon Willison's Weblog
Simon Willison's Weblog
P
Privacy International News Feed
www.infosecurity-magazine.com
www.infosecurity-magazine.com
T
Troy Hunt's Blog
Hacker News - Newest:
Hacker News - Newest: "LLM"
Attack and Defense Labs
Attack and Defense Labs
S
Secure Thoughts
V2EX - 技术
V2EX - 技术
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
O
OpenAI News
Cloudbric
Cloudbric
Google Online Security Blog
Google Online Security Blog
Schneier on Security
Schneier on Security
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Help Net Security
Help Net Security
Cyberwarzone
Cyberwarzone
G
GRAHAM CLULEY
L
Lohrmann on Cybersecurity
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Spread Privacy
Spread Privacy
NISL@THU
NISL@THU
N
News and Events Feed by Topic
T
Tenable Blog
S
Security @ Cisco Blogs
N
News and Events Feed by Topic
The Hacker News
The Hacker News
C
CXSECURITY Database RSS Feed - CXSecurity.com
宝玉的分享
宝玉的分享
月光博客
月光博客
酷 壳 – CoolShell
酷 壳 – CoolShell
美团技术团队
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Google DeepMind News
Google DeepMind News
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
T
Tailwind CSS Blog
V
Visual Studio Blog
P
Proofpoint News Feed
Webroot Blog
Webroot Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
博客园 - 三生石上(FineUI控件)
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Jina AI
Jina AI
雷峰网
雷峰网
T
The Blog of Author Tim Ferriss
Hugging Face - Blog
Hugging Face - Blog
腾讯CDC
L
LangChain Blog
The Register - Security
The Register - Security
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园 - 聂微东

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