zoukankan      html  css  js  c++  java
  • SideShow Gadget开发[2]

    上次在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控制面板上出现如下图标

     

     

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

     

    3、在Sideshow设备上的显示

     

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

     

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

     

     

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

     

    1、 两个GUIO

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

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

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

    2、 注册代码

    GadgetRegistration.Register

        (

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

        GadgetId,                                    //本gadget的ID 

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

  • 相关阅读:
    TERSUS无代码开发(笔记43)-整理可视化元件手册-13文本/字符串处理元件(28个)
    TERSUS无代码开发(笔记42)-整理可视化元件手册-12安全控制元件(9个)
    TERSUS无代码开发(笔记41)-整理可视化元件手册-11数学元件(29个)
    TERSUS无代码开发(笔记40)-整理可视化元件手册-10流程处理元件(4个)
    TERSUS无代码开发(笔记39)-整理可视化元件手册-09显示元件(40个)
    java实现md5加密
    redis的配置文件redis.conf常用配置
    centos7中安装redis出现的问题
    队列
    生产者 和 消费者
  • 原文地址:https://www.cnblogs.com/yefanqiu/p/1410396.html
Copyright © 2011-2022 走看看