2016-05-31 4 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); 
     } 
    } 
} 

Это трафаретная печать принято после перемещения Label1 внутри xPanel1, прежде чем оно теряет фокус. enter image description here

+0

Не могли бы вы напечатать экран, который может? –

+0

Вы забыли написать коды вашего контроля. –

+0

Вы зарегистрировали событие OnPaint с «+ =»? – jdweng

ответ

1

Ваша проблема заключается в использовании pe.ClipRectangle при покраске на контроле. Не использовать pe.ClipRectangle. Используйте вместо этого DisplayRectangle или ClientRactangle, исходя из вашего требования.

Когда вы рисуете в pe.ClipRectangle границах, как вы можете видеть, рисунок будет выполнен на самой маленькой недействительной части вашего контроля.

Примечание:

  • Вам не нужно иметь InitializeComponent(); в конструкторе, если вы используете конструктор компонента панели, чтобы добавить некоторые другие компоненты.

  • Если вы использовали DisplayRectangle, то в методе FillRectangle, вместо 0,5 использования DisplayRectangle.X + 5, DisplayRectangle.Y.

  • Если вы пытаетесь рисовании обычай GroupBox, вы посмотрите на Custom GroupBox BackColor to Transparent

+0

Большое спасибо. Я использовал ClientRectangle и проблема решена. –

+0

Добро пожаловать :) –

Смежные вопросы