SideShow Gadget开发[1]

SideShowGadget分为两类,一类是本地Gadget,一类是常规Gadget。所谓的本地Gadget就是编译SideShow工程时,直接集成到该工程的组件。如下图所示,这些组件不像常规Gadget,它无需连接PC,就天生俱有。

SideShow Gadget开发[1]_第1张图片

不过这种Gadget普通用户可能无法编写(需要下载SideShow SDK,修改其中的OEM工程),一般由提供SideShow设备的厂家定制。而我们常说的Gadget就是在Vista控制面板中SideShow Gadget,如下图所示。

SideShow Gadget开发[1]_第2张图片

本章暂不介绍常规Gadget的开发方法,对此有兴趣的朋友可以先看看网上的同类文章《开始学习编写用于 Windows SideShow 设备的小工具》。

在说本地Gadget之前,先说一下SideShow的宿主平台,最早SideShow是运行在.Net Micro Framework平台之上的(可以说SideShowMF最值得称傲的典型应用),不过经过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 FrameworkC#应用程序。

我们知道在.Net Micro Framework仅且仅能运行一个应用程序,SideShow就是这么一个应用程序,所以留给本地Gadget的也只能是该应用程序的一个实现指定接口的DLL了(怎么有些拗口?!)。

我以前为MF编写的俄罗斯方块程序,由于主体程序都不需要改写,仅实现相关接口即可,所以我花了不到一个小时的时间,就把该程序移植到SideShow上了(如下图所示)。

SideShow Gadget开发[1]_第3张图片

(主菜单,选中时变大,并显示相关信息)

SideShow Gadget开发[1]_第4张图片

(操作界面)

SideShow Gadget开发[1]_第5张图片

(程序菜单)

下边就说一下实现过程。

首先程序类必须要实现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;

}

至于InstallUninstall接口可以根据需要添加相关代码即可,也可以为空函数。

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的开发。

你可能感兴趣的:(.net,windows,windows,cache,mobile,mobile)