上次在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控制面板上出现如下图标
2、可以设置PC上要共享的图片目录
3、在Sideshow设备上的显示
4、按左右键进行图片浏览
5、显示图片,也可以通过listbox进行选择
下面简单介绍一下相关代码:
1、 两个GUIO
一个是Gadget的GUID,Sideshow管理程序通过这个GUID加载相对应的Gadget。
一个是该Gadget对应的属性页的GUID(在代码中,属性页其实就是一个标识了GUID的控件,该控件派生于Microsoft.SideShow.GadgetPropertyPage),Sideshow管理程序加载并显示属性对话框。
注意:在注册时,一定保证VS2008或相关程序具有管理员权限,否则操作注册表会失败。
2、 注册代码
- GadgetRegistration.Register
-
- (
-
- false,
-
- GadgetId,
-
- ScfSideShowGadget.ScfEndpointId,
-
- "Picture Share",
-
- "\"" + Assembly.GetEntryAssembly().Location + "\"",
-
- String.Format("\"{0}\",{1}", Assembly.GetEntryAssembly().Location, -GadgetRegistration.DefaultIconResourceId),
-
- false,
-
- GadgetCachePolicies.KeepNewest,
-
- new Guid("9B84055E-E253-4119-8719-F684ECB9FBC1")
-
- );
-
3、 事件设置
- YFGadget = new Microsoft.SideShow.SimpleContentFormat.ScfSideShowGadget(new Guid(GadgetEntry.Gadget_GUID));
-
- #region Listen to SideShow Events
-
-
-
- YFGadget.AllDevicesRemoved += new System.EventHandler(OnAllDevicesRemoved);
-
- YFGadget.ContentMissing += new System.EventHandler<Microsoft.SideShow.ContentMissingEventArgs>(OnContentMissing);
-
- YFGadget.ContentNavigate += new System.EventHandler<Microsoft.SideShow.SimpleContentFormat.ContentNavigateEventArgs>(OnContentNavigate);
-
- YFGadget.ContextMenuSelect += new System.EventHandler<Microsoft.SideShow.SimpleContentFormat.ContextMenuSelectEventArgs>(OnContextMenuSelect);
-
- YFGadget.DeviceAdded += new System.EventHandler<Microsoft.SideShow.DeviceCapabilityEventArgs>(OnDeviceAdded);
-
- YFGadget.DeviceRemoved += new System.EventHandler<Microsoft.SideShow.DeviceCapabilityEventArgs>(OnDeviceRemoved);
-
- YFGadget.GadgetEnter += new System.EventHandler(OnGadgetEnter);
-
- YFGadget.GadgetExit += new System.EventHandler(OnGadgetExit);
-
- YFGadget.MenuSelect += new System.EventHandler<Microsoft.SideShow.SimpleContentFormat.MenuSelectEventArgs>(OnMenuSelect);
-
- #endregion
-
4、传送图片、菜单等
-
-
- string[] strPath = Directory.GetFiles(SharePath);
-
- List<string> strImgPath = new List<string>();
-
-
-
- foreach (string path in strPath)
-
- {
-
- if (path.Length > 3)
-
- {
-
- switch (path.Substring(path.Length - 3).ToLower())
-
- {
-
- case "jpg":
-
- case "bmp":
-
- case "gif":
-
- strImgPath.Add(path);
-
- break;
-
- }
-
- }
-
- }
-
-
-
- List<ScfElement> item = new List<ScfElement>();
-
-
-
- for (int i = 0; i < strImgPath.Count; i++)
-
- {
-
- FileInfo fi = new FileInfo(strImgPath[i]);
-
- Bitmap bmp = new Bitmap(fi.FullName);
-
- PageNo = i + 1;
-
- PicNo = 10000 + i + 1;
-
-
-
- bmp = new Bitmap(bmp, 240, (int)(240 * ((float)bmp.Height / bmp.Width)));
-
- YFGadget.AddContent(PicNo, ImageContentTransforms.ReduceColorDepth, bmp);
-
-
-
- ScfElement content = Scf.Content(
-
- PageNo,
-
- fi.Name,
-
- 200,
-
- Scf.Img(PicNo, ScfAlign.Center, ScfImageFit.Native, fi.Name),
-
- Scf.Txt(ScfAlign.Center, false, Color.Black, "", "<< " + PageNo.ToString() + "/" + strImgPath.Count.ToString() + " >>"),
-
- Scf.Btn(DeviceButton.Left, "", PageNo - 1 == 0 ? strImgPath.Count : PageNo - 1),
-
- Scf.Btn(DeviceButton.Right, "", PageNo + 1 > strImgPath.Count ? 1 : PageNo + 1),
-
- Scf.Btn(DeviceButton.Back, "", 100)
-
- );
-
-
-
- item.Add(Scf.Item(PageNo, fi.Name));
-
- YFGadget.AddContent(content);
-
- bmp.Dispose();
-
- }
-
-
-
- YFGadget.AddContent(Scf.Menu(
-
- 100,
-
- "Main Menu",
-
- ScfSelectAction.Target,
-
- item.ToArray()
-
- ));
-
-
-
- YFGadget.AddContent(Scf.Menu(
-
- 200,
-
- "Right Menu",
-
- ScfSelectAction.Target,
-
- Scf.Item(100, "主菜单")
-
- ));
-
-
-
由于SDK提供了相关SCF操作函数,所以我们就没有必要写原始的XML格式的文件了。
OK,由于网上已有一些详细介绍Gadget编写的文章,所以我这里也就不啰嗦了。如有必要,可以给我留言,我们可以进一步交流Gadget编写技巧。
本文转自yefanqiu51CTO博客,原文链接:http://blog.51cto.com/yfsoft/323892,如需转载请自行联系原作者