如何在C#中进行自定义控件?

所以我正在开发一个像IDE一样的C#程序。 问题是,我是通过一个富文本框来实现的,自定义语法高亮显示是超级低效的。

我想知道是否有办法使自定义控件类似于富文本框(甚至基于一个),然后以更简单的方式构建语法高亮…

那么,我该如何制作自定义控件呢? 如果你是超级好的,那么你就指出了一个很好的教程方向!

我建议你看一些教程,比如

http://www.codeproject.com/KB/miscctrl/cutebutton.aspx

正如NavidRahmani上面所说,你不必从头开始,你可以扩展现有的控件或使用已经从不同库中创建的控件。

比如telerik控件。

很容易从基础控制派生出来

public class CustomRichTextBox:RichTextBox { public CustomRichTextBox() { this.Multiline = true; this.WordWrap = false; this.AcceptsTab = true; //... } } 

不,你的工具箱中没有控件试图假装是一个好的编辑器控件。 TextBox和RichTextBox有着截然不同的设计目标。 这已经解决了很多次,据我所知, ScintillaNET项目已经领先。

我发现本教程非常有用。 希望这对您有所帮助。

它很简单,只是调用图形方法和绘制形状对应的控件。

考虑你想要创建一个自定义按钮,你知道按钮是系统中的一个矩形,所以只需使用那些按钮坐标(x,y,宽度,高度)与C#中的Paint()方法中的LinearGradientBrush或SolidBrush进行填充矩形。 C#提供了ClientRectangle方法来获取使用矩形的控件的所有坐标。 有许多组件使用矩形,如Button,Panel,CheckBox,TabControl等。

在C#中创建自定义控件

我认为这些链接也很有用。

在C#中自定义Windows窗体

使用C#在Visual Studio中创建自定义控件(video)

如果链接formsC#Corner发现损坏,这是完整的源代码

