winform绘制自定义控件
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了winform绘制自定义控件相关的知识,希望对你有一定的参考价值。
绘制一个矩形,在运行时可以点击,并且能像文本框一样输入文本。这样的控件该怎么实现啊
画矩形可以不用说了,很简单,但是后面的没头绪...
2楼方法我曾想过,但这样的话会像和label就没有多大分别了,也就是多了个框
3楼的方法是我第一个放弃的方法。。。。
以上只是一个思路,要做到文本框那种功能,估计还有很多细节要考虑。 参考技术B 继承Control
重载Control的事件,如OnKeyPress,在OnKeyPress中把接收到的字符,赋给Control的Text,将Text画出来。
用一个定时器来实现光标,或者使用API的CreateCaret、SetCaretPos 参考技术C 在巨型里直接放一个文本框,把文本框的边框去掉,然后把文本框的text属性自己定义到自定义控件的属性上去 参考技术D 实现文本输入是很麻烦的东西
银行的输入控件都不是实现的很完善。
所以还是嵌入一个textbox,把边框去了。 第5个回答 2010-08-03 先画矩形,然后输入文字,然后超链接?
(*^__^*) ... ..
使用自定义 WinForms 控件,我可以更改嵌套控件停靠在里面的矩形吗?
【中文标题】使用自定义 WinForms 控件,我可以更改嵌套控件停靠在里面的矩形吗?【英文标题】:With a custom WinForms control, can I change the rectangle that nested controls dock inside? 【发布时间】:2016-02-17 19:01:57 【问题描述】:我正在尝试创建一个行为类似于GroupBox
的自定义控件,但具有更改边框颜色、更改组标签文本颜色和隐藏组标签的属性。该控件直接继承自 UserControl,并覆盖 On_Paint 以绘制边框矩形和带有表单设计者选择的任何颜色的标签。
我遇到的问题是尝试将嵌套控件停靠在其中时。停靠时,它使用控件的整个矩形,而不是绘制的矩形。我希望它表现得像 GroupBox,停靠的控件被限制在控件边框内的一个较小的矩形中。
是否有 UserControl
的属性(或者可能是 Panel
,我可以继承它)允许您设置停靠的嵌套控件停靠的矩形?
谢谢你,雷扎。这正是我所需要的。这是我的新控件,如果有人想使用它:
public class LabelledPanel : Panel
#region Constructors / Initializers
public LabelledPanel() : base()
InitializeComponent();
private void InitializeComponent()
this.BackColor = System.Drawing.Color.Transparent;
this.ForeColor = System.Drawing.Color.Red;
this.Name = "LabelledPanel";
this.ResumeLayout(false);
this.PerformLayout();
#endregion
#region Private fields
private String text = "Label";
private Brush brush;
private Color foreColor;
private Boolean showLabel = true;
private Int32 labelHeight = 13;
private Int32 pad = 3;
#endregion
#region Properties
[Browsable(true)]
[Category("Appearance")]
public override String Text
get return text;
set text = value;
[Browsable(true)]
[Category("Appearance")]
public override Color ForeColor
get return foreColor;
set
foreColor = value;
brush = new SolidBrush(value);
[Browsable(true)]
[Category("Layout")]
public Boolean ShowLabel
get return showLabel;
set showLabel = value;
public override Rectangle DisplayRectangle
get
var r = GetBorderRect();
return new Rectangle(
r.Left + pad,
r.Top + pad,
r.Width - (2 * pad),
r.Height - (2 * pad));
#endregion
protected override void OnPaint(PaintEventArgs p)
base.OnPaint(p);
ControlPaint.DrawBorder(p.Graphics, GetBorderRect(), foreColor, ButtonBorderStyle.Solid);
if (showLabel)
p.Graphics.DrawString(Text, Font, brush, 0, 0);
private Rectangle GetBorderRect()
Rectangle r = this.ClientRectangle;
if (showLabel)
r.Height -= labelHeight;
r.Y += labelHeight;
return r;
【问题讨论】:
顺便说一句,最好不要将答案作为问题的一部分发布。这可能会让未来的读者感到困惑。您可以发布已编辑的部分作为答案。 【参考方案1】:在停靠时控制其容器的DisplayRectangle
。
因此,您可以覆盖容器的DisplayRectangle
属性,以通过停靠的子控件自定义填充区域。例如,您可以查看GroupBox
控件的DisplayRectangle
属性的源代码。
您也可以设置Padding
属性,而不是覆盖显示矩形。对于容器控件,Padding
属性获取或设置它们的DisplayRectangle
属性。
【讨论】:
以上是关于winform绘制自定义控件的主要内容,如果未能解决你的问题,请参考以下文章
在winform画了一个自定义控件,现在我要在运行后进行拉伸动态改变大小,但快速拉伸就闪烁,怎么消除