对于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一个简单实用的小应用——桌面时钟相关推荐

  1. html+css+小图标,HTML+CSS入门 一个简单实用的CSS loading图标

    本篇教程介绍了HTML+CSS入门 一个简单实用的CSS loading图标,希望阅读本篇文章以后大家有所收获,帮助大家HTML+CSS入门.< 在web开发中,为了提高用户体验,在加载数据的时 ...

  2. 如何选择一个简单易用的云桌面

    如何选择一个简单易用的企业级桌面云系统 废话少说,服务器虚拟化相信大家都熟悉了,也没啥难度了:但是桌面虚拟化就没那们简单.给你看一个Horizon View的系统架构,复杂不?反正一个新手,不折腾个把 ...

  3. 一个简单实用的SSAO实现

    转自 http://blog.csdn.net/xoyojank/article/details/5734537 by José María Méndez 原文链接: http://www.gamed ...

  4. python简单小游戏代码_一个简单的python小游戏---七彩同心圆

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理 用pygame做一个简单的python小游戏-七彩同心圆 玩法:每次点击鼠标时,会以鼠标为圆心,不断 ...

  5. 用pygame做一个简单的python小游戏---贪吃蛇

    用pygame做一个简单的python小游戏-贪吃蛇 贪吃蛇游戏博客链接:(方法一样,语言不一样) c++贪吃蛇:https://blog.csdn.net/weixin_46791942/artic ...

  6. 用pygame做一个简单的python小游戏---七彩同心圆

    用pygame做一个简单的python小游戏-七彩同心圆 这个小游戏原是我同学python课的课后作业,并不是很难,就简单实现了一下,顺便加强一下pygame库的学习. 玩法:每次点击鼠标时,会以鼠标 ...

  7. 用pygame做一个简单的python小游戏---生命游戏

    用pygame做一个简单的python小游戏-生命游戏 生命游戏(Game of Life) 生命游戏(Game of Life)是剑桥大学约翰·何顿·康威(John Horton Conway)教授 ...

  8. python七彩同心圆_用pygame做一个简单的python小游戏---七彩同心圆

    用pygame做一个简单的python小游戏---七彩同心圆 用pygame做一个简单的python小游戏-七彩同心圆 这个小游戏原是我同学python课的课后作业,并不是很难,就简单实现了一下,顺便 ...

  9. 做一个简单的java小游戏--单机版五子棋

    做一个简单的java小游戏–单机版五子棋 学了java有一段时间了,今天就来搞一个简单的单机版五子棋游戏. 实现功能:那必须能进行基础的输赢判断.还有重新开始的功能,悔棋的功能,先手设置的功能和退出的 ...

最新文章

  1. 【阿里云 Linux 服务器】mysql 遇到以下问题Expression #1 of SELECT list is not in GROUP BY clause and contains nonag
  2. java requestparams_java – 如何验证@RequestParams不为空?
  3. ubuntu添加环境变量PATH
  4. 你所能用到的数据结构之番外篇---逆袭的面向对象(一)
  5. 自动驾驶 5-1 比例积分微分 (PID) 控制Lesson 1: Proportional-Integral-Derivative (PID) Control
  6. Graphical Model(概率图模型)的浅见
  7. css grid随页面大小_前端三大布局,float,flex,grid的介绍。
  8. 用友数据库错误“未能读取并闩锁页(1:3355)(用闩锁类型SH)”修复
  9. 排序算法:编程算法助程序员走上高手之路
  10. HTML5基础知识2
  11. backtrack渗透测试中常用的命令总结
  12. 该怎么标注建筑图纸后进行保存?
  13. linux两台电脑共享文件夹怎么设置,快速几步完美实现两台电脑共享上网的设置...
  14. 小白学习java第11天多态抽象类接口
  15. linux内核网络队列,Linux 内核网络协议栈 ------ 清理重传队列中函数 tcp_clean_rtx_queue...
  16. 高性能python软件开发_Python 最抢手、Java 最流行、Go 最有前途,7000 位程序员揭秘 2019 软件开发现状...
  17. configure 中常见的几个命令
  18. 时间格式处理获取本年份的起止时间
  19. 生命与自然的相互感应
  20. markdown基本用法

热门文章

  1. vue中页面刷新执行哪个钩子函数使用vue钩子函数mounted
  2. “调用的目标发生了异常”问题
  3. 新迅随身wifi助手刷机root安装面具安装debian折腾
  4. ODS与EDW的区别
  5. iloc函数使用方法
  6. 数据降维几种方法,主成分分析学习和代码实现
  7. 计算1到是10阶乘的和
  8. [网络安全学习篇19]:NAT、动态路由及实验(千峰网络安全视频笔记 19 day)
  9. js 设置video宽度_video设置视频的宽高
  10. rpm xnview for linux,Ubuntu 10.04 LTS下载 试用了一下XnView的Linux版