美文网首页Web前端之路
三、写一个桌面时钟插件

三、写一个桌面时钟插件

作者: 是小帆吖 | 来源:发表于2019-09-29 19:19 被阅读0次

    在上一篇文章中写出了第一个heX桌面软件,并且让它显示出了Hello World。
    这个插件是之前我用C#写的。现在开始来使用heX编写一个桌面插件,上面显示着当前时间和日期,后续再调用第三方接口实现获取天气等功能。


    时钟插件

    首先在目录下创建新的文件夹,命名为clock_widget作为工程目录,然后分别创建html、css、js文件夹,后面用来存放对应的html、css、js文件。这样做可以使目录清晰,项目工程量大的时候维护会更方便。这个插件的代码量比较小,不过为了养成良好习惯还是创建好目录结构。


    clock_widget
    目录结构

    在对应文件夹下创建好html、css、js文件,我的命名分别为index.html、style.css、main.js;然后完成html文件的基本结构和资源引入。


    html文件
    <!DOCTYPE html>
    <html>
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>Clock Widget</title>
      <link rel="stylesheet" href="../css/style.css">
    </head>
    <body>
      
      <script src="../js/main.js"></script>
    </body>
    </html>
    

    这个时候还需要修改一下manifest.json文件中的first_page,将首页修改为clock_widget下html文件夹中的index.html。

    "first_page": "$(AppDir)clock_widget/html/index.html",
    

    现在开始编写时钟。在html文件中添加一个div,id为container;在container中添加一个h2,id设为time。

      <div id="container">
        <h2 id="time"></h2>
      </div>
    

    main.js中,首先获取time元素,然后设定一个定时器,间隔为1000ms,获取当前时间对象并且将时和分赋值给time元素。(实际写代码过程中发现ES6语法是不被heX支持的。)

    var timeLabel = document.getElementById('time');
    var inter = setInterval(function(){
      var now = new Date();
      timeLabel.innerText = now.getHours() + ':' + now.getMinutes();
    },1000);
    

    此时运行hexclient.exe,可以看到时间已经成功赋值给time元素。


    时间正确赋值给time标签

    到这里就算是实现时钟显示的基本功能了,不过离我们预想的插件效果还相差甚远。首先我们分析一下,完成的插件不会有白色的背景,这个背景对插件来说比较不美观;插件不会显示右上角的最小化、关闭等按钮,也不会在桌面任务栏上显示正在运行的任务。


    任务图标
    打开官网指南中manifest文件的说明,其中有对form对象的详细说明。
    form

    首先是style属性,将它设置为desktop_widget后,我们编写的界面就作为桌面widget窗口,会固定在桌面上,也不会显示在任务栏中。


    style: desktop_widget
    此时任务栏已经没有hexclient运行的图标了,而这个窗口也是不能被拖动的。
    然后是透明的问题,transmission_color属性是穿透颜色,简单点说就是transmission_color设置为a颜色(rgb值或者#颜色代码),窗口上这个颜色的地方就会变成透明,并且鼠标响应时间不会发生(大概可以等于不存在)。窗口背景是白色,我们设置transmission_color为rgb(255,255,255)或者#FFF,注意此时plain属性应该设置为true;窗口背景就会变成透明的。
    "plain": true,
    "transmission_color": "#FFF",
    
    窗口透明

    这里分小于10的时候只显示个位,在分钟前拼接一个'0'然后对其取后面两位。main.js修改如下:

    var timeLabel = document.getElementById('time');
    timeLabel.ondblclick = function(){
      hex.close();
    }
    var inter = setInterval(function(){
      var now = new Date();
      var hour = ('0' + now.getHours()).slice(-2);
      var min = ('0' + now.getMinutes()).slice(-2); 
      timeLabel.innerText = hour + ':' + min;
    },1000);
    
    格式化时间

    修改字体样式、大小、颜色(注意不要是跟transimission_color一样的颜色值),我这里修改为rgb(255,255,254)。

    *{
      margin: 0;
      padding: 0;
      color: rgb(255,255,254);
      font-family: Bahnschrift;
      font-weight: 100;
    }
    #time{
      font-size: 100px;
    }
    
    修改后的效果

    字体有毛边这个是应该是穿透颜色透明的影响,这个在用C#写的时候也有这个问题,暂时没看到什么好的解决方案。

    接下来就是完成日期、星期的功能,这里不详细写了,直接贴出代码。


    完成后的效果

    index.html

    <!DOCTYPE html>
    <html>
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>Clock Widget</title>
      <link rel="stylesheet" href="../css/style.css">
    </head>
    <body>
      <div id="container">
        <h2 id="time"></h2>
        <h2 id="date"></h2>
        <h2 id="week"></h2>
      </div>
    
      <script src="../js/main.js"></script>
    </body>
    </html>
    

    style.css

    *{
      margin: 0;
      padding: 0;
      color: rgb(255,255,254);
      font-family: Bahnschrift;
      font-weight: 100;
    }
    #time{
      font-size: 100px;
    }
    #date{
      font-size: 60px;
    }
    #week{
      font-size: 60px;
    }
    

    main.js

    var monthList = ['Jan','Feb','Mar','Apr','May','June','July','Aug','Sep','Oct','Nov','Dec'];
    var weekList = ['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'];
    var timeLabel = document.getElementById('time');
    var dateLabel = document.getElementById('date');
    var weekLabel = document.getElementById('week');
    timeLabel.ondblclick = function(){
      hex.close();
    }
    var inter = setInterval(function(){
      var now = new Date();
      var hour = ('0' + now.getHours()).slice(-2);
      var min = ('0' + now.getMinutes()).slice(-2); 
      var month = now.getMonth();
      var date = ('0' + now.getDate()).slice(-2);
      timeLabel.innerText = hour + ':' + min;
      dateLabel.innerText = monthList[month] + '  ' + date;
      weekLabel.innerText = weekList[now.getDay()];
    },1000);
    

    到这里插件的基本功能和样式已经实现了。

    相关文章

      网友评论

        本文标题:三、写一个桌面时钟插件

        本文链接:https://www.haomeiwen.com/subject/cgtwuctx.html