SideShow Gadget开发[1]
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的开发。