SideShow Gadget开发[1]

简介: SideShow的Gadget分为两类,一类是本地Gadget,一类是常规Gadget。所谓的本地Gadget就是编译SideShow工程时,直接集成到该工程的组件。

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

sideshow 1

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

 

sideshow2

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

 

sideshow3

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

 sideshow4

 (操作界面)

 

 sideshow5

(程序菜单)

下边就说一下实现过程。

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

相关文章
|
4天前
|
搜索推荐 编译器 Linux
一个可用于企业开发及通用跨平台的Makefile文件
一款适用于企业级开发的通用跨平台Makefile,支持C/C++混合编译、多目标输出(可执行文件、静态/动态库)、Release/Debug版本管理。配置简洁,仅需修改带`MF_CONFIGURE_`前缀的变量,支持脚本化配置与子Makefile管理,具备完善日志、错误提示和跨平台兼容性,附详细文档与示例,便于学习与集成。
294 116
|
19天前
|
域名解析 人工智能
【实操攻略】手把手教学,免费领取.CN域名
即日起至2025年12月31日,购买万小智AI建站或云·企业官网,每单可免费领1个.CN域名首年!跟我了解领取攻略吧~
|
7天前
|
数据采集 人工智能 自然语言处理
Meta SAM3开源:让图像分割,听懂你的话
Meta发布并开源SAM 3,首个支持文本或视觉提示的统一图像视频分割模型,可精准分割“红色条纹伞”等开放词汇概念,覆盖400万独特概念,性能达人类水平75%–80%,推动视觉分割新突破。
452 44
Meta SAM3开源:让图像分割,听懂你的话
|
13天前
|
安全 Java Android开发
深度解析 Android 崩溃捕获原理及从崩溃到归因的闭环实践
崩溃堆栈全是 a.b.c?Native 错误查不到行号?本文详解 Android 崩溃采集全链路原理,教你如何把“天书”变“说明书”。RUM SDK 已支持一键接入。
684 222
|
1天前
|
Windows
dll错误修复 ,可指定下载dll,regsvr32等
dll错误修复 ,可指定下载dll,regsvr32等
133 95
|
11天前
|
人工智能 移动开发 自然语言处理
2025最新HTML静态网页制作工具推荐:10款免费在线生成器小白也能5分钟上手
晓猛团队精选2025年10款真正免费、无需编程的在线HTML建站工具,涵盖AI生成、拖拽编辑、设计稿转代码等多种类型,均支持浏览器直接使用、快速出图与文件导出,特别适合零基础用户快速搭建个人网站、落地页或企业官网。
1677 158
|
存储 人工智能 监控
从代码生成到自主决策:打造一个Coding驱动的“自我编程”Agent
本文介绍了一种基于LLM的“自我编程”Agent系统,通过代码驱动实现复杂逻辑。该Agent以Python为执行引擎,结合Py4j实现Java与Python交互,支持多工具调用、记忆分层与上下文工程,具备感知、认知、表达、自我评估等能力模块,目标是打造可进化的“1.5线”智能助手。
925 61