WinForm_2一个简单实用的小应用——桌面时钟
对于WinForm编程呢,我准备采用编写不同的小应用或小游戏这种方式——因此,可能每一个程序会包揽相对较多的东西,毕竟WinForm编程还是挺简单的^_^
今天先来做一个挺实用的小应用——桌面时钟,也就是在桌面上显示一个时钟。
要不先来看看效果如何呢?
可以看见,在桌面上的右上角,显示了一个数字时钟
OK,下面来看看是如何实现的:(从三个方面介绍)
(1)Form这个类中的一些属性
(2)计时器(Timer类)
(3)时钟的绘制
一、先介绍今天在Form这个类中用到的一些属性
Text:窗口的标题
BackColor:窗口背景色
TransparencyKey:获取或设置将表示窗体透明区域的颜色——这个属性相对重要,来看看msdn中的描述:
当将 Color 分配给 TransparencyKey 属性时,具有相同 BackColor 的窗体区域将透明显示。在窗体的透明区域执行的任何鼠标操作(如鼠标单击)都将传输到该透明区域下的窗口。(因此你如果想透明窗口客户区,只需要将该属性设置为窗口背景色BackColor就行了)
FormBorderStyle:窗口边框风格——它由一个枚举FormBorderStyle提供所有的选项(具体可参阅msdn)
ShowInTaskbar:决定是否让窗口在任务栏中显示(bool类型,设置为false就不显示)
StartPosition:窗口的起始位置——它也是由一个枚举FormStartPosition提供所有的选项(具体可参阅msdn)
WindowState:窗口显示的状态(最大化、最小化还是常规大小)——它也是由一个枚举FormWindowState提供所有选项
以下是相关代码的实现:
//窗口标题 Text = "DesktopClock"; //ResizeRedraw = true; BackColor = SystemColors.Window; //设置窗口透明区域的颜色(和背景色一样) TransparencyKey = BackColor; //去掉边框 FormBorderStyle = FormBorderStyle.None; //不在任务栏中显示窗体 ShowInTaskbar = false; //窗口其实位置 StartPosition = FormStartPosition.CenterScreen; //最大化显示 WindowState = FormWindowState.Maximized;
二、浅谈Timer这个类
因为是一个时钟程序,那么必定少不了计时器
在Win32 SDK中是由SetTimer()、KillTimer()这两个API函数来启动和销毁一个计时器,在WM_TIMER消息或是指定的函数中来响应计时器消息到来时的操作。那么在WinForm中呢,这些功能都封装到Timer这个类中,具体就是类中的Start()和Stop()方法来启动和销毁一个计时器,Tick属性来安装事件委托——如何响应计时器消息
以下是相关代码的实现:
//设置定时器 timer = new Timer(); timer.Interval = 1000; timer.Tick += new EventHandler(TimerOnTick); timer.Start();
//计时器响应事件 public void TimerOnTick(object obj, EventArgs ea) {Invalidate(); }
不过别忘了销毁计时器(虽然C#中有GC垃圾回收机制,不过最好是我们自行解决。呵呵,Win32 SDK的习惯)
//当窗口关闭时停止计时器 protected override void OnFormClosing(FormClosingEventArgs fcea) {base.OnFormClosing(fcea);timer.Stop(); }
三、看看时钟的绘制细节
(1). 如果是在Win32 SDK中,你肯定第一时间会想到应该在WM_PAINT中实现。但如果你看了我上一篇文章,你就会知道,在C#中事件委托这一机制取代了Win32 SDK的原始消息响应机制,你可以重写在Form中由Control这个类继承下来的OnPaint方法,本质上,它也就是响应WM_PAINT这个消息。
(2). 获取本地时间——关于时间和日期的操作基本上都封装到了DateTime这个类了,那么获取本地时间就可以使用该类中的Now()方法.
以下是相关代码的实现:
//绘制数字时钟 protected override void OnPaint(PaintEventArgs pea) {base.OnPaint(pea);Graphics grfx = pea.Graphics;String str = DateTime.Now.ToString("T"); //获取本地时间Font font = new Font(Font.FontFamily, 100);//设置新字体SizeF sizef = grfx.MeasureString(str, font);//获取时间字符串的大小(用于定位)//在桌面右上角绘制数字时钟grfx.DrawString(str, font, Brushes.Orange,(ClientSize.Width - sizef.Width), 0); }
OK,实现的细节差不多就是这样,还是贴上完整源代码,供初学者参考:
//DesktopClock.cs
using System;
using System.Drawing;
using System.Windows.Forms;class DesktopClock: Form
{private Timer timer;public DesktopClock(){//窗口标题Text = "DesktopClock";//ResizeRedraw = true;BackColor = SystemColors.Window;//设置窗口透明区域的颜色(和背景色一样)TransparencyKey = BackColor;//去掉边框FormBorderStyle = FormBorderStyle.None;//不在任务栏中显示窗体ShowInTaskbar = false;//窗口其实位置StartPosition = FormStartPosition.CenterScreen;//最大化显示WindowState = FormWindowState.Maximized;//设置定时器timer = new Timer();timer.Interval = 1000;timer.Tick += new EventHandler(TimerOnTick);timer.Start();}//计时器响应事件public void TimerOnTick(object obj, EventArgs ea){Invalidate();}//按下Ctrl+Q就可以退出程序protected override void OnKeyDown(KeyEventArgs kea){base.OnKeyDown(kea);if (kea.Modifiers == Keys.Control && kea.KeyCode == Keys.Q)Close();}//绘制数字时钟protected override void OnPaint(PaintEventArgs pea){base.OnPaint(pea);Graphics grfx = pea.Graphics;String str = DateTime.Now.ToString("T"); Font font = new Font(Font.FontFamily, 100);SizeF sizef = grfx.MeasureString(str, font);//在桌面右上角绘制数字时钟grfx.DrawString(str, font, Brushes.Orange,(ClientSize.Width - sizef.Width), 0);}//当窗口关闭时停止计时器protected override void OnFormClosing(FormClosingEventArgs fcea){base.OnFormClosing(fcea);timer.Stop();}static void Main(){Application.Run(new DesktopClock());}
}
WinForm_2一个简单实用的小应用——桌面时钟相关推荐
- html+css+小图标,HTML+CSS入门 一个简单实用的CSS loading图标
本篇教程介绍了HTML+CSS入门 一个简单实用的CSS loading图标,希望阅读本篇文章以后大家有所收获,帮助大家HTML+CSS入门.< 在web开发中,为了提高用户体验,在加载数据的时 ...
- 如何选择一个简单易用的云桌面
如何选择一个简单易用的企业级桌面云系统 废话少说,服务器虚拟化相信大家都熟悉了,也没啥难度了:但是桌面虚拟化就没那们简单.给你看一个Horizon View的系统架构,复杂不?反正一个新手,不折腾个把 ...
- 一个简单实用的SSAO实现
转自 http://blog.csdn.net/xoyojank/article/details/5734537 by José María Méndez 原文链接: http://www.gamed ...
- python简单小游戏代码_一个简单的python小游戏---七彩同心圆
本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理 用pygame做一个简单的python小游戏-七彩同心圆 玩法:每次点击鼠标时,会以鼠标为圆心,不断 ...
- 用pygame做一个简单的python小游戏---贪吃蛇
用pygame做一个简单的python小游戏-贪吃蛇 贪吃蛇游戏博客链接:(方法一样,语言不一样) c++贪吃蛇:https://blog.csdn.net/weixin_46791942/artic ...
- 用pygame做一个简单的python小游戏---七彩同心圆
用pygame做一个简单的python小游戏-七彩同心圆 这个小游戏原是我同学python课的课后作业,并不是很难,就简单实现了一下,顺便加强一下pygame库的学习. 玩法:每次点击鼠标时,会以鼠标 ...
- 用pygame做一个简单的python小游戏---生命游戏
用pygame做一个简单的python小游戏-生命游戏 生命游戏(Game of Life) 生命游戏(Game of Life)是剑桥大学约翰·何顿·康威(John Horton Conway)教授 ...
- python七彩同心圆_用pygame做一个简单的python小游戏---七彩同心圆
用pygame做一个简单的python小游戏---七彩同心圆 用pygame做一个简单的python小游戏-七彩同心圆 这个小游戏原是我同学python课的课后作业,并不是很难,就简单实现了一下,顺便 ...
- 做一个简单的java小游戏--单机版五子棋
做一个简单的java小游戏–单机版五子棋 学了java有一段时间了,今天就来搞一个简单的单机版五子棋游戏. 实现功能:那必须能进行基础的输赢判断.还有重新开始的功能,悔棋的功能,先手设置的功能和退出的 ...
最新文章
- 【阿里云 Linux 服务器】mysql 遇到以下问题Expression #1 of SELECT list is not in GROUP BY clause and contains nonag
- java requestparams_java – 如何验证@RequestParams不为空?
- ubuntu添加环境变量PATH
- 你所能用到的数据结构之番外篇---逆袭的面向对象(一)
- 自动驾驶 5-1 比例积分微分 (PID) 控制Lesson 1: Proportional-Integral-Derivative (PID) Control
- Graphical Model(概率图模型)的浅见
- css grid随页面大小_前端三大布局,float,flex,grid的介绍。
- 用友数据库错误“未能读取并闩锁页(1:3355)(用闩锁类型SH)”修复
- 排序算法:编程算法助程序员走上高手之路
- HTML5基础知识2
- backtrack渗透测试中常用的命令总结
- 该怎么标注建筑图纸后进行保存?
- linux两台电脑共享文件夹怎么设置,快速几步完美实现两台电脑共享上网的设置...
- 小白学习java第11天多态抽象类接口
- linux内核网络队列,Linux 内核网络协议栈 ------ 清理重传队列中函数 tcp_clean_rtx_queue...
- 高性能python软件开发_Python 最抢手、Java 最流行、Go 最有前途,7000 位程序员揭秘 2019 软件开发现状...
- configure 中常见的几个命令
- 时间格式处理获取本年份的起止时间
- 生命与自然的相互感应
- markdown基本用法
热门文章
- vue中页面刷新执行哪个钩子函数使用vue钩子函数mounted
- “调用的目标发生了异常”问题
- 新迅随身wifi助手刷机root安装面具安装debian折腾
- ODS与EDW的区别
- iloc函数使用方法
- 数据降维几种方法,主成分分析学习和代码实现
- 计算1到是10阶乘的和
- [网络安全学习篇19]:NAT、动态路由及实验(千峰网络安全视频笔记 19 day)
- js 设置video宽度_video设置视频的宽高
- rpm xnview for linux,Ubuntu 10.04 LTS下载 试用了一下XnView的Linux版