DrawString()的问题和自定义控件的大小调整

时间:2013-11-28 03:46:07

标签: c# winforms custom-controls

我正在研究一些自定义控件,我正在寻找一些反馈。其中一个控件在设计时看起来类似于标准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"。我必须相信有一种比我在这里所展示的更好的方法。

我的下一个问题很难解释,所以我提供了几张图片。如果我将自定义控件从工具箱拖到设计图面上,它看起来类似于:

Design 1

但是,如果我手动调整控件的大小,选择矩形将保留其先前的大小:

Design 2

我对如何解决这个问题感到有些茫然。任何问题的任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:0)

你为第一个问题所做的并不是真正的某种黑客攻击,实际上很多默认控件是用一些硬编码填充绘制的(常用的是12 ...) 。通常情况下,文本边界的最大矩形是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();
}