前不久我编写了一个基于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
由于我这个程序大部分是绘图操作,所以横竖屏切换的代码实现,基本等于是做两套不同的程序,这也是当初我为何懒得做的原因,废话少说,我下面谈一谈,针对该功能我是如何实现的(不知道此外有没有其它更好的办法,如果有的话,希望网友告诉我一声)。
先介绍一下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也是这样,不知道其它设备是不是这样),当然其他的键的含义也会发生变化,麻烦的是一般都把up和left方向当作起始,旋转之后,功能含义相反了,所以在代码中要做相应的处理。
//方向控制
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