我正在研究一些自定义控件,我正在寻找一些反馈。其中一个控件在设计时看起来类似于标准TextBox,当它被拖放到设计图面上时,控件的名称将写入文本区域。这一切都很好,但我觉得有一种更简单的方法可以完成我所做的事情。我有以下代码:
public override void Draw(Graphics graphics)
{
graphics.FillRectangle(new SolidBrush(BackColor), ClientRectangle);
graphics.DrawString(Text, Font, new SolidBrush(ForeColor), TextRectangle, format);
DrawControl(graphics);
}
protected void DrawControl(Graphics graphics)
{
CotrolPaint.DrawBorder3D(graphics, ClientRectangle, Border3DStyle.Etched);
}
protected Rectangle TextRectangle
{
get
{
return new Rectangle(ClientRectangle.Left + 2,
ClientRectangle.Top + 2,
ClientRectangle.Width - 5,
ClientRectangle.Height - 5);
}
}
现在查看代码,TextRectangle应该是一个只读常量,但我离题了。代码相当简单,我挂起的是我的TextRectangle属性。我使用它的原因是ClientRectangle而不是因为写入矩形内的文本被几个像素切断。因此,我有一个较小的矩形,有点偏移。这有效,但感觉就像是" hack"。我必须相信有一种比我在这里所展示的更好的方法。
我的下一个问题很难解释,所以我提供了几张图片。如果我将自定义控件从工具箱拖到设计图面上,它看起来类似于:
但是,如果我手动调整控件的大小,选择矩形将保留其先前的大小:
我对如何解决这个问题感到有些茫然。任何问题的任何帮助将不胜感激!
答案 0 :(得分:0)
你为第一个问题所做的并不是真正的某种黑客攻击,实际上很多默认控件是用一些硬编码填充绘制的(常用的是1
和2
...) 。通常情况下,文本边界的最大矩形是ClientRectangle
,如果你想要一些填充,当然你可以调整它(就像你一样)。
对于第二个问题,这是因为你没有任何代码可以在控件大小改变后使控件无效,即使你必须在文本,字体和forecolor被更改时无效。尝试将以下代码添加到您的代码中,它应该可以工作:
protected override void OnSizeChanged(EventArgs e){
base.OnSizeChanged(e);
Invalidate();
}
protected override void OnTextChanged(EventArgs e){
base.OnTextChanged(e);
Invalidate();
}
protected override void OnFontChanged(EventArgs e){
base.OnFontChanged(e);
Invalidate();
}
protected override void OnForeColorChanged(EventArgs e){
base.OnForeColorChanged(e);
Invalidate();
}