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

简介:

虽然前不久买了一个HP基于windows Mobile 5.0的PDA,由于工作太为繁忙,并没有为之开发相应的程序。没想到微软最近开展了酷炫应用争霸赛,征集“奥运”相关的作品,我忙里偷闲,用VS2005开发了一个关于奥运场馆的小程序,时值2008北京奥运前夕,也算是为奥运做了“贡献”:-)
虽然说是小程序,其实需要的知识不少,下面我简要介绍一下。

 

一、功能特色
该软件最大的特色就是,可以用手写笔或手指拨动相应的图片索引,拨动的速度越快,则图片翻转的越快,有点像快速翻书的感觉。记得苹果公司出的一款产品,在浏览图片(浏览通信录?记不清了)的时候,就是采用该方式。
其次,采用了XML文件保存必要的文字数据,这样在不改变代码的情况下,通过修改XML文件和添加必要的图片,就能增添奥运场馆数据了。目前共包括了13个场馆的详细资料和图片(费了我不少时间来加工和制作图片),还是值得一看的。
二、使用简介

 

使用很简单,如上图,用手写笔、手指或按键选择一个奥运场馆,单击或按回车按钮(Enter键)就进入到下一界面,不同的场馆内容有多有少,可以通过工具条按钮进行切换。
 
三、技术要点
1、图形双缓存技术
多个图片快速移动的时候,如果不采用图形双缓存技术,图片在移动时,会非常闪烁。
该实现还是沿用了我开发嵌入式组态的时方法:
第一:重载OnPaintBackground函数,不要让系统自动绘背景。
 

 
  1. //避免闪烁,不绘制背景  
  2.         protected override void OnPaintBackground(PaintEventArgs paintg)  
  3.         {  
  4.             //不绘制背景  
  5.     }  

  第二:创建位图场景
     

 
  1.  bitmap = new Bitmap(this.Width, this.Height);  
  2.    graphics = Graphics.FromImage((System.Drawing.Image)bitmap);  
  3.      //绘图  
  4.        private void frmMain_Paint(object sender, PaintEventArgs e)  
  5.        {  
  6.            //绘背景  
  7.          graphics.Clear(Color.White);  
  8. //实际绘图代码   
  9. ……             
  10.            //绘图  
  11.            e.Graphics.DrawImage(bitmap, 00);  
  12.       }  

2、获取毫秒值
在.net精简框架集下,是无法通过现成的命令获得毫秒值的,一般最小时刻单位为秒。这对我获取手写笔移动的快慢是远远不够的,一次手写笔快速从屏蔽划过,一般也就十几毫秒,用秒来衡量就区分不出快慢了。
要想获取毫秒值,必须用API函数,不过要有相应的硬件支持才行。幸好在模拟器和我的PPC上都支持。
[DllImport("\\windows\\coredll.dll", EntryPoint = "GetTickCount")]
    public static extern int GetTickCount();
这样当鼠标按下时记下当时的位置和时刻值,直到鼠标抬起时,算出位移值,然后在除以时间就是手写笔移动的速度了。
3、区分单击和移动
在PC机上是很容易区分单击和移动的,但是用手写笔则不然。我的思路是鼠标按下和抬起的位移值小于一定值,我就认为是单击,否则就是移动。
 

 
  1. //鼠标按下  
  2.         private void frmMain_MouseDown(object sender, MouseEventArgs e)  
  3.         {  
  4.             Rectangle rect = new Rectangle(05024072);  
  5.             if (rect.Contains(e.X, e.Y))  
  6.             {  
  7.                 MouseFlag = true;  
  8.                 fStartX = e.X;  
  9.                 fTime = GetTickCount();  
  10.             }  
  11.             rect = new Rectangle(75509072);  
  12.             if (rect.Contains(e.X, e.Y))  
  13.             {  
  14.                 MouseClickFlag = true;  
  15.                 bSelectDown = true;  
  16.                 this.Refresh();   
  17.             }  
  18.         }  
  19.    
  20.         //鼠标抬起  
  21.         private void frmMain_MouseUp(object sender, MouseEventArgs e)  
  22.         {  
  23.             if (MouseFlag)  
  24.             {  
  25.                 MouseFlag = false;  
  26.                 fWidth = e.X - fStartX;  
  27.                 bWay = (fWidth > 0);  
  28.                 fWidth = Math.Abs(fWidth);  
  29.    
  30.                 if (fWidth > intMoveSpace)  
  31.                 {  
  32.                     //计算鼠标移动的速度  
  33.                     fTime=GetTickCount() - fTime;  
  34.                     fMoveSpeed = fWidth / fTime;  
  35.                     if (fMoveSpeed < 0.5) fMoveSpeed = (float)0.6;  
  36.    
  37.                     //启动时钟函数,图片开始滚动                     
  38.                     tmrMove.Interval = (int)(20 /(fMoveSpeed-0.5));  
  39.                     tmrMove.Enabled = true;  
  40.                 }  
  41.                 else 
  42.                 {  
  43.                     //鼠标单击事件发生  
  44.                     if (MouseClickFlag)   
  45.                     {  
  46.                         MouseClickFlag = false;  
  47.                         bSelectDown = false;                   
  48.                         ShowInfoBar();  
  49.                     }  
  50.                 }  
  51.             }  
  52.         }  

4、动画移动
虽然主界面最多显示三个图像索引,其实移动起来至少要有四个图形同时在移动效果才好。在这里就用到了数学的知识(有兴趣的朋友可以看看这篇文章:http://news.csdn.net/n/20071106/110350.html),不过只需简单的数学知识,我想有个小学初中的水平就够了,就是简单计算一下图形移动时,图像坐标变化的规律。别说,在做这部分的时候,我还是花费了不少时间,并在草纸上画了几个图,才明白左移和右移坐标和图形变化的规律。
这部分的代码就不贴出了(请下载程序,自行看看源码)。
5、XML反序列化
原先我是把图片添加到ImageList组件里的,没有想到图片一多,不光VS2005 IDE在调试加载资源时报错(其实VS2005在加载资源的时候很不稳定,不知道VS2008是否进行了改善),程序运行到我PPC上的时候,十几兆的内存一下子就没有了。所以最后还是采用了XML序列化技术保存数据,同时图片也单独以文件方式存放,XML文件仅保存路径信息。(其实XML文件也可以保存图片数据,只是我觉得这样,XML文件会很大,反序列化时会很慢,影响用户的体验)。
解析一个复杂的XML文件是很麻烦的事,所以我一般都采用XML序列化技术。所以我构建了两个类来完成该功能。
值得说明的是,List<string>类在序列化和反序列化时会出问题(除非把string再封装到一个类里),所以我采用string数组保存数据,并适当的时候转换为List<string>模式。
 

 
  1. public class DataInfos  
  2.     {  
  3.         //主背景图片的路径  
  4.         public string strBackBmpPath = "";  
  5.         //主背景图片  
  6.         [XmlIgnore]  
  7.         public Image bmpBack = null;  
  8.         //场馆数据  
  9.         public List<DataInfo> Data = new List<DataInfo>();  
  10.         //反序列化  
  11.         public static DataInfos XMLDeserialize(string XmlFile)  
  12.         {  
  13.             try 
  14.             {  
  15.                 Type[] mtype = new Type[1];  
  16.                 mtype[0] = typeof(DataInfo);  
  17.                 DataInfos XmlData = new DataInfos();  
  18.                 Stream sf = new FileStream(XmlFile, FileMode.Open, FileAccess.Read, FileShare.None);  
  19.                 XmlSerializer xmls = new XmlSerializer(typeof(DataInfos), mtype);  
  20.                 XmlData = (DataInfos)xmls.Deserialize(sf);  
  21.                 sf.Close();  
  22.                 return XmlData;  
  23.             }  
  24.             catch (Exception e)  
  25.             {  
  26.                 MessageBox.Show("反序列化失败:" + XmlFile + "<" + e.Message + ">""叶帆软件");  
  27.                 return null;  
  28.             }  
  29.         }  
  30.     }  
  31.    
  32.     public class DataInfo  
  33.     {  
  34.         //场馆名称  
  35.         public string Text = "";  
  36.         //信息个数  
  37.         public int Count = 0;  
  38.         //信息索引  
  39.         [XmlIgnore]  
  40.         public int Index = 0;  
  41.         //图片说明  
  42.         public string[] mlstTitle = null;  
  43.         [XmlIgnore]  
  44.         public List<string> lstTitle  
  45.         {  
  46.             set { mlstTitle = value.ToArray(); }  
  47.             get  
  48.             {  
  49.                 List<string> mmlstTitle = new List<string>();  
  50.                 if (mlstTitle != null)  
  51.                 {  
  52.                     foreach (string str in mlstTitle)  
  53.                     {  
  54.                         mmlstTitle.Add(str);  
  55.                     }  
  56.                 }  
  57.                 return mmlstTitle;  
  58.             }  
  59.         }  
  60.    
  61.         //信息说明  
  62.         public string[] mlstInfo = null;  
  63.         [XmlIgnore]  
  64.         public List<string> lstInfo  
  65.         {  
  66.             set { mlstInfo = value.ToArray(); }  
  67.             get  
  68.             {  
  69.                 List<string> mmlstInfo = new List<string>();  
  70.                 if (mlstInfo != null)  
  71.                 {  
  72.                     foreach (string str in mlstInfo)  
  73.                     {  
  74.                         mmlstInfo.Add(str);  
  75.                     }  
  76.                 }  
  77.                 return mmlstInfo;  
  78.             }  
  79.         }  
  80.         //图片路径  
  81.         public string[] mlstImagePath = null;  
  82.         [XmlIgnore]  
  83.         public List<string> lstImagePath  
  84.         {  
  85.             set { mlstImagePath = value.ToArray(); }  
  86.             get  
  87.             {  
  88.                 List<string> mmlstImagePath = new List<string>();  
  89.                 if (mlstImagePath != null)  
  90.                 {  
  91.                     foreach (string str in mlstImagePath)  
  92.                     {  
  93.                         mmlstImagePath.Add(str);  
  94.                     }  
  95.                 }  
  96.                 return mmlstImagePath;  
  97.             }  
  98.         }  
  99.    
  100.         //图片  
  101.         [XmlIgnore]  
  102.         public List<Image> lstBmp = new List<Image>();  
  103.         //索引图片路径  
  104.         public string bmpPath = "";  
  105.         //索引图片  
  106.         [XmlIgnore]  
  107.         public Image bmp = null;        
  108.  }  

四、下载安装
该程序用VS2005开发,语言采用了C#,需要.net精简框架集2.0的支持(可以从下面的链接下载:http://www.microsoft.com/downloads/details.aspx?displaylang=zh-cn&FamilyID=aea55f2f-07b5-4a8c-8a44-b4e1b196d5c0)。
 
程序下载链接(包含程序全部的源代码):http://microsoft.csdn.net/mobile/dev_contest/demon-detail_1.aspx?pointid=47
下载后直接把安装包里的文件和文件夹直接拷贝到PPC模拟器或PDA中即可。

















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

相关文章
|
数据格式 XML Windows
Windows Mobile 5.0编程—奥运场馆速查
我忙里偷闲,用VS2005开发了一个关于奥运场馆的小程序,时值2008北京奥运前夕,也算是为奥运做了“贡献”
666 0
|
开发者 Windows
Windows Phone 7中用好Silverlight开发利器
  除了Windows Phone 7的UI可以用Silverlight框架来设计,还可以用Silverlight创建Windows Phone 7的应用程序。本文为一个国外.NET平台开发者为Windows Phone 7创建的Silverlight应用程序。
820 0
|
Web App开发 C# Android开发