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

 

本文出自 “叶帆工作室” 博客,转载请与作者联系!

你可能感兴趣的:(windows,技术,mobile,休闲,横竖)