SideShow的Gadget分为两类,一类是本地Gadget,一类是常规Gadget。所谓的本地Gadget就是编译SideShow工程时,直接集成到该工程的组件。如下图所示,这些组件不像常规Gadget,它无需连接PC,就天生俱有。
不过这种Gadget普通用户可能无法编写(需要下载SideShow SDK,修改其中的OEM工程),一般由提供SideShow设备的厂家定制。而我们常说的Gadget就是在Vista控制面板中SideShow Gadget,如下图所示。
本章暂不介绍常规Gadget的开发方法,对此有兴趣的朋友可以先看看网上的同类文章《开始学习编写用于 Windows SideShow 设备的小工具》。
在说本地Gadget之前,先说一下SideShow的宿主平台,最早SideShow是运行在.Net Micro Framework平台之上的(可以说SideShow是MF最值得称傲的典型应用),不过经过SideShow开发团队的努力,目前SideShow已经移植到Windows Mobile平台上来了,相关文章请参见:《Windows SideShow for Windows Mobile尝鲜》。
我所说的本地Gadget就是基于.Net Micro Framework平台之上的Gadget。其实本地Gadget和常规Gadget有本质区别,常规Gadget有些类似网页,SideShow设备从PC机下载基于简单内容格式 (SCF)协议的数据,然后在设备上呈现相关画面(类似HTTP),并且可以和PC上的Gadget Server进行交互。而本地Gadget其实说白了就是一段实现规定接口的.Net Micro Framework的C#应用程序。
我们知道在.Net Micro Framework仅且仅能运行一个应用程序,SideShow就是这么一个应用程序,所以留给本地Gadget的也只能是该应用程序的一个实现指定接口的DLL了(怎么有些拗口?!)。
我以前为MF编写的俄罗斯方块程序,由于主体程序都不需要改写,仅实现相关接口即可,所以我花了不到一个小时的时间,就把该程序移植到SideShow上了(如下图所示)。
(主菜单,选中时变大,并显示相关信息)
(操作界面)
(程序菜单)
下边就说一下实现过程。
首先程序类必须要实现IDeviceApplication接口,只有实现类该接口,SideShow主程序才能正确加载该DLL。
- public interface IDeviceApplication
- {
- ApplicationForm GetForm();
- GlanceData GetGlanceData();
- void Install(IApplicationCache cache);
- void SetShellAttributes(ShellAttributes attributes);
- void Uninstall();
- }
此外程序窗体必须派生于ApplicationForm类,该类负责为应用程序提供绘图场景,相对应的接口代码如下:
- public ApplicationForm GetForm()
- {
- if (form == null)
- {
- form = new ElsForm();
- }
- return form;
- }
至于Install和Uninstall接口可以根据需要添加相关代码即可,也可以为空函数。
1、 图标设置
细心的网友也许已经发现Gagget至少需要提供三套图标才能完成相关界面配置,主界面菜单需要两个图标(一大一小),大的48×48,选中时显示,小的32×32,未选中时显示,另一个16×16的图标,就是程序标题条上的图标。
这些图标不是ICON格式,就是普通BMP格式的图片。相关接口代码如下:
- public void SetShellAttributes(ShellAttributes attributes)
- {
- attributes.Name = "Tetris"; //标题
- attributes.Icon16Data = Resources.GetBytes(Resources.BinaryResources.ICON_16);
- attributes.Icon32Data = Resources.GetBytes(Resources.BinaryResources.ICON_32);
- attributes.Icon48Data = Resources.GetBytes(Resources.BinaryResources.ICON_48);
- }
- //主菜单上信息显示
- public GlanceData GetGlanceData()
- {
- GlanceData glance = new GlanceData();
- glance.Primary = "YeFan's Tetris";
- if (ElsGame.bGameRunFlag)
- {
- glance.Secondary = new string[] {"[Run]"};
- }
- return glance;
- }
2、 绘图区设置
程序窗体派生ApplicationForm类后,会自动为你的窗体添加标题条等等信息,不过你的窗体也可以全屏显示,这需要设置窗体的类型
- public enum Style
- {
- Default = 0,
- TitleBar = 1,
- FullScreen = 2,
- SizeToContent = 4,
- Frame = 8,
- Centered = 16,
- DimBackground = 32,
- }
- //图形绘制和MF普通程序一样
- public override void OnRender(DrawingContext dc)
- {
- base.OnRender(dc);
- els.Draw(dc);
- }
3、 菜单实现
- //添加菜单项
- public override ArrayList GetMenuItems()
- {
- ArrayList list = new ArrayList();
- list.Add(new MenuItem("New game", 0));
- list.Add(new MenuItem("Replay game", 1));
- return list;
- }
- //菜单处理函数
- public override void ExecuteMenuItem(MenuItem selected)
- {
- switch (selected.Id)
- {
- case 0:
- ElsGame.bGameRunFlag = false;
- els.Init(); //初始化
- return;
- case 1:
- GameTimer.Start();
- return;
- case 2:
- this.GoBack();
- return;
- }
- }
如果你以前有MF图形开发的经验,开发这个一定会觉得很简单。好了,本地Gadget先介绍到这,有时间再介绍一下常规Gadget的开发。
本文出自 “叶帆工作室” 博客,转载请与作者联系!