Gavin.han

致力于移动开发 技术改变生活
随笔 - 133, 文章 - 0, 评论 - 46, 阅读 - 42万

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

模拟时钟

Posted on   gavin.han  阅读(272)  评论(0编辑  收藏  举报

winform项目

一、贴图为快

二、源码

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
using System.Drawing.Drawing2D;

namespace SimulatedClock
{
/// <summary>
/// author:hanjun
/// date:2012/10/18 20:42:10
/// 时钟窗体
/// </summary>
public partial class frmClock : Form
{
/// <summary>
/// 时钟线程
/// </summary>
private Thread timeThread;
/// <summary>
/// 点对象
/// </summary>
private Point mouseOffset;
/// <summary>
/// 时钟半径
/// </summary>
private float radius;
/// <summary>
/// 时钟中心
/// </summary>
private PointF center;
/// <summary>
/// 鼠标是否点下,默认为null
/// </summary>
private bool isMouseDown = false;

public frmClock()
{
InitializeComponent();
ShowInTaskbar = false;
SetStyle(ControlStyles.OptimizedDoubleBuffer, true);//控件先在缓冲区内显示,然后在绘制到屏幕上
SetStyle(ControlStyles.UserPaint, true); //控件自行绘制,而不是有系统自行绘制
SetStyle(ControlStyles.AllPaintingInWmPaint, true);//减少闪烁
center = new PointF(ClientSize.Width / 2.0f, ClientSize.Height / 2.0f);//确定表的中心 ClientSize获取窗体工作区大小
radius = Math.Min(ClientSize.Width / 2.0f, ClientSize.Height / 2.0f); //求得所要画的圆环半径
timeThread = new Thread(new ThreadStart(DrawClock));//启动一个线程定时重绘界面,实现时钟的动态效果
timeThread.Start();
}
/// <summary>
/// 绘制时钟
/// </summary>
private void DrawClock()
{
while (true)
{
Invalidate();//重绘整个画面
Thread.Sleep(950);
}
}

private void frmClock_MouseDown(object sender, MouseEventArgs e)
{
int x, y;
if (e.Button == MouseButtons.Left)
{
x = -e.X - SystemInformation.FrameBorderSize.Width; //获取正在拖动调整大小窗口周围绘制的大小调整边框的粗细水平分量
y = -e.Y - SystemInformation.FrameBorderSize.Height - SystemInformation.CaptionHeight; // 获取窗口的标准标题栏区域的高度
mouseOffset = new Point(x, y);
isMouseDown = true;
}
}

private void frmClock_MouseMove(object sender, MouseEventArgs e)
{
if (isMouseDown)
{
Point mPoint = Control.MousePosition; //获取鼠标光标的位置
mPoint.Offset(mouseOffset.X, mouseOffset.Y); //设定鼠标平移指定量
Location = mPoint;
}
}

private void frmClock_MouseUp(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
isMouseDown = false;
}
}
private Graphics g = null;
//重写绘图事件
protected override void OnPaint(PaintEventArgs e)
{
g = e.Graphics;
g.SmoothingMode = SmoothingMode.HighQuality; //高质呈现画面
//绘制出一个圆弧(这里是一个圆)
g.DrawArc(new Pen(Color.Black, 0.5f), new RectangleF(center.X - radius, center.Y - radius, 2 * radius - 3, 2 * radius - 3), 0, 360);

GraphicsPath round = new GraphicsPath();
//向当前图像追加一段圆弧
round.AddArc(new RectangleF(center.X - radius, center.Y - radius, 2 * radius - 3, 2 * radius - 3), 0, 360);
Region = new Region(round);//用上边所画的图形创建一个区域(相当于将多余的区域裁剪)
for (int i = 0; i < 59; i++)
{
g.ResetTransform(); //重置为单位矩阵
g.TranslateTransform(center.X, center.Y); // 通过左乘指定的平移来更改系统的坐标原点
g.RotateTransform(i * 6); //旋转 ,每一秒旋转6度
if ((i == 0) || (i % 5 == 4))//绘制表盘的刻度
{
g.DrawLine(new Pen(Color.Black, 2.5f), radius - 12, 0, radius - 5, 0); //小时标准刻度
}
else
{
g.DrawLine(new Pen(Color.Black, 0.5f), radius - 6, 0, radius - 5, 0);//分钟标准刻度
}
}
float hour, minute, second;
hour = DateTime.Now.Hour;
minute = DateTime.Now.Minute;
second = DateTime.Now.Second;
hour = hour + minute / 60f + second / 3600f;
minute = minute + second / 60f;
g.ResetTransform();
g.TranslateTransform(center.X, center.Y);//画时针
g.RotateTransform(hour * 30 + 270 - 6);
g.DrawLine(new Pen(Color.Black, 2.5f), 0, 0, radius * 0.5f, 0f); //绘出时针

g.ResetTransform();//画分针 ,坐标系恢复到默认状态,Graphics对象回到默认坐标系中绘图。
g.TranslateTransform(center.X, center.Y);//通过左乘指定的平移来更改系统的坐标原点
g.RotateTransform(minute * 6 + 270 - 6);
g.DrawLine(new Pen(Color.Black, 1.5f), 0, 0, radius * 0.6f, 0f);

g.ResetTransform();//画秒针
g.TranslateTransform(center.X, center.Y);
g.RotateTransform(second * 6 + 270 - 6);
g.DrawLine(new Pen(Color.Black, 0.5f), 0, 0, radius * 0.7f, 0f);//绘出秒针

base.OnPaint(e);
}
}
}

三、实现功能

1. 修改窗体形状为圆形
2. 提供时针、分针、秒针,并且每秒都要重新绘制它们以显示在合适的位置
3. 能用鼠标左键拖动窗体来移动模拟时钟的位置

四、知识点

1、熟悉Pen、Brush、Color、Font、Bitmap等对象的常用属性和方法
2、掌握Graphics对象的常用绘图方法

 

编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
点击右上角即可分享
微信分享提示