Windows Mobile 5.0横竖屏自识别技术

简介:

前不久我编写了一个基于Windows Mobile 5.0的参赛程序《北京2008奥运场馆速查》,可惜当时那个程序并不支持横竖屏自动识别,后来看了参赛的规则,原来这一个功能是必须实现的,所以今天抽出时间又把这方面的内容给添加了进去。

 

V1.0.0版源码下载:

http://microsoft.csdn.net/mobile/dev_contest/demon-detail_1.aspx?pointid=47

 

 

 


 

 

由于我这个程序大部分是绘图操作,所以横竖屏切换的代码实现,基本等于是做两套不同的程序,这也是当初我为何懒得做的原因,废话少说,我下面谈一谈,针对该功能我是如何实现的(不知道此外有没有其它更好的办法,如果有的话,希望网友告诉我一声)。


先介绍一下Screen对象,顾名思义,该对象就包含了显示屏相关的信息,其中的Screen.PrimaryScreen.Bounds属性特别有用,该属性就是描述显示屏的大小的。

下面是具体的代码:


 
 
  1. //屏的类型  
  2.  
  3.         public enum ScreenType { QVGA240320, QVGA320240, VGA480640, VGA640480,Other};  
  4.  
  5.           
  6.  
  7.         //获取屏的类型  
  8.  
  9.         public static ScreenType GetScreenType()  
  10.  
  11.         {  
  12.  
  13.             ScreenType SType = ScreenType.Other;  
  14.  
  15.             if (Screen.PrimaryScreen.Bounds.Width == 240 && Screen.PrimaryScreen.Bounds.Height == 320)  
  16.  
  17.             {  
  18.  
  19.                 SType = ScreenType.QVGA240320;  
  20.  
  21.             }  
  22.  
  23.             if (Screen.PrimaryScreen.Bounds.Width == 320 && Screen.PrimaryScreen.Bounds.Height == 240)  
  24.  
  25.             {  
  26.  
  27.                 SType = ScreenType.QVGA320240;  
  28.  
  29.             }  
  30.  
  31.             if (Screen.PrimaryScreen.Bounds.Width == 480 && Screen.PrimaryScreen.Bounds.Height == 640)  
  32.  
  33.             {  
  34.  
  35.                 SType = ScreenType.VGA480640;  
  36.  
  37.             }  
  38.  
  39.             if (Screen.PrimaryScreen.Bounds.Width == 640 && Screen.PrimaryScreen.Bounds.Height == 480)  
  40.  
  41.             {  
  42.  
  43.                 SType = ScreenType.VGA640480;  
  44.  
  45.             }  
  46.  
  47.             return SType;  
  48.  
  49.   }  
  50.  

接着说一下在程序中如何自适应横竖屏的识别,首先要添加窗体的Resize事件,该事件会在窗体大小发生变化的时候自动触发(由于我程序中的窗体都默认为最大化,所以横竖屏切换的时候它一定会触发,针对普通的窗体是否也这样?这得要实际测一测了,为了保险期间,可以在窗体的Paint事件中检查横竖屏是否切换)。

 


 
 
  1. //屏幕翻转  
  2.  
  3.        private void frmMain_Resize(object sender, EventArgs e)  
  4.  
  5.        {  
  6.  
  7.            if (scrType != DataInfos.GetScreenType())  
  8.  
  9.            {  
  10.  
  11.                scrType = DataInfos.GetScreenType();  
  12.  
  13.                //相关需要改变的代码  
  14.  
  15.            }              
  16.  
  17.     }  

剩下的就是在Paint事件中根据不同的屏类型,配置不同的布局,在鼠标处理事件中也要分别处理,这部分代码是比较繁杂的,有兴趣的朋友可以下载源码后自行去看。

