SideShow Gadget开发[2]

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

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

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

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

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

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

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

mf1

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

 

mf2

3、在Sideshow设备上的显示

 

mf3

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

 

mf4

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

 

 

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

 

1、  两个GUIO

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

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

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

2、  注册代码

GadgetRegistration.Register

    (

    false,                                       //true 对全部用户有效  false 对当前用户有效                

    GadgetId,                                    //gadgetID 

    ScfSideShowGadget.ScfEndpointId,             //内容端点,需要使用SCF

    "Picture Share",                             //SideShow控制面板中显示的名字

    "/"" + Assembly.GetEntryAssembly().Location + "/"",      //程序所在的路径

    String.Format("/"{0}/",{1}", Assembly.GetEntryAssembly().Location, -GadgetRegistration.DefaultIconResourceId),    //程序图标位置

    false,                                       //True  连接时才显示内容,false 不用连接也能显示内容                   

    GadgetCachePolicies.KeepNewest,              //接收消息项的策略  KeepNewest保留最新 KeepOldest保留最老 KeepFrequentlyAccessed保留最频繁 KeepRecentlyAccessed保留最近以前没有收到的消息

    new Guid("9B84055E-E253-4119-8719-F684ECB9FBC1")      //属性页ID

   );

3、  事件设置

YFGadget = new Microsoft.SideShow.SimpleContentFormat.ScfSideShowGadget(new Guid(GadgetEntry.Gadget_GUID));

#region Listen to SideShow Events

// Subscribe to events from the Windows SideShow platform.

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);  // | ImageContentTransforms.KeepAspectRatio| ImageContentTransforms.KeepAspectRatio    

 

    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编写技巧。

相关文章
|
Arthas 监控 数据可视化
类似arthas的工具还有其他的吗?
类似arthas的工具还有其他的吗?
586 6
|
安全 算法 Java
Java一分钟:线程同步:synchronized关键字
【5月更文挑战第11天】Java中的`synchronized`关键字用于线程同步,防止竞态条件,确保数据一致性。本文介绍了其工作原理、常见问题及避免策略。同步方法和同步代码块是两种使用形式,需注意避免死锁、过度使用导致的性能影响以及理解锁的可重入性和升级降级机制。示例展示了同步方法和代码块的运用,以及如何避免死锁。正确使用`synchronized`是编写多线程安全代码的核心。
408 2
阿里云镜像公共仓库使用
这篇文章介绍了如何使用阿里云镜像公共仓库,包括登录管理界面、创建命名空间、推送和拉取镜像的详细步骤。
5344 4
阿里云镜像公共仓库使用
|
存储 Linux 数据库
云计算的体系结构
云计算的体系结构由5部分组成,分别为应用层,平台层,资源层,用户访问层和管理层,云计算的本质是通过网络提供服务,所以其体系结构以服务为核心。 如下图: 1,资源层 资源池层是指基础架构屋面的云计算服务,这些服务可以提供虚拟化的资源,从而隐藏物理资源的复杂性。
4739 0
|
关系型数据库 MySQL 数据库
Windows 安装 MySQL 5.7 x64 位
Windows 安装 MySQL 5.7 x64 位
1369 0
|
消息中间件 网络协议 Java
并发编程之Disruptor框架介绍和高阶运用(二)
并发编程之Disruptor框架介绍和高阶运用
1100 0
|
存储
【NI Multisim 14.0虚拟仪器设计——放置虚拟仪器仪表(示波器)】
🍍放置虚拟仪器仪表 NI Multisim 14.0 提供了多种仪器仪表,存储在集成库中,供用户选择使用。下面详细介绍常用的仪器仪表。 🍉示波器 示波器用来显示电信号波形的形状、大小、频率等参数的仪器,如图所示为示波器图标。 选择菜单栏中的“仿真”→“仪器”→“示波器”命令,或者单击“仪器”工具栏中的“示波器”按钮,放置图标,双击示波器图标,打开如图所示的示波器的面板图。 示波器面板各按键的作用、调整及参数的设置与实际的示波器类似,一共分成3个参数设置选项组和一个波形显示区。 1.“时基”选项组 (1)标度 显示示波器的时间基准,其基准为0.1fs/Div~1000Ts/Div可供选择
2253 0
【NI Multisim 14.0虚拟仪器设计——放置虚拟仪器仪表(示波器)】
|
Android开发
Android获取蓝牙列表
Android获取蓝牙列表