`

C# GDI设计的高级时钟,很有用收藏了。

c# 
阅读更多
效果图:




接着上次的简单时钟,这次要高级多了,算法更正,可以自定义时钟分钟秒钟刻度等颜色,与系统时钟对应,随你怎么改,源代码具有很高的参考价值。
第一步:添加用户控件,命名为myNewClock
第二步:定义变量,要用到时钟,画布等
private Timer myTimer;//定义时钟,定时重新绘制
        private Graphics g;//创建画布
        private Pen pen;//创建画笔      
        private int width;//画布高度
        private int height;//画布宽度
第三步:定义属性,可以自由增加
Color hourColor = Color.Red;
        /// <summary>
        /// 时钟颜色
        /// </summary>
        [CategoryAttribute("颜色"), Description("时钟颜色")]
        public Color HourColor
        {
            get { return hourColor; }
            set { hourColor=value; }
        }
        Color minuteColor = Color.Green;
        /// <summary>
        /// 分钟颜色
        /// </summary>
        [CategoryAttribute("颜色"), Description("分钟颜色")]
        public Color MinuteColor
        {
            get { return minuteColor; }
            set { minuteColor = value; }
        }
        Color secondColor = Color.Blue;
        /// <summary>
        /// 秒钟颜色
        /// </summary>
        [CategoryAttribute("颜色"), Description("秒钟颜色")]
        public Color SecondColor
        {
            get { return secondColor; }
            set { secondColor = value; }
        }
        Color bigScaleColor = Color.DarkGreen;
        /// <summary>
        /// 大刻度颜色
        /// </summary>
        [CategoryAttribute("颜色"), Description("大刻度颜色")]
        public Color BigScaleColor
        {
            get { return bigScaleColor; }
            set { bigScaleColor = value; }
        }
        Color litterScaleColor = Color.Olive;
        /// <summary>
        /// 小刻度颜色
        /// </summary>
        [CategoryAttribute("颜色"), Description("小刻度颜色")]
        public Color LitterScaleColor
        {
            get { return litterScaleColor; }
            set { litterScaleColor = value; }
        }
        Color textColor = Color.White;
        /// <summary>
        /// 刻度值颜色
        /// </summary>
        [CategoryAttribute("颜色"), Description("刻度值颜色")]
        public Color TextColor
        {
            get { return textColor; }
            set { textColor = value; }
        }
        Color bigBackColor = Color.Black;
        /// <summary>
        /// 外圆背景色
        /// </summary>
        [CategoryAttribute("颜色"), Description("外圆背景颜色")]
        public Color BigBackColor
        {
            get { return bigBackColor; }
            set { bigBackColor = value; }
        }
        Color litterBackColor = Color.White;
        /// <summary>
        /// 内圆颜色
        /// </summary>
        [CategoryAttribute("颜色"), Description("内圆颜色")]
        public Color LitterBackColor
        {
            get { return litterBackColor; }
            set { litterBackColor = value; }
        }
第四步:重写OnPaint方法
protected override void OnPaint(PaintEventArgs e)
        {
            base.OnPaint(e);
            g = e.Graphics;
            g.SmoothingMode = SmoothingMode.AntiAlias; //
            g.SmoothingMode = SmoothingMode.HighQuality;//绘图模式 默认为粗糙模式,将会出现锯齿!
            width = this.Width;//时钟宽度
            height = this.Height;//时钟高度
            int x1 = 0;//开始绘制时钟起点X坐标
            int y1 = 0;//开始绘制时钟起点Y坐标
            /*------------------------------------------------------------------------------
            计算:整点刻度12个,每个刻度偏移角度为360/12 = 30 度 及为小时偏移角度
                  分秒刻度为60个,每个刻度偏移角度为360/60 = 6 度 及为分、秒偏移角度
            --------------------------------------------------------------------------------*/
            g.FillEllipse(new SolidBrush( bigBackColor), x1 + 2, y1 + 2, width - 4, height - 4);  //外圆
            pen = new Pen(new SolidBrush(litterBackColor), 2);
            g.DrawEllipse(pen, x1 + 7, y1 + 7, width - 13, height - 13);// 内圆
            g.TranslateTransform(x1 + (width / 2), y1 + (height / 2));//重新设置坐标原点
            g.FillEllipse(Brushes.White, -5, -5, 10, 10);//绘制表盘中心
           
            for (int x = 0; x < 60; x++)  //小刻度
            {
                g.FillRectangle(new SolidBrush(litterScaleColor), new Rectangle(-2, (System.Convert.ToInt16(height - / 2 - 2) * (-1), 3, 10));
                g.RotateTransform(6);//偏移角度
            }
            for (int i = 12; i > 0; i--)  //大刻度
            {
                string myString = i.ToString();
                //绘制整点刻度
                g.FillRectangle(new SolidBrush(bigScaleColor), new Rectangle(-3, (System.Convert.ToInt16(height - / 2 - 2) * (-1), 6, 20));
                //绘制数值
                g.DrawString(myString, new Font(new FontFamily("Times New Roman"),14, FontStyle.Bold, GraphicsUnit.Pixel),new SolidBrush( textColor), new PointF(myString.Length * (-6), (height - / -2 + 26));
                //顺时针旋转30度
                g.RotateTransform(-30);//偏移角度
            }
            //获得系统时间值
            int second = DateTime.Now.Second;
            int minute = DateTime.Now.Minute;
            int hour = DateTime.Now.Hour;
            /*------------------------------------------------------------------------------------
            每秒偏移6度,秒针偏移=当前秒*6
            每分偏移6读,分针偏移 = 当前分*6+当前秒*(6/60)
            每小时偏移60读,时针偏移 = 当前时*30+当前分*(6/60)+当前秒*(6/60/60)
            --------------------------------------------------------------------------------------*/
            //绘秒针
            pen = new Pen(secondColor, 1);
            pen.EndCap = LineCap.ArrowAnchor;
            g.RotateTransform(6 * second);
            float y = (float)((-1) * (height / 2.75));
            g.DrawLine(pen, new PointF(0, 0), new PointF((float)0, y));
            ////绘分针
            pen = new Pen(minuteColor, 4);
            pen.EndCap = LineCap.ArrowAnchor;
            g.RotateTransform(-6 * second);  //恢复系统偏移量,再计算下次偏移
            g.RotateTransform((float)(second * 0.1 + minute * 6));
            y = (float)((-1) * ((height - 30) / 2.75));
            g.DrawLine(pen, new PointF(0, 0), new PointF((float)0, y));
            ////绘时针
            pen = new Pen(hourColor, 6);
            pen.EndCap = LineCap.ArrowAnchor;
            g.RotateTransform((float)(-second * 0.1 - minute * 6));//恢复系统偏移量,再计算下次偏移
            g.RotateTransform((float)(second * 0.01 + minute * 0.1 + hour * 30));
            y = (float)((-1) * ((height - 45) / 2.75));
            g.DrawLine(pen, new PointF(0, 0), new PointF((float)0, y));
        }
贴出全部代码:
//控件名:myNewClock
//作者:刘典武
//时间:2011-06-10
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;
using System.Drawing.Drawing2D;
namespace myControl
{
    public partial class myNewClock : UserControl
    {
        public myNewClock()
        {
            InitializeComponent();
            this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
            this.SetStyle(ControlStyles.DoubleBuffer, true);
            this.SetStyle(ControlStyles.ResizeRedraw, true);
            this.SetStyle(ControlStyles.Selectable, true);
            this.SetStyle(ControlStyles.SupportsTransparentBackColor, true);
            this.SetStyle(ControlStyles.UserPaint, true);
            myTimer = new Timer();
            myTimer.Interval =1000;
            myTimer.Enabled = true;
            myTimer.Tick += new EventHandler(myTimer_Tick);
        }
        private void myTimer_Tick(object sender, EventArgs e)
        {
            this.Invalidate();
        }
        private Timer myTimer;//定义时钟,定时重新绘制
        private Graphics g;//创建画布
        private Pen pen;//创建画笔      
        private int width;//画布高度
        private int height;//画布宽度
        Color hourColor = Color.Red;
        /// <summary>
        /// 时钟颜色
        /// </summary>
        [CategoryAttribute("颜色"), Description("时钟颜色")]
        public Color HourColor
        {
            get { return hourColor; }
            set { hourColor=value; }
        }
        Color minuteColor = Color.Green;
        /// <summary>
        /// 分钟颜色
        /// </summary>
        [CategoryAttribute("颜色"), Description("分钟颜色")]
        public Color MinuteColor
        {
            get { return minuteColor; }
            set { minuteColor = value; }
        }
        Color secondColor = Color.Blue;
        /// <summary>
        /// 秒钟颜色
        /// </summary>
        [CategoryAttribute("颜色"), Description("秒钟颜色")]
        public Color SecondColor
        {
            get { return secondColor; }
            set { secondColor = value; }
        }
        Color bigScaleColor = Color.DarkGreen;
        /// <summary>
        /// 大刻度颜色
        /// </summary>
        [CategoryAttribute("颜色"), Description("大刻度颜色")]
        public Color BigScaleColor
        {
            get { return bigScaleColor; }
            set { bigScaleColor = value; }
        }
        Color litterScaleColor = Color.Olive;
        /// <summary>
        /// 小刻度颜色
        /// </summary>
        [CategoryAttribute("颜色"), Description("小刻度颜色")]
        public Color LitterScaleColor
        {
            get { return litterScaleColor; }
            set { litterScaleColor = value; }
        }
        Color textColor = Color.White;
        /// <summary>
        /// 刻度值颜色
        /// </summary>
        [CategoryAttribute("颜色"), Description("刻度值颜色")]
        public Color TextColor
        {
            get { return textColor; }
            set { textColor = value; }
        }
        Color bigBackColor = Color.Black;
        /// <summary>
        /// 外圆背景色
        /// </summary>
        [CategoryAttribute("颜色"), Description("外圆背景颜色")]
        public Color BigBackColor
        {
            get { return bigBackColor; }
            set { bigBackColor = value; }
        }
        Color litterBackColor = Color.White;
        /// <summary>
        /// 内圆颜色
        /// </summary>
        [CategoryAttribute("颜色"), Description("内圆颜色")]
        public Color LitterBackColor
        {
            get { return litterBackColor; }
            set { litterBackColor = value; }
        }
        protected override void OnPaint(PaintEventArgs e)
        {
            base.OnPaint(e);
            g = e.Graphics;
            g.SmoothingMode = SmoothingMode.AntiAlias; //
            g.SmoothingMode = SmoothingMode.HighQuality;//绘图模式 默认为粗糙模式,将会出现锯齿!
            width = this.Width;//时钟宽度
            height = this.Height;//时钟高度
            int x1 = 0;//开始绘制时钟起点X坐标
            int y1 = 0;//开始绘制时钟起点Y坐标
            /*------------------------------------------------------------------------------
            计算:整点刻度12个,每个刻度偏移角度为360/12 = 30 度 及为小时偏移角度
                  分秒刻度为60个,每个刻度偏移角度为360/60 = 6 度 及为分、秒偏移角度
            --------------------------------------------------------------------------------*/
            g.FillEllipse(new SolidBrush( bigBackColor), x1 + 2, y1 + 2, width - 4, height - 4);  //外圆
            pen = new Pen(new SolidBrush(litterBackColor), 2);
            g.DrawEllipse(pen, x1 + 7, y1 + 7, width - 13, height - 13);// 内圆
            g.TranslateTransform(x1 + (width / 2), y1 + (height / 2));//重新设置坐标原点
            g.FillEllipse(Brushes.White, -5, -5, 10, 10);//绘制表盘中心
           
            for (int x = 0; x < 60; x++)  //小刻度
            {
                g.FillRectangle(new SolidBrush(litterScaleColor), new Rectangle(-2, (System.Convert.ToInt16(height - / 2 - 2) * (-1), 3, 10));
                g.RotateTransform(6);//偏移角度
            }
            for (int i = 12; i > 0; i--)  //大刻度
            {
                string myString = i.ToString();
                //绘制整点刻度
                g.FillRectangle(new SolidBrush(bigScaleColor), new Rectangle(-3, (System.Convert.ToInt16(height - / 2 - 2) * (-1), 6, 20));
                //绘制数值
                g.DrawString(myString, new Font(new FontFamily("Times New Roman"),14, FontStyle.Bold, GraphicsUnit.Pixel),new SolidBrush( textColor), new PointF(myString.Length * (-6), (height - / -2 + 26));
                //顺时针旋转30度
                g.RotateTransform(-30);//偏移角度
            }
            //获得系统时间值
            int second = DateTime.Now.Second;
            int minute = DateTime.Now.Minute;
            int hour = DateTime.Now.Hour;
            /*------------------------------------------------------------------------------------
            每秒偏移6度,秒针偏移=当前秒*6
            每分偏移6读,分针偏移 = 当前分*6+当前秒*(6/60)
            每小时偏移60读,时针偏移 = 当前时*30+当前分*(6/60)+当前秒*(6/60/60)
            --------------------------------------------------------------------------------------*/
            //绘秒针
            pen = new Pen(secondColor, 1);
            pen.EndCap = LineCap.ArrowAnchor;
            g.RotateTransform(6 * second);
            float y = (float)((-1) * (height / 2.75));
            g.DrawLine(pen, new PointF(0, 0), new PointF((float)0, y));
            ////绘分针
            pen = new Pen(minuteColor, 4);
            pen.EndCap = LineCap.ArrowAnchor;
            g.RotateTransform(-6 * second);  //恢复系统偏移量,再计算下次偏移
            g.RotateTransform((float)(second * 0.1 + minute * 6));
            y = (float)((-1) * ((height - 30) / 2.75));
            g.DrawLine(pen, new PointF(0, 0), new PointF((float)0, y));
            ////绘时针
            pen = new Pen(hourColor, 6);
            pen.EndCap = LineCap.ArrowAnchor;
            g.RotateTransform((float)(-second * 0.1 - minute * 6));//恢复系统偏移量,再计算下次偏移
            g.RotateTransform((float)(second * 0.01 + minute * 0.1 + hour * 30));
            y = (float)((-1) * ((height - 45) / 2.75));
            g.DrawLine(pen, new PointF(0, 0), new PointF((float)0, y));
        }       
    }
}
  • 大小: 4.3 KB
分享到:
评论

相关推荐

    C#GDI+编写简单时钟

    在本文中,我们将深入探讨如何使用C#编程语言与GDI+库来创建一个功能完备且无闪烁的简单时钟应用程序。GDI+是.NET框架的一部分,它为开发者提供了丰富的图形绘制功能,使得创建视觉元素如时钟变得更加简单。 1. **...

    c# GDI+画时钟

    本主题将深入探讨如何使用C#的GDI+来绘制一个动态更新的时钟。 首先,我们需要理解GDI+的基本概念。GDI+提供了一系列的类和方法,如`Graphics`、`Pen`、`SolidBrush`等,用于绘制线条、形状、文本和图像。在C#中,...

    C# GDI绘制的动态时钟

    在本文中,我们将深入探讨如何使用C#编程语言和GDI(Graphics Device Interface)库来创建一个动态时钟。GDI是.NET Framework提供的一种低级图形绘制机制,它允许程序员直接控制屏幕上的像素,实现复杂的图形和文本...

    C# 使用GDI+绘制漂亮的ToolTip控件

    在.NET Framework中,C#提供了一种强大的图形接口——GDI+(Graphics Device Interface Plus),用于在Windows应用程序中创建和处理图形元素。本教程将深入探讨如何利用GDI+来扩展标准的ToolTip控件,使其拥有更丰富...

    C# GDI+ 仿Win7桌面时钟

    现在使用的还是XP的系统,每次看到数字显示的时钟总是不直观,于是做了一个仿Win7效果的桌面时钟,表盘使用的是图片,美工好的朋友可以自己换一个表盘背景。 代码只有一百多行(主要是画表针),适合新接触GDI+的朋友...

    c# GDI+ 时钟,源码

    精美的时钟,看效果请看上一条,有编译好的文件,此为源码

    C#使用GDI+制作时钟.docx

    本文将探讨如何使用C#和GDI+创建一个简单的时钟应用程序。这个时钟将实时显示当前的时间,包括小时、分钟和秒针。以下是关键代码的解释: 1. 首先,我们定义了一些必要的变量,如`center`表示时钟圆心的坐标,`r`...

    c# —GDI+ Timer控件 时钟

    总结,通过结合C#的GDI+和Timer控件,我们可以轻松地创建一个实时更新的时钟。GDI+为我们提供了绘制图形的能力,而Timer控件则负责定期执行更新任务。这种方法不仅可以用于创建时钟,还可以应用于其他需要周期性刷新...

    C#版小时钟程序,GDI+应用

    在本文中,我们将深入探讨...通过以上步骤,我们可以构建一个功能完善的C#小时钟程序,利用GDI+的绘图能力,不仅展示时间,还可以展示出程序员的创新设计。这个项目不仅锻炼了C#编程技能,也加深了对GDI+图形库的理解。

    基于c# GDI+开发的时钟

    本项目是基于C#和GDI+开发的一个简单时钟应用,对于初学者来说,这是一个很好的实践项目,可以学习到如何在C#环境中利用GDI+进行图形界面的设计和实时数据更新。 首先,我们需要理解C#窗体应用程序的基本结构。在...

    Visual C++ 典型模块与项目实战大全 第12章 扫雷游戏(定时器+GDI+数字时钟) 源码

    这是 Visual C++ 典型模块与项目实战大全 清华大学出版社 第12章 扫雷游戏(定时器+GDI+数字时钟) 源码,为了防止光盘丢失,特存于此。

    C# GDI+实现钟表源码

    在本文中,我们将深入探讨如何使用C#编程语言与GDI+图形库来实现一个功能齐全的钟表程序。GDI+(Graphics Device Interface Plus)是.NET Framework提供的一种强大的图形处理技术,它允许开发者创建丰富的图形用户...

    C# -GDI图像编程-时钟-秒表-定时器

    通过以上步骤,你可以创建出一个自定义的C#时钟或秒表应用,利用GDI+的强大功能展示动态的图形效果。同时,这也为你打开了通向更多复杂图形编程的大门,如动画、图表等。不断实践和学习,你将能够更好地掌握C#的图像...

    GDI+ 做的一个模拟时钟

    GDI+(Graphics Device Interface Plus)是Windows操作系统中用于图形绘制和处理的API,它扩展了...对于学习C#和GDI+的开发者来说,这是一个很好的实践案例,可以深入理解图形绘制、窗口定制以及接口设计等多个方面。

    C# GDI+ 实现钟表转动

    在C# .NET环境中,GDI+(Graphics Device Interface Plus)是一个强大的图形处理库,用于创建和操作2D图形。本篇文章将详细讲解如何利用C# GDI+来实现一个钟表,使得秒针、分针和时针能够随着时间的流逝而同步转动。...

    C#半透明风格时钟控件源码

    在本文中,我们将深入探讨如何在C#编程环境中创建一个具有半透明效果的时钟控件。这个项目源码提供了一个独特的用户界面元素,它不仅可以显示时间,而且通过使用半透明设计,为应用程序增添了现代感和优雅感。下面,...

    Gdi+时钟,有源码 MyClockMyClock

    在本项目“Gdi+时钟,有源码 MyClockMyClock”中,我们将会探讨如何使用GDI+来创建一个实时显示时间的自定义时钟应用程序。 首先,GDI+的核心在于它的绘图对象,如Pen、Brush、Font和Image等,这些对象使得开发者...

    GDI-电子时钟

    【GDI-电子时钟】是一个使用GDI(Graphics Device Interface)技术在C#编程语言中实现的简单电子时钟程序。GDI是Windows应用程序中用于绘制图形、文本和其他可视元素的基本接口。在这个项目中,开发者利用GDI的绘图...

    c#精美时钟(无资源文件纯GDI制作)

    【标题】"C#精美时钟(无资源文件纯GDI制作)"是一个使用C#编程语言,基于GDI+图形接口开发的时钟程序。这个程序的独特之处在于它没有依赖任何外部资源文件,而是完全利用了.NET Framework 2.0或更高版本提供的功能来...

    c#仪表盘、时钟

    综上所述,"C#仪表盘、时钟"项目涵盖了C#编程中的多个核心概念和技术,包括自定义控件开发、图形绘制、数据绑定、线程安全、事件处理、动画实现、单位转换、布局设计、设计模式以及测试与调试。通过这个项目,开发者...

Global site tag (gtag.js) - Google Analytics