此外需要注意的是,在模拟器中横竖屏切换的时候,原来的UP键会变成Right键(模拟器横屏是竖屏顺时针旋转90度而成的,我的PPC也是这样,不知道其它设备是不是这样),当然其他的键的含义也会发生变化,麻烦的是一般都把up和left方向当作起始,旋转之后,功能含义相反了,所以在代码中要做相应的处理。


 
 
  1. //方向控制  
  2.  
  3.         private void frmMain_KeyDown(object sender, KeyEventArgs e)  
  4.  
  5.         {  
  6.  
  7.             if ((e.KeyCode == System.Windows.Forms.Keys.Up))  
  8.  
  9.             {  
  10.  
  11.                 // 向上导航  
  12.  
  13.                 // 向上键     
  14.  
  15. // 该判断在真实的PPC设备中就不需要了  
  16.  
  17.                 if (scrType == DataInfos.ScreenType.QVGA240320)  MoveLeft();  
  18.  
  19.                 else MoveRight();  
  20.  
  21.             }  
  22.  
  23.             if ((e.KeyCode == System.Windows.Forms.Keys.Down))  
  24.  
  25.             {  
  26.  
  27.                 // 向下导航  
  28.  
  29.                 // 向下键   
  30.  
  31. // 该判断在真实的PPC设备中就不需要了  
  32.  
  33.                 if (scrType == DataInfos.ScreenType.QVGA240320)  MoveRight();  
  34.  
  35.                 else MoveLeft();  
  36.  
  37.             }  
  38.  
  39.             if ((e.KeyCode == System.Windows.Forms.Keys.Left))  
  40.  
  41.             {  
  42.  
  43.                 // 向左键  
  44.  
  45.                 MoveLeft();  
  46.  
  47.             }  
  48.  
  49.             if ((e.KeyCode == System.Windows.Forms.Keys.Right))  
  50.  
  51.             {  
  52.  
  53.                 // 向右键  
  54.  
  55.                 MoveRight();  
  56.  
  57.             }  
  58.  
  59.             if ((e.KeyCode == System.Windows.Forms.Keys.Enter))  
  60.  
  61.             {  
  62.  
  63.                 bSelectDown = true;  
  64.  
  65.                 this.Refresh();   
  66.  
  67.             }  
  68.  
  69.    }  
  70.  

要紧的是,横屏时按模拟器上的键,功能如你所愿,但是作为PC机上的按键的方向并没有旋转,所以你按键盘的键来代替模拟器上的键的时候,你所想的和实际正好相反。

还好,最终的程序是运行在实际的PPC设备上去的,这个问题就不存在了,PPC屏幕旋转后按键的定义自动调整,上就是上,左就是左(真够人性化的!我想模拟器不能这样,想必是模拟器的一个bug了)。此外也只有在PPC设备上才能完美的体验用手指拨动查询的快感,在模拟器上用鼠标模拟太勉为其难了。

升级后的程序,我同样也是以源码的方式发布,希望这个程序能起到抛砖引玉的作用,在此基础上网友能推出自己更棒的程序。

V1.1.0版源码下载地址:

http://microsoft.csdn.net/mobile/dev_contest/demon-detail_1.aspx?pointid=95







本文转自yefanqiu51CTO博客,原文链接:http://blog.51cto.com/yfsoft/323809,如需转载请自行联系原作者

