C# GDI+绘图时钟,该实验第一题绘画一个时钟该怎么做
时间: 2024-12-13 21:18:35 浏览: 24
要使用C#和GDI+绘制一个动态显示系统当前时间的时钟,并且在秒针中部显示你的名字,你可以按照以下步骤进行:
### 实验步骤
1. **创建Windows窗体应用程序**:
- 打开Visual Studio,新建一个Windows Forms App (.NET Framework)项目。
2. **添加Timer控件**:
- 从工具箱中拖拽一个`Timer`控件到窗体上。
- 设置`Timer`的`Interval`属性为1000毫秒(即1秒)。
- 双击`Timer`控件,生成`Tick`事件处理程序。
3. **编写绘制时钟的代码**:
- 在窗体类中定义一些常量和变量,用于存储时钟的中心点、半径等信息。
- 在`Paint`事件中绘制时钟表盘和指针。
4. **获取当前时间**:
- 使用`DateTime.Now`获取当前的时间,分别提取小时、分钟和秒。
5. **清除画布**:
- 每次刷新时钟前,先清除画布以避免残留图像。
- 使用`Graphics.Clear(this.BackColor)`方法清除画布。
6. **绘制时钟表盘**:
- 绘制表盘上的刻度和数字。
- 绘制时针、分针和秒针。
- 在秒针中部绘制你的名字。
### 示例代码
```csharp
using System;
using System.Drawing;
using System.Windows.Forms;
public partial class Form1 : Form
{
private Timer timer;
public Form1()
{
InitializeComponent();
InitializeTimer();
}
private void InitializeTimer()
{
timer = new Timer();
timer.Interval = 1000; // 1 second
timer.Tick += Timer_Tick;
timer.Start();
}
private void Timer_Tick(object sender, EventArgs e)
{
Invalidate(); // 引发重绘
}
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
Graphics g = e.Graphics;
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
int width = ClientSize.Width;
int height = ClientSize.Height;
Point center = new Point(width / 2, height / 2);
int radius = Math.Min(width, height) / 2 - 10;
// 清除画布
g.Clear(this.BackColor);
// 绘制表盘
DrawClockFace(g, center, radius);
// 绘制指针
DrawClockHands(g, center, radius);
}
private void DrawClockFace(Graphics g, Point center, int radius)
{
using (Pen pen = new Pen(Color.Black, 2))
{
g.DrawEllipse(pen, center.X - radius, center.Y - radius, radius * 2, radius * 2);
}
for (int i = 1; i <= 12; i++)
{
double angle = (Math.PI / 6) * i;
int x1 = (int)(center.X + (radius - 10) * Math.Cos(angle));
int y1 = (int)(center.Y + (radius - 10) * Math.Sin(angle));
int x2 = (int)(center.X + radius * Math.Cos(angle));
int y2 = (int)(center.Y + radius * Math.Sin(angle));
using (Pen pen = new Pen(Color.Black, 2))
{
g.DrawLine(pen, x1, y1, x2, y2);
}
}
}
private void DrawClockHands(Graphics g, Point center, int radius)
{
DateTime now = DateTime.Now;
int sec = now.Second;
int min = now.Minute;
int hour = now.Hour % 12;
// 秒针
double secAngle = (Math.PI / 30) * sec;
int secX = (int)(center.X + (radius - 30) * Math.Cos(secAngle));
int secY = (int)(center.Y + (radius - 30) * Math.Sin(secAngle));
using (Pen pen = new Pen(Color.Red, 1))
{
g.DrawLine(pen, center, new Point(secX, secY));
}
// 分针
double minAngle = (Math.PI / 30) * (min + sec / 60.0);
int minX = (int)(center.X + (radius - 50) * Math.Cos(minAngle));
int minY = (int)(center.Y + (radius - 50) * Math.Sin(minAngle));
using (Pen pen = new Pen(Color.Blue, 2))
{
g.DrawLine(pen, center, new Point(minX, minY));
}
// 时针
double hourAngle = (Math.PI / 6) * (hour + min / 60.0);
int hourX = (int)(center.X + (radius - 70) * Math.Cos(hourAngle));
int hourY = (int)(center.Y + (radius - 70) * Math.Sin(hourAngle));
using (Pen pen = new Pen(Color.Black, 3))
{
g.DrawLine(pen, center, new Point(hourX, hourY));
}
// 在秒针中部绘制名字
Font font = new Font("Arial", 12);
SizeF textSize = g.MeasureString("韦冬雪", font);
int nameX = (int)(secX - textSize.Height / 2);
g.DrawString("韦冬雪", font, Brushes.Red, nameX, nameY);
}
}
```
### 解决闪烁问题
为了防止画面闪烁,可以启用双缓冲技术:
1. **设置双缓冲**:
- 在窗体的构造函数或设计器中设置`DoubleBuffered`属性为`true`。
```csharp
public Form1()
{
InitializeComponent();
DoubleBuffered = true; // 启用双缓冲
InitializeTimer();
}
```
通过以上步骤,你应该能够成功地绘制一个动态显示系统当前时间的时钟,并在秒针中部显示你的名字。
阅读全文