各位前辈,
怎么在C#的winForm中创建我自己要定义的控件,
我还是新手,请详细说明要创建哪一种项目工程以及步骤说明。

解决方案 »

  1.   

    创建自定义控件的步骤
    • 第一步:新建一个windows控件库项目
    • 第二步:重写OnPaint
    • 第三步:向自定义控件添加属性
    • 第四步:给自定义控件增加自定义的图标
    • 第五步:生成自定义控件
    示例代码:using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Drawing;
    using System.Data;
    using System.Text;
    using System.Windows.Forms;namespace SmoothProgressBar
    {
        [ToolboxBitmap(typeof(ProgressBar))] 
        //可以建控件库项目
        public partial class SmoothProgressBar : UserControl
        {
            int min = 0; // Minimum value for progress range 
            int max = 100; // Maximum value for progress range 
            int val = 0; // Current progress 
            Color BarColor = Color.Blue; // Color of progress meter 
            protected override void OnResize(EventArgs e)
            {            // Invalidate the control to get a repaint.             this.Invalidate();        }
            protected override void OnPaint(PaintEventArgs e)
            {            Graphics g = e.Graphics;            SolidBrush brush = new SolidBrush(BarColor);            float percent = (float)(val - min) / (float)(max - min);            Rectangle rect = this.ClientRectangle;            // Calculate area for drawing the progress.             rect.Width = (int)((float)rect.Width * percent);            // Draw the progress meter.             g.FillRectangle(brush, rect);            // Draw a three-dimensional border around the control.             Draw3DBorder(g);            // Clean up.             brush.Dispose();            g.Dispose();        }
            public int Minimum
            {            get
                {                return min;            }            set
                {                // Prevent a negative value.                 if (value < 0)
                    {                    min = 0;                }                // Make sure that the minimum value is never set higher than the maximum value.                 if (value > max)
                    {                    min = value;                    min = value;                }                // Ensure value is still in range                 if (val < min)
                    {                    val = min;                }                // Invalidate the control to get a repaint.                 this.Invalidate();            }        }
            public int Maximum
            {            get
                {                return max;            }            set
                {                // Make sure that the maximum value is never set lower than the minimum value.                 if (value < min)
                    {                    min = value;                }                max = value;                // Make sure that value is still in range.                 if (val > max)
                    {                    val = max;                }                // Invalidate the control to get a repaint.                 this.Invalidate();            }        }        public int Value
            {            get
                {                return val;            }            set
                {                int oldValue = val;                // Make sure that the value does not stray outside the valid range.                 if (value < min)
                    {                    val = min;                }                else if (value > max)
                    {                    val = max;                }                else
                    {                    val = value;                }                // Invalidate only the changed area.                 float percent;                Rectangle newValueRect = this.ClientRectangle;                Rectangle oldValueRect = this.ClientRectangle;                // Use a new value to calculate the rectangle for progress.                 percent = (float)(val - min) / (float)(max - min);                newValueRect.Width = (int)((float)newValueRect.Width * percent);                // Use an old value to calculate the rectangle for progress.                 percent = (float)(oldValue - min) / (float)(max - min);                oldValueRect.Width = (int)((float)oldValueRect.Width * percent);                Rectangle updateRect = new Rectangle();                // Find only the part of the screen that must be updated.                 if (newValueRect.Width > oldValueRect.Width)
                    {                    updateRect.X = oldValueRect.Size.Width;                    updateRect.Width = newValueRect.Width - oldValueRect.Width;                }                else
                    {                    updateRect.X = newValueRect.Size.Width;                    updateRect.Width = oldValueRect.Width - newValueRect.Width;                }                updateRect.Height = this.Height;                // Invalidate the intersection region only.                 this.Invalidate(updateRect);            }        }        public Color ProgressBarColor
            {            get
                {                return BarColor;            }            set
                {                BarColor = value;                // Invalidate the control to get a repaint.                 this.Invalidate();            }        }        private void Draw3DBorder(Graphics g)
            {            int PenWidth = (int)Pens.White.Width;            g.DrawLine(Pens.DarkGray, new Point(this.ClientRectangle.Left, this.ClientRectangle.Top),            new Point(this.ClientRectangle.Width - PenWidth, this.ClientRectangle.Top));            g.DrawLine(Pens.DarkGray, new Point(this.ClientRectangle.Left, this.ClientRectangle.Top), new Point(this.ClientRectangle.Left, this.ClientRectangle.Height - PenWidth));            g.DrawLine(Pens.White, new Point(this.ClientRectangle.Left, this.ClientRectangle.Height - PenWidth),            new Point(this.ClientRectangle.Width - PenWidth, this.ClientRectangle.Height - PenWidth));            g.DrawLine(Pens.White, new Point(this.ClientRectangle.Width - PenWidth, this.ClientRectangle.Top),            new Point(this.ClientRectangle.Width - PenWidth, this.ClientRectangle.Height - PenWidth));        } 
            public SmoothProgressBar()
            {
                InitializeComponent();
            }
        }
    }
      

  2.   

    生成的自定义控件是一个DLL,要在工具箱中点击选择项将控件添加到工具箱中就可以拖拽了。