2016-05-31 72 views
1

我已經創建了一個從Panel導出的自定義控件。 一切工作正常,除了在設計師我的控制只有當它失去了重點時重繪。 我錯過了什麼?如何在設計器中更新自定義控件?

這裏是CustomControl.cs

using System.ComponentModel; 
using System.Drawing; 
using System.Windows.Forms; 

namespace Picwing 
{ 
    public partial class xPanel : Panel 
    { 
     private SizeF textSize; 

     public xPanel() { 
      InitializeComponent(); 
     } 

     [Browsable(true)] 
     public override string Text { 
      get { return base.Text; } 
      set { base.Text = value; } 
     } 

     protected override void OnPaint(PaintEventArgs pe) { 
      base.OnPaint(pe); 
      textSize = pe.Graphics.MeasureString(Text, Font); 
      pe.Graphics.DrawRectangle(new Pen(ForeColor, 1), pe.ClipRectangle.X, pe.ClipRectangle.Y + textSize.Height/2, pe.ClipRectangle.Width - 1, pe.ClipRectangle.Height - textSize.Height/2 - 1); 
      pe.Graphics.FillRectangle(new SolidBrush(BackColor), 5, 0, textSize.Width, textSize.Height); 
      pe.Graphics.DrawString(Text, Font, new SolidBrush(ForeColor), pe.ClipRectangle.X + 6, pe.ClipRectangle.Y); 
     } 
    } 
} 

的代碼這是內部xPanel1移動label1的後所取的打印屏幕,它失去焦點之前。 enter image description here

+0

你能打印屏幕嗎? –

+0

你忘了發佈你的控制代碼。 –

+0

您是否使用'+ ='註冊了OnPaint事件? – jdweng

回答

1

你的問題是因爲使用pe.ClipRectangle而在控制上繪畫。 請勿使用pe.ClipRectangle。根據您的要求,使用DisplayRectangleClientRactangle

當您在pe.ClipRectangle中繪製邊界時,如您所見,繪圖將在控件的最小失效部分完成。

注:

  • 你並不需要有InitializeComponent();在構造函數中,除非您使用的面板組件的設計一些其他組件添加到它。

  • 如果您使用的是DisplayRectangle,則在FillRectangle方法中,而不是0,5使用DisplayRectangle.X + 5, DisplayRectangle.Y

  • 如果你想畫一個自定義GroupBox,你可以看看Custom GroupBox BackColor to Transparent

+0

非常感謝您使用ClientRectangle並解決問題。 –

+0

歡迎您:) –

相關問題