Windows Mobile 5.0横竖屏自识别技术

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

V1.0.0版介绍文章:

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

V1.0.0版源码下载:

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

 

Windows Mobile 5.0横竖屏自识别技术_第1张图片

Windows Mobile 5.0横竖屏自识别技术_第2张图片 

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

先介绍一下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设备上才能完美的体验用手指拨动查询的快感,在模拟器上用鼠标模拟太勉为其难了。

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

V1.1.0版源码下载地址:

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

 

你可能感兴趣的:(windows,object,mobile,UP)