Web前端之路

三、写一个桌面时钟插件

2019-09-29  本文已影响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);

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

上一篇下一篇

猜你喜欢

热点阅读