对于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_GUI_WinformUI_winformgui_winform控件_winform_源码.zip
实例1 一个简易的绘图程序<br> 实例2 电子石英钟显示<br> 实例3 用C#制作字幕显示屏幕保护<br> 实例4 移动的按钮<br> 实例5 抓图软件的实现<br> 第三章 多媒体应用<br> 实例1 WinForm中播放音频与Flash动画<br> ...
easymodbus_winform_demo
C#_winForm_设置桌面分辨率,很实用的,满足大部分人的要求
WinForm_GUI_WinformUI_winformgui_winform控件_winform.zip
DockForm_C#winform界面设计_winform界面_winform_源码.rar.rar
Winform——透明窗体,无边框窗体拖动
winform增删改查的一个实例。, 就是非常简答
C#_winform_GridView_CheckBox_多选_全选
winform_选择图片上传_简单例子。可以指定上传的文件夹。亦可以将文件路径保存到数据库中去。只是抛砖引玉。
winform+界面特效470多例,很完全,很适合初学者
winform中视频播放的一系列无边框 ,移动等效果
System.Windows.Forms.Control<br/>...<br/><br/><br/>利用自定义控件做一个可以复用的时钟控件,可以有一个属性,表示当前的时间,以及一个alarm属性,可以设置到时报警的功能,以及2个事件,时间改变事件以及报警事件
c# winform 常用实例大全 _winform_cj.zip
自定义漂亮控件库。为GitHub上HZH_Controls项目。因github下载极慢,因此打包一个版本放在这里下载。
C#的winform是没有webform的RadioButtonList和CheckBoxList这两个控件的。要实现从数据库取出数据后动态生成N个RadioButton和CheckBox并获取选中项目的值,请看本例。思路很简单,有问题请指出,相互学习共同进步,...
这是一个用 C#开发的一个 WINFORM 同步通信的DEMO代码,经过编译测试OK,可用。
使用WinForm基于C/S架构的学生考试模块。使用.mdf格式的SQLServer数据库。
winform_画图工具_制作html模板winform_画图工具_制作html模板