C# GDI+模拟时钟全解析
2. 提供时针、分针、秒针,并且每秒都要重新绘制它们以显示在合适的位置
1、熟悉Pen、Brush、Color、Font、Bitmap等对象的常用属性和方法
首先制作圆形窗体,先用绘图工具绘出一张圆形的图,中间填充色,背景色为白色,
然后设置WinForm窗体选择窗体,找到BackgroundImage属性,点击打开新的窗口,选择下面的导入资源文件,选择你的不规则的BMP图片, 找到窗体的TansparencyKey,将它设置为你背景图片的背景色(白色色) 找到窗体的FormBorderStyle,将其设置为none,即不显示标题栏。
这个时候显示的是一个圆形的窗体,但是实际上不是圆形的,只是其他的边角被隐藏了,还需要通过this.Region=new Region(GraphicPath gpath)裁剪一下,这样才是真正你要的形状,在下边的代码中会详细介绍。
private Thread timeThread;声明一个线程,不断的对页面进行重绘
private Point mouseOffset;定义鼠标的位置
private bool isMouseDown = false;标记鼠标是否按下
实现窗体的拖拽、移动:主要涉及了Mouse_Move ,Mouse_Down ,Mouse_Up事件,一一介绍:
/// <param name="sender"></param>
private void Form2_MouseDown(object sender, MouseEventArgs e)
if (e.Button == MouseButtons.Left)
x = -e.X - SystemInformation.FrameBorderSize.Width; //ystemInformation.FrameBorderSize.Width获取正在拖动调整大小窗口周围绘制的大小调整边框的粗细水平分量
y = -e.Y - SystemInformation.FrameBorderSize.Height - SystemInformation.CaptionHeight; //SystemInformation.CaptionHeight 获取窗口的标准标题栏区域的高度
mouseOffset = new Point(x, y);
/// <param name="sender"></param>
private void Form2_MouseMove(object sender, MouseEventArgs e)
Point mPoint = Control.MousePosition; //获取鼠标光标的位置
mPoint.Offset(mouseOffset.X, mouseOffset.Y); //设定鼠标平移指定量
/// <param name="sender"></param>
private void Form2_MouseUp(object sender, MouseEventArgs e)
if (e.Button == MouseButtons.Left)
protected override void OnPaint(PaintEventArgs e)
g.SmoothingMode = SmoothingMode.HighQuality; //高质呈现画面
g.DrawArc(new Pen(Color.Black, 0.5f), new RectangleF(center.X - r, center.Y - r, 2 * r - 3, 2 * r - 3), 0, 360);
GraphicsPath round = new GraphicsPath();
round.AddArc(new RectangleF(center.X - r, center.Y - r, 2 * r - 3, 2 * r - 3), 0, 360);
Region = new Region(round);//用上边所画的图形创建一个区域(相当于将多余的区域裁剪)
g.TranslateTransform(center.X, center.Y); // 通过左乘指定的平移来更改系统的坐标原点
g.RotateTransform(i*6); //旋转 ,每一秒旋转6度
g.DrawLine(new Pen(Color.Black,2.5f),r-12,0,r-5,0); //小时标准刻度
g.DrawLine(new Pen (Color.Black,0.5f),r-6,0,r-5,0);//分钟标准刻度
hour = hour + minute / 60f + second / 3600f;
minute = minute + second / 60f;
g.TranslateTransform(center.X, center.Y);//画时针
g.RotateTransform(hour * 30 + 270 - 6);
g.DrawLine(new Pen(Color.Black,2.5f),0,0,r*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,r*0.6f,0f);
g.TranslateTransform(center.X,center.Y);
g.RotateTransform(second * 6 + 270 - 6);