且构网

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

SideShow Gadget开发[2]

更新时间:2022-10-04 16:49:31

上次在SideShow Gadget开发[1]中介绍了本地Gadget的开发,现在介绍一下常规Gadget的开发。

在介绍Gadget之前,我们先说一下我们认识上的一个误区,很多开发人员认为常规Gadget和本地Gadget类似,是一个.Net Micro Framework应用程序(至少是一个DLL),在连接时,由PC端把该DLL下载到Sideshow设备上去,Sideshow主程序加载并运行该程序。我一开始也是这样认为的,但是随着开发的深入,对Sideshow的运行机理也越来越了解,其实常规Gadget更像一个网页应用,普通的网页浏览基于http协议,而Gadget基于SCF(Simple Content Format,目前sideshow支持两种协议,另一种是ICAL,在Sideshow中不称为通信协议,专业术语是endpoint)协议,此时的Gadget更像一个网页,而Sideshow设备更像一个IE客户端。

从以上描述,你就会明白了,其实没有什么DLL,对于Sideshow设备来说仅有一些基于SCF格式的数据流而已。

所以开发常规Gadget理论上不拘于什么开发语言,只要能输出符合SCF格式的数据流即可。不过这里还是推荐使用C#(或基于.NET开发平台开发语言),可以直接引用相关开发库,非常简单的生成符合SCF格式的界面要素。

下面先“秀”一下我们已经开发好的图片浏览Gadget,然后再介绍一下是如何开发的。

1、      安装后,会在Sideshow控制面板上出现如下图标

 

SideShow Gadget开发[2]


2、可以设置PC上要共享的图片目录

 

SideShow Gadget开发[2]

 

3、在Sideshow设备上的显示

 

SideShow Gadget开发[2]

 

4、按左右键进行图片浏览

 

 

SideShow Gadget开发[2]

5、显示图片,也可以通过listbox进行选择

 

 

下面简单介绍一下相关代码:

 

1、  两个GUIO

一个是Gadget的GUID,Sideshow管理程序通过这个GUID加载相对应的Gadget。

一个是该Gadget对应的属性页的GUID(在代码中,属性页其实就是一个标识了GUID的控件,该控件派生于Microsoft.SideShow.GadgetPropertyPage),Sideshow管理程序加载并显示属性对话框。

注意:在注册时,一定保证VS2008或相关程序具有管理员权限,否则操作注册表会失败。

2、  注册代码


  1. GadgetRegistration.Register  
  2.  
  3.     (  
  4.  
  5.     false,                                       //true 对全部用户有效  false 对当前用户有效                   
  6.  
  7.     GadgetId,                                    //本gadget的ID    
  8.  
  9.     ScfSideShowGadget.ScfEndpointId,             //内容端点,需要使用SCF   
  10.  
  11.     "Picture Share",                             //SideShow控制面板中显示的名字  
  12.  
  13.     "\"" + Assembly.GetEntryAssembly().Location + "\"",      //程序所在的路径   
  14.  
  15.     String.Format("\"{0}\",{1}", Assembly.GetEntryAssembly().Location, -GadgetRegistration.DefaultIconResourceId),    //程序图标位置  
  16.  
  17.     false,                                       //True  连接时才显示内容,false 不用连接也能显示内容                      
  18.  
  19.     GadgetCachePolicies.KeepNewest,              //接收消息项的策略  KeepNewest保留最新 KeepOldest保留最老 KeepFrequentlyAccessed保留最频繁 KeepRecentlyAccessed保留最近以前没有收到的消息  
  20.  
  21.     new Guid("9B84055E-E253-4119-8719-F684ECB9FBC1")      //属性页ID  
  22.  
  23.    );  
  24.  

