2017-04-04 6 views
0

사용자 정의 컨트롤을 만들고 있지만 OnPaint()을 무시하면 계속 호출되지 않습니다.
이 내 코드입니다 :C# 지연없이 계속 onpaint를 호출하는 방법

[ToolboxData("<{0}:ColoredProgressBar runat=server></{0}:ColoredPorgressBar>")] 
    public class ColoredProgressBar : ProgressBar 
    { 
     public Timer timer; 

     public ColoredProgressBar() 
     { 
      timer = new Timer(); 
      timer.Interval = 1000; 
      timer.Tick += new EventHandler(timer_Tick); 
      timer.Start(); 
      SetStyle(ControlStyles.DoubleBuffer, true); 
      SetStyle(ControlStyles.UserPaint, true); 
     } 
     public void timer_Tick(object sender , EventArgs e) 
     { 

     } 
     protected override void OnPaint(PaintEventArgs e) 
     { 
      base.OnPaint(e); 
      // Call methods of the System.Drawing.Graphics object. 
      e.Graphics.DrawString(Text, Font, new SolidBrush(ForeColor), ClientRectangle); 
      Console.WriteLine("???"); 
     } 
    } 

내가 메시지를 10 초 기다렸다 "???" 내 콘솔에 계속 나타나야합니다. 버그 12 메시지 만 표시됩니다. 나는 메시지가 계속 나타나더라도 Invalidate(true);를 시도했다, 모양은 아주 지체한다.

e.Graphics.DrawString은 매우 비싼 방법이 아닙니다. 맞습니까?

어떻게하면 OnPaint()을 지연없이 계속 호출 할 수 있습니까?

+0

글쎄 그 창에서 그 코드의 아무 곳이나 다시 칠하지 않아도됩니다. 아마도'this.Invalidate()'또는'this.Refresh()'와 같은'timer_Tick()'내부에서 뭔가를해야 할 것입니다 ... –

+0

이 작품! 많이 고맙습니다!^_ ^ – Ben

답변

1

코드의 모든 내용이 제대로 작동합니다. WinForms는 WinApi 및 GDI +의 상위 프레임 워크 일 뿐이므로 Windows 내부 메시지 펌프 및 메시지에 대한 지식을 먼저 얻어야 만합니다.이 메시지는 here으로 읽을 수 있습니다.
컨트롤을 다시 그리기 위해 WinForms에서 사용하는 WM_PAINT 메시지가 있습니다.

모든 OnPaint 이벤트는 응용 프로그램이 WM_PAINT 메시지를받은 후에 호출됩니다. 당신은 물론 MSDN 페이지에 명시된 바와 같이 동 기적으로 그림 그리기 루틴을 강제로하지 않습니다 Invalidate() 같은 방법을 사용하여이 메시지를 강제 할 수 있으며, 표기 후 Update()를 호출해야합니다 :

this.Invalidate(); 
this.Update(); 

또는 직접 수 Refresh() 메서드를 호출하면 컨트롤을 다시 그릴 수 있으며 해당 컨트롤은 모두 자식이됩니다.