SideShow Gadget开发[1]

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

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

本章暂不介绍常规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上了(如下图所示)。

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

(操作界面)

(程序菜单)

下边就说一下实现过程。

首先程序类必须要实现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的开发。

posted on 2009-01-22 13:14  刘洪峰IoT  阅读(1814)  评论(1编辑  收藏  举报