Windows Mobile 5.0横竖屏自识别技术

news/2024/7/5 18:20:48

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

V 1.0.0 版介绍文章:

http://blog.csdn.net/yefanqiu/archive/2007/11/13/1882835.aspx

V 1.0.0 版源码下载:

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

 

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

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

下面是具体的代码:

//屏的类型

        public enum ScreenType { QVGA240320, QVGA320240, VGA480640, VGA640480,Other};

       

        //获取屏的类型

        public static ScreenType GetScreenType()

        {

            ScreenType SType = ScreenType.Other;

            if (Screen.PrimaryScreen.Bounds.Width == 240 && Screen.PrimaryScreen.Bounds.Height == 320)

            {

                SType = ScreenType.QVGA240320;

            }

            if (Screen.PrimaryScreen.Bounds.Width == 320 && Screen.PrimaryScreen.Bounds.Height == 240)

            {

                SType = ScreenType.QVGA320240;

            }

            if (Screen.PrimaryScreen.Bounds.Width == 480 && Screen.PrimaryScreen.Bounds.Height == 640)

            {

                SType = ScreenType.VGA480640;

            }

            if (Screen.PrimaryScreen.Bounds.Width == 640 && Screen.PrimaryScreen.Bounds.Height == 480)

            {

                SType = ScreenType.VGA640480;

            }

            return SType;

  }

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

  //屏幕翻转

        private void frmMain_Resize(object sender, EventArgs e)

        {

            if (scrType != DataInfos.GetScreenType())

            {

                scrType = DataInfos.GetScreenType();

                //相关需要改变的代码

            }           

     }

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

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

//方向控制

        private void frmMain_KeyDown(object sender, KeyEventArgs e)

        {

            if ((e.KeyCode == System.Windows.Forms.Keys.Up))

            {

                // 向上导航

                // 向上键  

// 该判断在真实的PPC设备中就不需要了

                if (scrType == DataInfos.ScreenType.QVGA240320)  MoveLeft();

                else MoveRight();

            }

            if ((e.KeyCode == System.Windows.Forms.Keys.Down))

            {

                // 向下导航

                // 向下键

// 该判断在真实的PPC设备中就不需要了

                if (scrType == DataInfos.ScreenType.QVGA240320)  MoveRight();

                else MoveLeft();

            }

            if ((e.KeyCode == System.Windows.Forms.Keys.Left))

            {

                // 向左键

                MoveLeft();

            }

            if ((e.KeyCode == System.Windows.Forms.Keys.Right))

            {

                // 向右键

                MoveRight();

            }

            if ((e.KeyCode == System.Windows.Forms.Keys.Enter))

            {

                bSelectDown = true;

                this.Refresh();

            }

   }

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

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

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

V 1.1.0 版源码下载地址:

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

 



http://www.niftyadmin.cn/n/3655861.html

相关文章

算法笔记---- 递归和栈

递归 程序调用自身的编程技巧就称之为递归(recursion),就是再运行的过程中调用自己,本质上就是循环. 每个递归函数都有两个部分: 基线条件 和 递归条件, 递归条件 : 函数调用自己 基线条件&#xff1…

C# API方式串口读写

在调试ICU通信设备的时候,由于串口通信老出现故障,所以就怀疑CF实现的SerialPort类是否有问题,所以最后决定用纯API函数实现串口读写。先从网上搜索相关代码(关键字:C# API 串口),发现网上相关的…

Windows Mobile 5.0编程—奥运场馆速查

虽然前不久买了一个HP基于windows Mobile 5.0的PDA,由于工作太为繁忙,并没有为之开发相应的程序。没想到微软最近开展了酷炫应用争霸赛,征集“奥运”相关的作品,我忙里偷闲,用VS2005开发了一个关于奥运场馆的小程序,时…

算法笔记 ----- 快速排序

理解部分 D&C 策略! D&C算法是递归的。使用D&C解决问题的过程是分为两个步骤: 1 、找到基线条件,这种条件必须尽可能的简单 2、不断的将问题分解(或者说是缩规模), 直到符合基线条件。 D&C并非是解决问题的算法,…

.Net Micro Framework研究—窗体控件

试验平台:.Net Micro Framework 模拟器在Microsoft.SPOT.Presentation.Controls命名空间里,也就如下几个控件(姑且称为控件吧),Panel、StackPanel、Text、TextFlow、Image、ListBox、ScrollViewer 其中仅有Panel、Text…

.Net Micro Framework研究—绘图

试验平台:.Net Micro Framework 模拟器目前在VS2005的环境里,还不支持.Net Micro Framework界面的所见即所得绘制,界面制作有三种方式,一是窗体直接绘图,二是Panel形状对象、三是窗体控件。第一种做法让人觉得又回到了…

算法学习笔记----散列表

1.散列函数 散列函数:无论你给它什么数据,它都还你一个数字。 散列函数 将输入映射到数字。你可能认为散列函数输出的数字没什么规律,但其实散列函数必须满足一些要求。 1、它必须是一致的。例如,假如你输入apple时得到的是4&…

JavaScript -------- 数组1

一、创建数组 通过 [] 操作符声明一个数组变量: var numbers [ ] 得到一个长度为0的空数组。 可以通过内建的length属性 console.log(numbers.length) // 0 在声明数组变量时,直接在 [ ] 操作符中放入一组元素; var numbers [1,…