`
isiqi
  • 浏览: 16538785 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

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

阅读更多

虽然前不久买了一个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 mobile5.0仿真器

    Windows Mobile 5.0 仿真器是一款用于开发者和测试人员的工具,它允许用户在桌面计算机上模拟运行 Windows Mobile 5.0 操作系统的设备。这个仿真器对于开发、调试和测试移动应用至关重要,因为它提供了在真实设备上...

    WindowsMobile5.0三十几个经典手机软件开发源码WindowsMobile5.0

    通过深入研究这些源码,开发者不仅可以掌握Windows Mobile 5.0的编程技巧,还能了解到软件设计的最佳实践。对于初学者,这是一个绝佳的起点,可以快速理解移动应用开发的基本流程;对于经验丰富的开发者,源码可以...

    Windows Mobile 5.0 SDK 下载地址收藏

    ### Windows Mobile 5.0 SDK 下载地址收藏 #### 知识点概述: 1. **Windows Mobile 5.0 SDK**:此版本的SDK(软件开发工具包)为开发者提供了必要的工具和文档来开发适用于Windows Mobile 5.0平台的应用程序。 2. ...

    Windows Mobile 5.0 三十几个经典手机软件开发源码

    2. **编程语言**:Windows Mobile 5.0 支持多种编程语言,包括C++、VB.NET和C#。C++通常用于编写底层性能要求高的程序,而VB.NET和C#则更适合构建用户界面和业务逻辑。 3. **API和库**:Windows Mobile SDK提供了...

    Windows Mobile 5.0项目实例教程

    《Windows Mobile 5.0项目实例教程》是针对移动设备开发者的宝贵资源,它深入浅出地介绍了在Windows Mobile 5.0平台上进行应用程序开发的技术和实践。Windows Mobile 5.0是微软针对掌上设备推出的一个操作系统版本,...

    Windows Mobile 5.0 开发文档最终版(1)

    Windows Mobile 5.0 Final Release Documentation Windows Mobile 5.0 开发文档最终版,--2007/2

    基于Windows Mobile 5.0的应用程序

    本文将深入探讨如何在Windows Mobile 5.0平台上开发GPS应用程序,特别是针对初学者,通过Visual C#这个高效的语言进行编程。 首先,理解Windows Mobile 5.0的基础是至关重要的。它是一个基于Windows CE内核的操作...

    windows mobile 5.0 模拟器V2版

    升级windows mobile 5.0

    windows mobile 5.0 手机 摄像头调用

    总之,Windows Mobile 5.0手机摄像头的调用涉及了多媒体处理框架DirectShow、设备驱动交互、图像编码和用户界面响应等多个方面,开发者需要具备扎实的编程基础和理解底层系统的能力,才能成功实现这样的功能。...

    Windows Mobile 5.0模拟文件

    Windows Mobile 5.0模拟器是开发者和爱好者用于测试和体验在Windows Mobile 5.0操作系统上运行的应用程序和功能的工具。这个压缩包包含了Windows Mobile 5.0的模拟环境,以.bin文件格式存储,这通常是二进制数据文件...

    windows mobile5.0 BSP

    Windows Mobile 5.0 BSP(板级支持包)是针对嵌入式设备操作系统的一个关键组件,主要用于让硬件制造商能够在其设备上顺利运行Windows Mobile操作系统。在这个特定的案例中,我们讨论的是针对SAMSUNG SMDK2440开发板...

    WindowsMobile5.0 6.0通用版

    车主宝典软件是为城市车主用户量身订做的一套基于手机平台运行的优秀手机客户端软件。 集实时路况、消费打折、资讯浏览、互动娱乐、便民查询、汽车知识为一体的服务于广大车主用户的综合性服务平台产品。...

    Windows Mobile 5.0用户界面实战

    《Windows Mobile 5.0用户界面实战》是针对微软在移动设备操作系统上的一款经典版本——Windows Mobile 5.0的用户界面设计与开发的实践教程。这个教程包含了丰富的学习资源,如PPT演示文稿、视频教程以及相关文档,...

    C#(Windows Mobile 5.0平台上的计算器)

    通过这个项目,开发者不仅可以学习到C#语言的基本语法和面向对象编程,还能深入了解Windows Mobile 5.0平台的特性,以及如何在有限的硬件资源下优化代码,提高应用的性能和用户体验。对于想涉足移动开发的C#程序员来...

    30个例子WindowsMobile5.0

    《Windows Mobile 5.0:30个实例详解》 Windows Mobile 5.0是微软为掌上设备推出的操作系统,广泛应用于智能手机和平板电脑,尤其是企业级应用。该操作系统基于Windows CE(Windows Embedded Compact,即Windows CE...

    WindowsMobile5.0指南针

    在移动设备领域,Windows Mobile 5.0 是微软推出的一款操作系统,主要针对智能手机和平板电脑。这个系统提供了丰富的功能和接口,使得开发者可以构建各种应用,其中之一就是指南针应用程序。"WindowsMobile5.0指南针...

    Windows Mobile 5.0 开发文档最终版(3)

    Windows Mobile 5.0 Final Release Documentation Windows Mobile 5.0 开发文档最终版,--2007/2

    Image Manipulation in Windows Mobile 5.0

    Windows Mobile 5.0虽然没有提供丰富的图像编辑库,但基础的裁剪、旋转和色彩调整可以通过编程实现。例如,可以使用Bitmap类的Clone()方法创建图像副本,然后在副本上进行操作以避免改变原始图像。对于裁剪,可以...

    Windows Mobile 5.0 Smartphone对时器

    自己c#写的手机时间更新软件,时间采用的是国家授时中心标准时间+时间补尝。流量更省(每次时间更新)。 操作方法:直接运行程序。首先获取时间,然后再更新时间。

Global site tag (gtag.js) - Google Analytics