相关文章
|
9月前
|
TensorFlow 算法框架/工具 异构计算
Windows部署TensorFlow后识别GPU失败,原因是啥?
Windows部署TensorFlow后识别GPU失败,原因是啥?
|
人工智能 缓存 Shell
[笔记]Windows核心编程《二十》DLL的高级操作技术(二)
[笔记]Windows核心编程《二十》DLL的高级操作技术(二)
358 0
|
6月前
|
vr&ar C# 图形学
WPF与AR/VR的激情碰撞:解锁Windows Presentation Foundation应用新维度,探索增强现实与虚拟现实技术在现代UI设计中的无限可能与实战应用详解
【8月更文挑战第31天】增强现实(AR)与虚拟现实(VR)技术正迅速改变生活和工作方式,在游戏、教育及工业等领域展现出广泛应用前景。本文探讨如何在Windows Presentation Foundation(WPF)环境中实现AR/VR功能,通过具体示例代码展示整合过程。尽管WPF本身不直接支持AR/VR,但借助第三方库如Unity、Vuforia或OpenVR,可实现沉浸式体验。例如,通过Unity和Vuforia在WPF中创建AR应用,或利用OpenVR在WPF中集成VR功能,从而提升用户体验并拓展应用功能边界。
142 1
|
6月前
|
C# Windows 开发者
当WPF遇见OpenGL:一场关于如何在Windows Presentation Foundation中融入高性能跨平台图形处理技术的精彩碰撞——详解集成步骤与实战代码示例
【8月更文挑战第31天】本文详细介绍了如何在Windows Presentation Foundation (WPF) 中集成OpenGL,以实现高性能的跨平台图形处理。通过具体示例代码,展示了使用SharpGL库在WPF应用中创建并渲染OpenGL图形的过程,包括开发环境搭建、OpenGL渲染窗口创建及控件集成等关键步骤,帮助开发者更好地理解和应用OpenGL技术。
509 0
|
6月前
|
iOS开发 Android开发 MacOS
从零到全能开发者:解锁Uno Platform,一键跨越多平台应用开发的神奇之旅,让你的代码飞遍Windows、iOS、Android、macOS及Web,技术小白也能秒变跨平台大神!
【8月更文挑战第31天】从零开始,踏上使用Uno Platform开发跨平台应用的旅程。只需编写一次代码,即可轻松部署到Windows、iOS、macOS、Android及Web(通过WASM)等多个平台。Uno Platform为.NET生态带来前所未有的灵活性和效率,简化跨平台开发。首先确保安装了Visual Studio或VS Code及.NET SDK,然后选择合适的项目模板创建新项目。项目结构类似传统.NET MAUI或WPF项目,包含核心NuGet包。通过简单的按钮示例,你可以快速上手并构建应用。Uno Platform让你的技术探索之旅充满无限可能。
170 0
|
6月前
|
Kubernetes Cloud Native 开发者
探索云原生技术:Kubernetes入门与实践探索Windows操作系统的隐藏功能
【8月更文挑战第31天】在数字化转型的浪潮中,云原生技术成为企业提升敏捷性、效率和可靠性的关键。本文将带你了解云原生的核心组件之一——Kubernetes(K8s),通过浅显易懂的语言和实际代码示例,引导你步入这一强大工具的世界。无论你是初学者还是有经验的开发者,本篇都将为你打开一扇通向高效资源管理与自动化部署的大门。
|
6月前
|
开发框架 JavaScript .NET
【Azure 应用服务】Azure Mobile App (NodeJS) 的服务端部署在App Service for Windows中出现404 Not Found
【Azure 应用服务】Azure Mobile App (NodeJS) 的服务端部署在App Service for Windows中出现404 Not Found
|
8月前
|
存储 IDE 开发工具
【读书笔记】 玩转虚拟机基于Vmware+Windows 虚拟化技术
【读书笔记】 玩转虚拟机基于Vmware+Windows 虚拟化技术
105 2
|
8月前
|
机器学习/深度学习 前端开发 Linux
技术心得:分析Windows的死亡蓝屏(BSOD)机制
技术心得:分析Windows的死亡蓝屏(BSOD)机制
|
9月前
|
前端开发 Linux iOS开发
【Flutter前端技术开发专栏】Flutter在桌面应用(Windows/macOS/Linux)的开发实践
【4月更文挑战第30天】Flutter扩展至桌面应用开发,允许开发者用同一代码库构建Windows、macOS和Linux应用,提高效率并保持平台一致性。创建桌面应用需指定目标平台,如`flutter create -t windows my_desktop_app`。开发中注意UI适配、性能优化、系统交互及测试部署。UI适配利用布局组件和`MediaQuery`,性能优化借助`PerformanceLogging`、`Isolate`和`compute`。
522 0
【Flutter前端技术开发专栏】Flutter在桌面应用(Windows/macOS/Linux)的开发实践