2016-05-31 4 views
1

Panel에서 파생 된 사용자 정의 컨트롤을 만들었습니다. 디자이너가 포커스를 잃을 때만 내 컨트롤이 다시 그려지는 것을 제외하면 모든 것이 잘 작동합니다. 내가 무엇이 누락 되었습니까? 이 포커스를 잃었을 전에 여기 디자이너에서 사용자 지정 컨트롤을 업데이트하는 방법은 무엇입니까?

는이 xPanel1 내부 LABEL1를 이동 한 후 촬영 인쇄 화면입니다 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); 
     } 
    } 
} 

의 코드입니다. enter image description here

+0

좀 걸릴 수 있습니다? –

+0

통제 코드를 게시하는 것을 잊었습니다. –

+0

'+ = "을 사용하여 OnPaint 이벤트를 등록 했습니까? – jdweng

답변

1

컨트롤에 그림을 그리는 동안 pe.ClipRectangle을 사용하기 때문에 문제가 발생했습니다. pe.ClipRectangle을 사용하지 마십시오. 대신 귀하의 요구 사항에 따라 DisplayRectangle 또는 ClientRactangle을 사용하십시오.

그림에서 볼 수 있듯이 pe.ClipRectangle 범위에서 그릴 때 가장 작은 무효화 된 컨트롤 부분에서 드로잉이 수행됩니다.

참고 : 당신은 당신이 그것에 다른 구성 요소를 추가 할 패널 구성 요소의 디자이너를 사용하지 않는 생성자에서 InitializeComponent();을 할 필요가 없습니다

  • .

  • 당신은 0,5 사용 DisplayRectangle.X + 5, DisplayRectangle.Y 대신, 다음 FillRectangle 방법, DisplayRectangle을 사용합니다. 당신이 사용자 정의 GroupBox을 그릴하려는 경우

  • , 당신은 당신이 그 화면 인쇄 할 수 Custom GroupBox BackColor to Transparent

+0

정말 고마워요. ClientRectangle 문제가 해결되었습니다. –

+0

당신은 환영합니다 :) –

관련 문제