虽然前不久买了一个HP基于windows Mobile 5.0的PDA,由于工作太为繁忙,并没有为之开发相应的程序。没想到微软最近开展了酷炫应用争霸赛,征集“奥运”相关的作品,我忙里偷闲,用VS2005开发了一个关于奥运场馆的小程序,时值2008北京奥运前夕,也算是为奥运做了“贡献”:-)
虽然说是小程序,其实需要的知识不少,下面我简要介绍一下。
一、功能特色
该软件最大的特色就是,可以用手写笔或手指拨动相应的图片索引,拨动的速度越快,则图片翻转的越快,有点像快速翻书的感觉。记得苹果公司出的一款产品,在浏览图片(浏览通信录?记不清了)的时候,就是采用该方式。
其次,采用了XML文件保存必要的文字数据,这样在不改变代码的情况下,通过修改XML文件和添加必要的图片,就能增添奥运场馆数据了。目前共包括了13个场馆的详细资料和图片(费了我不少时间来加工和制作图片),还是值得一看的。
二、使用简介
使用很简单,如上图,用手写笔、手指或按键选择一个奥运场馆,单击或按回车按钮(Enter键)就进入到下一界面,不同的场馆内容有多有少,可以通过工具条按钮进行切换。
三、技术要点
1、图形双缓存技术
多个图片快速移动的时候,如果不采用图形双缓存技术,图片在移动时,会非常闪烁。
该实现还是沿用了我开发嵌入式组态的时方法:
第一:重载OnPaintBackground函数,不要让系统自动绘背景。
// 避免闪烁,不绘制背景
protected override void OnPaintBackground(PaintEventArgs paintg)
{
// 不绘制背景
}
第二:创建位图场景
bitmap = new Bitmap(this.Width, this.Height);
graphics = Graphics.FromImage((System.Drawing.Image)bitmap);
// 绘图
private void frmMain_Paint(object sender, PaintEventArgs e)
{
// 绘背景
graphics.Clear(Color.White);
// 实际绘图代码
… …
// 绘图
e.Graphics.DrawImage(bitmap, 0, 0);
}
2、获取毫秒值
在.net精简框架集下,是无法通过现成的命令获得毫秒值的,一般最小时刻单位为秒。这对我获取手写笔移动的快慢是远远不够的,一次手写笔快速从屏蔽划过,一般也就十几毫秒,用秒来衡量就区分不出快慢了。
要想获取毫秒值,必须用API函数,不过要有相应的硬件支持才行。幸好在模拟器和我的PPC上都支持。
[DllImport("//windows//coredll.dll", EntryPoint = "GetTickCount")]
public static extern int GetTickCount();
这样当鼠标按下时记下当时的位置和时刻值,直到鼠标抬起时,算出位移值,然后在除以时间就是手写笔移动的速度了。
3、区分单击和移动
在PC机上是很容易区分单击和移动的,但是用手写笔则不然。我的思路是鼠标按下和抬起的位移值小于一定值,我就认为是单击,否则就是移动。
// 鼠标按下
private void frmMain_MouseDown(object sender, MouseEventArgs e)
{
Rectangle rect = new Rectangle(0, 50, 240, 72);
if (rect.Contains(e.X, e.Y))
{
MouseFlag = true;
fStartX = e.X;
fTime = GetTickCount();
}
rect = new Rectangle(75, 50, 90, 72);
if (rect.Contains(e.X, e.Y))
{
MouseClickFlag = true;
bSelectDown = true;
this.Refresh();
}
}
// 鼠标抬起
private void frmMain_MouseUp(object sender, MouseEventArgs e)
{
if (MouseFlag)
{
MouseFlag = false;
fWidth = e.X - fStartX;
bWay = (fWidth > 0);
fWidth = Math.Abs(fWidth);
if (fWidth > intMoveSpace)
{
// 计算鼠标移动的速度
fTime=GetTickCount() - fTime;
fMoveSpeed = fWidth / fTime;
if (fMoveSpeed < 0.5) fMoveSpeed = (float)0.6;
// 启动时钟函数,图片开始滚动                  
tmrMove.Interval = (int)(20 /(fMoveSpeed-0.5));
tmrMove.Enabled = true;
}
else
{
// 鼠标单击事件发生
if (MouseClickFlag)
{
MouseClickFlag = false;
bSelectDown = false;                
ShowInfoBar();
}
}
}
}
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>模式。
public class DataInfos
{
// 主背景图片的路径
public string strBackBmpPath = "";
// 主背景图片
[XmlIgnore]
public Image bmpBack = null;
// 场馆数据
public List<DataInfo> Data = new List<DataInfo>();
// 反序列化
public static DataInfos XMLDeserialize(string XmlFile)
{
try
{
Type[] mtype = new Type[1];
mtype[0] = typeof(DataInfo);
DataInfos XmlData = new DataInfos();
Stream sf = new FileStream(XmlFile, FileMode.Open, FileAccess.Read, FileShare.None);
XmlSerializer xmls = new XmlSerializer(typeof(DataInfos), mtype);
XmlData = (DataInfos)xmls.Deserialize(sf);
sf.Close();
return XmlData;
}
catch (Exception e)
{
MessageBox.Show(" 反序列化失败:" + XmlFile + "<" + e.Message + ">", " 叶帆软件" );
return null;
}
}
}
public class DataInfo
{
// 场馆名称
public string Text = "";
// 信息个数
public int Count = 0;
// 信息索引
[XmlIgnore]
public int Index = 0;
// 图片说明
public string[] mlstTitle = null;
[XmlIgnore]
public List<string> lstTitle
{
set { mlstTitle = value.ToArray(); }
get
{
List<string> mmlstTitle = new List<string>();
if (mlstTitle != null)
{
foreach (string str in mlstTitle)
{
mmlstTitle.Add(str);
}
}
return mmlstTitle;
}
}
// 信息说明
public string[] mlstInfo = null;
[XmlIgnore]
public List<string> lstInfo
{
set { mlstInfo = value.ToArray(); }
get
{
List<string> mmlstInfo = new List<string>();
if (mlstInfo != null)
{
foreach (string str in mlstInfo)
{
mmlstInfo.Add(str);
}
}
return mmlstInfo;
}
}
// 图片路径
public string[] mlstImagePath = null;
[XmlIgnore]
public List<string> lstImagePath
{
set { mlstImagePath = value.ToArray(); }
get
{
List<string> mmlstImagePath = new List<string>();
if (mlstImagePath != null)
{
foreach (string str in mlstImagePath)
{
mmlstImagePath.Add(str);
}
}
return mmlstImagePath;
}
}
// 图片
[XmlIgnore]
public List<Image> lstBmp = new List<Image>();
// 索引图片路径
public string bmpPath = "";
// 索引图片
[XmlIgnore]
public Image bmp = null;     
}
四、下载安装
该程序用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中即可。

Windows Mobile 5 0编程—奥运场馆速查相关推荐

  1. Windows Mobile 5.0 认知篇

    (本文只作为本人学习用途) 1.什么是微软Windows Mobile 5.0? 最新的Windows Mobile 5.0不叫Windows Mobile 5.0 2005,而是Windows Mo ...

  2. Windows Mobile 5.0 的探讨

    1.什么是微软Windows Mobile 5.0? 最新的Windows Mobile 5.0不叫Windows Mobile 5.0 2005,而是Windows Mobile 5.0.此次微软推 ...

  3. Windows Mobile 5.0 中为开发人员提供的新功能(3)

    Windows Mobile 5.0 中为开发人员提供的新功能(3) Pocket Outlook 增强功能 Pocket Outlook 向用户和应用程序开发人员提供了易于使用的 PIM.将 Poc ...

  4. Windows Mobile 5.0新增API介绍(转自MSDN)

    Windows Mobile 5.0 提供很多新的 API.尽管这些新的 API 分布在许多不同的服务中,但它们都是为提高开发人员工作效率这一共同目标服务的.通过将很多经常执行的任务合并到操作系统中, ...

  5. Windows Mobile 7.0最新消息!!

    (本文系葛涵涛原创,转载请表明出处) Engadget 主编 Peter 和 Ryan 受邀请前往位在西雅图Mobius.微软举办的 Windows Mobile 和行动通讯产品研讨会(我们可是自费前 ...

  6. Windows Mobile 6.0 SDK和中文模拟器下载

    [转] Windows Mobile 6.0 SDK和中文模拟器下载 Windows Mobile 6.5 模拟器 2010年12月06日 星期一 07:48 转载自 zhangyanle86 终于编 ...

  7. windows mobile 5.0 PocketPC模拟器上网的设置 【正确】

    找了很多方法终于找到了 在确保主机已连上互联网的情况下,按以下步骤设置: 1.打开ActiveSync ,点击"文件"-->"连接设置",在"允 ...

  8. 在Visual Studio 2005里,用ActiveSync来同步模拟器(Windows Mobile 5.0 )

    一.前期环境搭建     1.Windows Mobile5.0模拟器安装步骤以及下载地址,如下: http://news.csdn.net/news/newstopic/22/22102.shtml ...

  9. Windows Mobile 5.0

    自上星期以来,开始系统化的学习Windows Mobile 5.0,希望通过系统化的学习,能够掌握移动开发. Mobile 5.0开发配置: 软件安装顺序: 1. 安装Microsoft Active ...

最新文章

  1. 技巧:利用 Python 实现多任务进程
  2. 13JavaScript中的简单数据类型与复杂数据类型
  3. vue data数据修改_史上最强vue总结,万字长文
  4. 贝壳找房挖到AI大牛叶杰平,房产中介转型需要技术,高估值更需要
  5. Windows 中进程的相关操作
  6. Java泛型的不变性和作用域
  7. python大数据分析基础教程_基于Python的大数据分析基础及实战
  8. Run service in specified proxyPort via jettyrun
  9. Android开发之判断任意View上拉的方法
  10. 高速缓冲存储器的功能、结构与工作原理
  11. Divbrush 网页Div css画板定位布局系统 v1.8
  12. fastadmin 后台view data-source关联报500错误问题
  13. html css拖拽设计,css绘制三角形 和 HTML拖拽事件
  14. AE Pixel Sorter 2 for Mac破解教程
  15. Vue全家桶 之 KTV前台收银管理系统 (不想努力啦,回家收钱去)
  16. 华为digix算法大赛2020机器学习赛道-搜索相关性初赛A/B榜rank1
  17. Raspberry Pi
  18. LOL自制皮肤0-介绍我自己
  19. 【python与数据分析】CH3 python序列结构补充——字符串
  20. Excel怎样设置标题行,Excel工作表中标题行的处理

热门文章

  1. 硕迪增强董事会实力,任命Daniel G. Welch为董事长
  2. 机器阅读理解系列文章-BiDAF(Bi-Directional Attention Flow for Machine Comprehension)
  3. springboot2整合drools规则引擎(kie-spring+drools-core)
  4. 在Kubernetes上搭建新版fluentd-elasticsearch_1.22日志收集工具
  5. C语言库函数所在目录,C语言库函数函数名 带目录+索引.doc
  6. AutoCAD2007安装的一些问题(Result=1638)
  7. 【python】小游戏华容道-如何把一个三角调到自己想要的顺序
  8. dtype(‘O‘)是什么意思?
  9. 与幸福相关的时间管理
  10. bfs写法 nightmare