zoukankan      html  css  js  c++  java
  • 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的开发。

  • 相关阅读:
    [bzoj2259][Oibh]新型计算机_Dijkstra
    [bzoj1660][Usaco2006 Nov]Bad Hair Day_单调栈
    [bzoj3943][Usaco2015 Feb]SuperBull_Kruskal
    [bzoj2131]免费的馅饼_树状数组
    [bzoj3932][CQOI2015]任务查询系统_主席树
    软件图标大全网站
    提示用户一直输入数字(默认为正整数),当用户输入end的时候显示当前输入数字中的最大值。
    打印多边形的菱形(for的嵌套)
    while循环问题(老师询问问题,学生回答。学生会了可以放学,或者老师讲了10遍,还是没有会的,被迫无奈也要放学。)
    while练习:输入一个班级的人数,然后依次输入学员成绩,计算班级学员的平均成绩和总成绩。
  • 原文地址:https://www.cnblogs.com/yefanqiu/p/1379846.html
Copyright © 2011-2022 走看看