日期:2014-05-17  浏览次数:21163 次

C# 制作 仪表
前些天在做NetAnalyzer时,需要使用一个指针仪表,网上看了一下,也有人做过,但是大部分都是收费的,本着自力更生的原则,于是决定自己设计一个,今天拿出来有读者分享一下。

首先是截图:

该仪表是以控件形式提供

在开始之前还要赘述一点关于GDI+中角度的计算

如下图:

在WinForm中左上角的点位(0,0),即原点,而其起始角则是图中划线处开始的,即为 rad=0;

在绘图时,尤其是做过扇形统计图的人应该比较清楚。

--------------------

接下来就是正式开始

首先新建控件,设置为witdth=height=150 ,可以自己定义,我在这里时可以自适应的

将背景颜色设置为Transparent(透明色),方便以后使用时减少干扰

在该仪表中主要分为两部分:背景部分(外框,刻度,单位等一些列基本不需要频繁变化的部分),前景部分(指针部分)

所以为了不是两个图层不相互影响,我们将背景绘制在控件的BackgroundImage 属性上,而指针部分则需要一个pictrueBox控件作为载体。

首先画背景

在绘制背景时,又分为外框、刻度,指针固定中心等


 // 绘制背景 用来总体控制背景的绘制
        private void DrawBackImg()
        {
            Bitmap bit = new Bitmap(this.Width, this.Height);
            Graphics gp = Graphics.FromImage(bit);
            gp.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
            #region 在这里可以扩展需要绘制的背景项目
            //外框
            drawFrame(gp);
            // 画刻度
            DrawRuling(gp);
            //画点
            drawPoint(gp);

            //绘制单位

            DrawUnitStr(gp);

            #endregion

           //当绘制完成后,直接直接设置为背景

            this.BackgroundImage = bit;
        }


      //绘制单位

       private void DrawUnitStr(Graphics gp)
        {
            int cer = _diameter / 2;
            gp.DrawString(_unitStr, new Font("宋体", 10), new SolidBrush(_frameColor), new PointF(cer, (float)(cer - cer * 0.3)), strFormat);

        }

        /// <summary>
        /// 画外框
        /// </summary>
        /// <param name="gp"></param>
        private void drawFrame(Graphics gp)
        {
            Pen pen