3、  事件设置


  1. YFGadget = new Microsoft.SideShow.SimpleContentFormat.ScfSideShowGadget(new Guid(GadgetEntry.Gadget_GUID));  
  2.  
  3. #region Listen to SideShow Events  
  4.  
  5. // Subscribe to events from the Windows SideShow platform.  
  6.  
  7. YFGadget.AllDevicesRemoved += new System.EventHandler(OnAllDevicesRemoved);  
  8.  
  9. YFGadget.ContentMissing += new System.EventHandler<Microsoft.SideShow.ContentMissingEventArgs>(OnContentMissing);  
  10.  
  11. YFGadget.ContentNavigate += new System.EventHandler<Microsoft.SideShow.SimpleContentFormat.ContentNavigateEventArgs>(OnContentNavigate);  
  12.  
  13. YFGadget.ContextMenuSelect += new System.EventHandler<Microsoft.SideShow.SimpleContentFormat.ContextMenuSelectEventArgs>(OnContextMenuSelect);  
  14.  
  15. YFGadget.DeviceAdded += new System.EventHandler<Microsoft.SideShow.DeviceCapabilityEventArgs>(OnDeviceAdded);  
  16.  
  17. YFGadget.DeviceRemoved += new System.EventHandler<Microsoft.SideShow.DeviceCapabilityEventArgs>(OnDeviceRemoved);  
  18.  
  19. YFGadget.GadgetEnter += new System.EventHandler(OnGadgetEnter);  
  20.  
  21. YFGadget.GadgetExit += new System.EventHandler(OnGadgetExit);  
  22.  
  23. YFGadget.MenuSelect += new System.EventHandler<Microsoft.SideShow.SimpleContentFormat.MenuSelectEventArgs>(OnMenuSelect);  
  24.  
  25. #endregion  
  26.  

         4、传送图片、菜单等


  1. //枚举当前路径下的所有图片  
  2.  
  3. string[] strPath = Directory.GetFiles(SharePath);  
  4.  
  5. List<string> strImgPath = new List<string>();  
  6.  
  7.    
  8.  
  9. foreach (string path in strPath)  
  10.  
  11. {  
  12.  
  13.     if (path.Length > 3)  
  14.  
  15.     {  
  16.  
  17.         switch (path.Substring(path.Length - 3).ToLower())  
  18.  
  19.         {  
  20.  
  21.             case "jpg":  
  22.  
  23.             case "bmp":  
  24.  
  25.             case "gif":  
  26.  
  27.                 strImgPath.Add(path);  
  28.  
  29.                 break;  
  30.  
  31.         }  
  32.  
  33.     }  
  34.  
  35. }  
  36.  
  37.    
  38.  
  39. List<ScfElement> item = new List<ScfElement>();  
  40.  
  41.    
  42.  
  43. for (int i = 0; i < strImgPath.Count; i++)  
  44.  
  45. {  
  46.  
  47.     FileInfo fi = new FileInfo(strImgPath[i]);  
  48.  
  49.     Bitmap bmp = new Bitmap(fi.FullName);  
  50.  
  51.     PageNo = i + 1;  
  52.  
  53.     PicNo = 10000 + i + 1;  
  54.  
  55.    
  56.  
  57.     bmp = new Bitmap(bmp, 240, (int)(240 * ((float)bmp.Height / bmp.Width)));  
  58.  
  59.     YFGadget.AddContent(PicNo, ImageContentTransforms.ReduceColorDepth, bmp);  // | ImageContentTransforms.KeepAspectRatio| ImageContentTransforms.KeepAspectRatio       
  60.  
  61.    
  62.  
  63.     ScfElement content = Scf.Content(  
  64.  
  65.         PageNo,  
  66.  
  67.         fi.Name,  
  68.  
  69.         200,  
  70.  
  71.         Scf.Img(PicNo, ScfAlign.Center, ScfImageFit.Native, fi.Name),  
  72.  
  73.         Scf.Txt(ScfAlign.Center, false, Color.Black, """<<   " + PageNo.ToString() + "/" + strImgPath.Count.ToString() + "   >>"),  
  74.  
  75.         Scf.Btn(DeviceButton.Left, "", PageNo - 1 == 0 ? strImgPath.Count : PageNo - 1),  
  76.  
  77.         Scf.Btn(DeviceButton.Right, "", PageNo + 1 > strImgPath.Count ? 1 : PageNo + 1),  
  78.  
  79.         Scf.Btn(DeviceButton.Back, "", 100)  
  80.  
  81.         );  
  82.  
  83.    
  84.  
  85.     item.Add(Scf.Item(PageNo, fi.Name));  
  86.  
  87.     YFGadget.AddContent(content);  
  88.  
  89.     bmp.Dispose();  
  90.  
  91. }  
  92.  
  93.    
  94.  
  95. YFGadget.AddContent(Scf.Menu(  
  96.  
  97.    100,  
  98.  
  99.    "Main Menu",  
  100.  
  101.     ScfSelectAction.Target,  
  102.  
  103.     item.ToArray()  
  104.  
  105.   ));  
  106.  
  107.    
  108.  
  109. YFGadget.AddContent(Scf.Menu(  
  110.  
  111.     200,  
  112.  
  113.     "Right Menu",  
  114.  
  115.      ScfSelectAction.Target,  
  116.  
  117.      Scf.Item(100, "主菜单")  
  118.  
  119.    ));  
  120.  
  121.    
  122.  

由于SDK提供了相关SCF操作函数,所以我们就没有必要写原始的XML格式的文件了。

 

OK,由于网上已有一些详细介绍Gadget编写的文章,所以我这里也就不啰嗦了。如有必要,可以给我留言,我们可以进一步交流Gadget编写技巧。

 







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