  using System; using System.Collections.Generic; using System.Text; using System.Drawing; using System.Data; using System.Windows.Forms; using System.Drawing.Drawing2D; namespace Custom_Controls_in_CS { public class ButtonZ : System.Windows.Forms.Button { Color clr1, clr2; private Color color1 = Color.DodgerBlue; private Color color2 = Color.MidnightBlue; private Color m_hovercolor1 = Color.Turquoise; private Color m_hovercolor2 = Color.DarkSlateGray; private int color1Transparent = 250; private int color2Transparent = 250; private Color clickcolor1 = Color.Yellow; private Color clickcolor2 = Color.Red; private int angle = 90; private int textX = 100; private int textY = 25; private String text = ""; public Color buttonborder_1 = Color.FromArgb(220, 220, 220); public Color buttonborder_2 = Color.FromArgb(150, 150, 150); public Boolean showButtonText = true; public int borderWidth = 2; public Color borderColor = Color.Transparent; public enum ButtonsShapes { Rect, RoundRect, Circle } ButtonsShapes buttonShape; public ButtonsShapes ButtonShape { get { return buttonShape; } set { buttonShape = value; Invalidate(); } } public String ButtonText { get { return text; } set { text = value; Invalidate(); } } public int BorderWidth { get { return borderWidth; } set { borderWidth = value; Invalidate(); } } void SetBorderColor(Color bdrColor) { int red = bdrColor.R - 40; int green = bdrColor.G - 40; int blue = bdrColor.B - 40; if (red < 0) red = 0; if (green < 0) green = 0; if (blue < 0) blue = 0; buttonborder_1 = Color.FromArgb(red, green, blue); buttonborder_2 = bdrColor; } public Color BorderColor { get { return borderColor; } set { borderColor = value; if (borderColor == Color.Transparent) { buttonborder_1 = Color.FromArgb(220, 220, 220); buttonborder_2 = Color.FromArgb(150, 150, 150); } else { SetBorderColor(borderColor); } } } public Color StartColor { get { return color1; } set { color1 = value; Invalidate(); } } public Color EndColor { get { return color2; } set { color2 = value; Invalidate(); } } public Color MouseHoverColor1 { get { return m_hovercolor1; } set { m_hovercolor1 = value; Invalidate(); } } public Color MouseHoverColor2 { get { return m_hovercolor2; } set { m_hovercolor2 = value; Invalidate(); } } public Color MouseClickColor1 { get { return clickcolor1; } set { clickcolor1 = value; Invalidate(); } } public Color MouseClickColor2 { get { return clickcolor2; } set { clickcolor2 = value; Invalidate(); } } public int Transparent1 { get { return color1Transparent; } set { color1Transparent = value; if (color1Transparent > 255) { color1Transparent = 255; Invalidate(); } else Invalidate(); } } public int Transparent2 { get { return color2Transparent; } set { color2Transparent = value; if (color2Transparent > 255) { color2Transparent = 255; Invalidate(); } else Invalidate(); } } public int GradientAngle { get { return angle; } set { angle = value; Invalidate(); } } public int TextLocation_X { get { return textX; } set { textX = value; Invalidate(); } } public int TextLocation_Y { get { return textY; } set { textY = value; Invalidate(); } } public Boolean ShowButtontext { get { return showButtonText; } set { showButtonText = value; Invalidate(); } } public ButtonZ() { this.Size = new Size(100, 40); this.BackColor = Color.Transparent; this.FlatStyle = FlatStyle.Flat; this.FlatAppearance.BorderSize = 0; this.FlatAppearance.MouseOverBackColor = Color.Transparent; this.FlatAppearance.MouseDownBackColor = Color.Transparent; text = this.Text; } //method mouse enter protected override void OnMouseEnter(EventArgs e) { base.OnMouseEnter(e); clr1 = color1; clr2 = color2; color1 = m_hovercolor1; color2 = m_hovercolor2; } //method mouse leave protected override void OnMouseLeave(EventArgs e) { base.OnMouseLeave(e); color1 = clr1; color2 = clr2; SetBorderColor(borderColor); } protected override void OnMouseDown(MouseEventArgs mevent) { base.OnMouseDown(mevent); color1 = clickcolor1; color2 = clickcolor2; int red = borderColor.R - 40; int green = borderColor.G - 40; int blue = borderColor.B - 40; if (red < 0) red = 0; if (green < 0) green = 0; if (blue < 0) blue = 0; buttonborder_2 = Color.FromArgb(red, green, blue); buttonborder_1 = borderColor; this.Invalidate(); } protected override void OnMouseUp(MouseEventArgs mevent) { base.OnMouseUp(mevent); OnMouseLeave(mevent); color1 = clr1; color2 = clr2; SetBorderColor(borderColor); this.Invalidate(); } protected override void OnLostFocus(EventArgs e) { base.OnLostFocus(e); color1 = clr1; color2 = clr2; this.Invalidate(); } protected override void OnResize(EventArgs e) { base.OnResize(e); textX = (int)((this.Width / 3) - 1); textY = (int)((this.Height / 3) + 5); } //draw circular button function void DrawCircularButton(Graphics g) { Color c1 = Color.FromArgb(color1Transparent, color1); Color c2 = Color.FromArgb(color2Transparent, color2); Brush b = new System.Drawing.Drawing2D.LinearGradientBrush(ClientRectangle, c1, c2, angle); g.FillEllipse(b, 5, 5, this.Width - 10, this.Height - 10); for (int i = 0; i < borderWidth; i++) { g.DrawArc(new Pen(new SolidBrush(buttonborder_1)), 5 + i, 5, this.Width - 10, this.Height - 10, 120, 180); g.DrawArc(new Pen(new SolidBrush(buttonborder_2)), 5, 5, this.Width - (10 + i), this.Height - 10, 300, 180); } if (showButtonText) { Point p = new Point(textX, textY); SolidBrush frcolor = new SolidBrush(this.ForeColor); g.DrawString(text, this.Font, frcolor, p); } b.Dispose(); } //draw rectangular button function void DrawRectangularButton(Graphics g) { Color c1 = Color.FromArgb(color1Transparent, color1); Color c2 = Color.FromArgb(color2Transparent, color2); Brush b = new System.Drawing.Drawing2D.LinearGradientBrush(ClientRectangle, c1, c2, angle); g.FillRectangle(b, 0, 0, this.Width, this.Height); for (int i = 0; i < borderWidth; i++) { g.DrawLine(new Pen(new SolidBrush(buttonborder_1)), this.Width - i, 0, this.Width - i, this.Height); g.DrawLine(new Pen(new SolidBrush(buttonborder_1)), 0, this.Height - i, this.Width, this.Height - i); g.DrawLine(new Pen(new SolidBrush(buttonborder_2)), 0 + i, 0, 0 + i, this.Height); g.DrawLine(new Pen(new SolidBrush(buttonborder_2)), 0, 0 + i, this.Width, i); } if (showButtonText) { Point p = new Point(textX, textY); SolidBrush frcolor = new SolidBrush(this.ForeColor); g.DrawString(text, this.Font, frcolor, p); } b.Dispose(); } //draw round rectangular button function void DrawRoundRectangularButton(Graphics g) { Color c1 = Color.FromArgb(color1Transparent, color1); Color c2 = Color.FromArgb(color2Transparent, color2); Brush b = new System.Drawing.Drawing2D.LinearGradientBrush(ClientRectangle, c1, c2, angle); Region region = new System.Drawing.Region(new Rectangle(5, 5, this.Width, this.Height)); GraphicsPath grp = new GraphicsPath(); grp.AddArc(5, 5, 40, 40, 180, 90); grp.AddLine(25, 5, this.Width - 25, 5); grp.AddArc(this.Width - 45, 5, 40, 40, 270, 90); grp.AddLine(this.Width - 5, 25, this.Width - 5, this.Height - 25); grp.AddArc(this.Width - 45, this.Height - 45, 40, 40, 0, 90); grp.AddLine(25, this.Height - 5, this.Width - 25, this.Height - 5); grp.AddArc(5, this.Height - 45, 40, 40, 90, 90); grp.AddLine(5, 25, 5, this.Height - 25); region.Intersect(grp); g.FillRegion(b, region); for (int i = 0; i < borderWidth; i++) { g.DrawArc(new Pen(buttonborder_1), 5 + i, 5 + i, 40, 40, 180, 90); g.DrawLine(new Pen(buttonborder_1), 25, 5 + i, this.Width - 25, 5 + i); g.DrawArc(new Pen(buttonborder_1), this.Width - 45 - i, 5 + i, 40, 40, 270, 90); g.DrawLine(new Pen(buttonborder_1), 5 + i, 25, 5 + i, this.Height - 25); g.DrawLine(new Pen(buttonborder_2), this.Width - 5 - i, 25, this.Width - 5 - i, this.Height - 25); g.DrawArc(new Pen(buttonborder_2), this.Width - 45 - i, this.Height - 45 - i, 40, 40, 0, 90); g.DrawLine(new Pen(buttonborder_2), 25, this.Height - 5 - i, this.Width - 25, this.Height - 5 - i); g.DrawArc(new Pen(buttonborder_2), 5 + i, this.Height - 45 - i, 40, 40, 90, 90); } if (showButtonText) { Point p = new Point(textX, textY); SolidBrush frcolor = new SolidBrush(this.ForeColor); g.DrawString(text, this.Font, frcolor, p); } b.Dispose(); } protected override void OnPaint(PaintEventArgs e) { base.OnPaint(e); switch (buttonShape) { case ButtonsShapes.Circle: this.DrawCircularButton(e.Graphics); break; case ButtonsShapes.Rect: this.DrawRectangularButton(e.Graphics); break; case ButtonsShapes.RoundRect: this.DrawRoundRectangularButton(e.Graphics); break; } } } } 

谢谢。