且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

SideShow Gadget开发[1]

更新时间:2022-09-25 22:59:11

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

 

 

SideShow Gadget开发[1]

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

 

SideShow Gadget开发[1]

 


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

 

 

SideShow Gadget开发[1]


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

 

SideShow Gadget开发[1]


 (操作界面)

 

SideShow Gadget开发[1]

 


(程序菜单)

下边就说一下实现过程。

首先程序类必须要实现IDeviceApplication接口,只有实现类该接口,SideShow主程序才能正确加载该DLL。

   


  1. public interface IDeviceApplication  
  2.  
  3.     {  
  4.  
  5.         ApplicationForm GetForm();  
  6.  
  7.         GlanceData GetGlanceData();  
  8.  
  9.         void Install(IApplicationCache cache);  
  10.  
  11.         void SetShellAttributes(ShellAttributes attributes);  
  12.  
  13.         void Uninstall();  
  14.  
  15.  }  
  16.  

此外程序窗体必须派生于ApplicationForm类,该类负责为应用程序提供绘图场景,相对应的接口代码如下:


  1. public ApplicationForm GetForm()  
  2.  
  3.      {  
  4.  
  5.             if (form == null)  
  6.  
  7.             {  
  8.  
  9.                 form = new ElsForm();  
  10.  
  11.             }  
  12.  
  13.             return form;  
  14.  
  15.  }  
  16.  

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

1、  图标设置

细心的网友也许已经发现Gagget至少需要提供三套图标才能完成相关界面配置,主界面菜单需要两个图标(一大一小),大的48×48,选中时显示,小的32×32,未选中时显示,另一个16×16的图标,就是程序标题条上的图标。

这些图标不是ICON格式,就是普通BMP格式的图片。相关接口代码如下:

       


  1. public void SetShellAttributes(ShellAttributes attributes)  
  2.  
  3.         {  
  4.  
  5.             attributes.Name = "Tetris";   //标题  
  6.  
  7.             attributes.Icon16Data = Resources.GetBytes(Resources.BinaryResources.ICON_16);  
  8.  
  9.             attributes.Icon32Data = Resources.GetBytes(Resources.BinaryResources.ICON_32);  
  10.  
  11.             attributes.Icon48Data = Resources.GetBytes(Resources.BinaryResources.ICON_48);  
  12.  
  13.    }  
  14.  
  15. //主菜单上信息显示  
  16.  
  17. public GlanceData GetGlanceData()  
  18.  
  19.         {  
  20.  
  21.             GlanceData glance = new GlanceData();              
  22.  
  23.             glance.Primary = "YeFan's Tetris";  
  24.  
  25.             if (ElsGame.bGameRunFlag)  
  26.  
  27.             {  
  28.  
  29.                 glance.Secondary = new string[] {"[Run]"};  
  30.  
  31.             }  
  32.  
  33.             return glance;  
  34.  
  35.     }  
  36.  

2、  绘图区设置

程序窗体派生ApplicationForm类后,会自动为你的窗体添加标题条等等信息,不过你的窗体也可以全屏显示,这需要设置窗体的类型

     


  1. public enum Style  
  2.  
  3.      {  
  4.  
  5.          Default = 0,  
  6.  
  7.          TitleBar = 1,  
  8.  
  9.          FullScreen = 2,  
  10.  
  11.          SizeToContent = 4,  
  12.  
  13.          Frame = 8,  
  14.  
  15.          Centered = 16,  
  16.  
  17.          DimBackground = 32,  
  18.  
  19. }  
  20.  
  21. //图形绘制和MF普通程序一样  
  22.  
  23.      public override void OnRender(DrawingContext dc)  
  24.  
  25.      {  
  26.  
  27.              base.OnRender(dc);  
  28.  
  29.              els.Draw(dc);   
  30.  
  31. }  

3、  菜单实现


  1. //添加菜单项  
  2.  
  3.      public override ArrayList GetMenuItems()  
  4.  
  5.      {  
  6.  
  7.           ArrayList list = new ArrayList();  
  8.  
  9.           list.Add(new MenuItem("New game", 0));  
  10.  
  11.           list.Add(new MenuItem("Replay game", 1));  
  12.  
  13.           return list;  
  14.  
  15.  }  
  16.  
  17.  //菜单处理函数  
  18.  
  19.       public override void ExecuteMenuItem(MenuItem selected)  
  20.  
  21.       {  
  22.  
  23.                 switch (selected.Id)  
  24.  
  25.                 {  
  26.  
  27.                     case 0:  
  28.  
  29.                         ElsGame.bGameRunFlag = false;  
  30.  
  31.                         els.Init();  //初始化  
  32.  
  33.                         return;  
  34.  
  35.                     case 1:  
  36.  
  37.                         GameTimer.Start();  
  38.  
  39.                         return;  
  40.  
  41.                     case 2:  
  42.  
  43.                         this.GoBack();  
  44.  
  45.                         return;  
  46.  
  47.                 }  
  48.  
  49.   }  
  50.  

如果你以前有MF图形开发的经验,开发这个一定会觉得很简单。好了,本地Gadget先介绍到这,有时间再介绍一下常规Gadget的开发。

 

 





本文转自yefanqiu51CTO博客,原文链接:http://blog.51cto.com/yfsoft/323895,如需转载请自行联系原作者