簡體   English   中英

DrawString()問題和自定義控件的大小調整

[英]Issues with DrawString() and resizing of a custom control

我正在開發一些自定義控件,並且正在尋找反饋。 在設計時,其中一個控件看上去與標准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是因為寫在矩形內的文本被幾個像素切掉。 因此,我有一個較小的矩形,它稍微偏移了一點。 這行得通,但感覺像是“黑客”。 我必須相信,有一種比我在這里展示的方法更好的方法。

下一個問題很難解釋,因此提供了一些圖像。 如果我將自定義控件從工具箱拖動到設計圖面上,則其外觀類似於以下內容:

設計1

但是,如果我手動調整控件的大小,則選擇矩形將保留其先前的大小:

設計2

我對如何解決這個問題有些困惑。 任何一個問題的幫助將不勝感激!

您對第一個問題所做的實際上並不是某種破解,實際上,許多默認控件是使用一些硬編碼的填充繪制的(通常使用12 ...)。 通常,文本邊界的最大Rectangle是ClientRectangle ,如果您想要一些填充,您當然可以對其進行調整(就像您所做的那樣)。

對於第二個問題,這是因為在更改控件的大小后沒有任何代碼可以使控件無效,即使在更改text,font和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();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM