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

C# 自定义控件的DrawString()和大小调整问题,c#,winforms,custom-controls,C#,Winforms,Custom Controls,我正在处理一些自定义控件,我正在寻找一些反馈。其中一个控件在设计时看起来类似于标准文本框,当将其拖放到设计图面上时,该控件的名称将写入文本区域。这一切都很好,但我觉得有一个更简单的方法来完成我所做的。我有以下代码: public override void Draw(Graphics graphics) { graphics.FillRectangle(new SolidBrush(BackColor), ClientRectangle); graphics.Dr

我正在处理一些自定义控件,我正在寻找一些反馈。其中一个控件在设计时看起来类似于标准文本框,当将其拖放到设计图面上时,该控件的名称将写入文本区域。这一切都很好,但我觉得有一个更简单的方法来完成我所做的。我有以下代码:

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,是因为写入矩形中的文本被切掉了几个像素。因此,我有一个较小的矩形,偏移了一点。这是可行的,但感觉像是“黑客”。我必须相信有比我在这里演示的更好的方法来做到这一点

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

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


我有点不知所措,不知如何解决这个问题。任何一个问题上的帮助都将不胜感激

对于第一个问题,您所做的并不是真正的黑客行为,事实上许多默认控件都是用一些硬编码填充(常用的是
1
2
…)。通常,文本边界的最大矩形是
ClientRectangle
,如果您需要一些填充,当然可以调整它(就像您所做的那样)

对于第二个问题,这是因为您没有任何代码在控件大小更改后使其无效,甚至在文本、字体和前景色更改时也必须使其无效。尝试将以下代码添加到您的代码中,它应该可以工作:

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();
}

国王:谢谢你的反馈!至于第二部分,您为选择框提供的不重新绘制的原因是正确的,但您的修复是错误的。在设计图面上调整控件大小时,会连续调用OnSizeChanged事件,但调整大小后,选择框仍为原始大小。我知道问题在于控件没有正确地失效,因为如果我调整控件的大小,然后手动更改属性,则选择控件将正确地重新绘制。我的想法是钩住ResizeEnd事件,但控件没有公开它=\@如果是这样的话,我认为你的问题确实很奇怪。我有一些自定义控件的经验,在所有情况下覆盖
OnSizeChanged
就足够了。