Como faço para chamar o evento paint?

Meu programa desenha texto em seu painel, mas se eu quiser remover o texto, preciso repintar.

Como faço para ligar (levantar) o evento de pintura manualmente?

O método Invalidate () causará uma repintura.

Link do MSDN

Em um método do seu formulário ou controle, você tem 3 opções:

this.Invalidate(); // request a delayed Repaint by the normal MessageLoop system this.Update(); // forces Repaint of invalidated area this.Refresh(); // Combines Invalidate() and Update() 

Normalmente, você chamaria Invalidate() e deixaria o sistema combiná-lo com outras atualizações da canvas. Se você estiver com pressa, deverá chamar Refresh() mas correrá o risco de ser repintado várias vezes consecutivamente, devido a outros controles (especialmente o Parent) Invalidating.

A forma normal como o Windows (Win32 e WinForms.Net) lida com isso é aguardar a MessageQueue ser executada em branco e, em seguida, processar todas as áreas da canvas invalidadas. Isso é eficiente porque, quando algo muda, geralmente cascata em outras coisas (controles), mudando também.

O cenário mais comum para Update () é quando você altera uma propriedade (digamos, label1.Text, que invalidará o Label) em um loop for e esse loop está temporariamente bloqueando o Message-Loop. Sempre que você usá-lo, você deve se perguntar se você não deveria estar usando um Thread. Mas a resposta nem sempre é sim.

Eu encontrei o Invalidate () criando muito de cintilação. Aqui está minha situação. Um controle personalizado que estou desenvolvendo desenha todo o seu conteúdo por meio do tratamento do evento Paint .

 this.Paint += this.OnPaint; 

Esse manipulador chama uma rotina personalizada que faz a pintura real.

 private void OnPaint(object sender, PaintEventArgs e) { this.DrawFrame(e.Graphics); } 

Para simular a rolagem, quero repintar meu controle toda vez que o cursor se move enquanto o botão esquerdo do mouse é pressionado. Minha primeira escolha foi usar o Invalidate () como o seguinte.

 private void RedrawFrame() { var r = new Rectangle( 0, 0, this.Width, this.Height); this.Invalidate(r); this.Update(); } 

O controle rola OK, mas pisca muito além de qualquer nível confortável. Então, decidi, em vez de repintar o controle, chamar meu método personalizado DrawFrame () diretamente depois de manipular o evento MouseMove . Isso produziu uma rolagem suave sem piscar.

 private void RedrawFrame() { var g = Graphics.FromHwnd(this.Handle); this.DrawFrame(g); } 

Esta abordagem pode não ser aplicável a todas as situações, mas até agora me convém bem.

Eu acho que você também pode chamar Refresh() .

Chame control.invalidate e o evento de pintura será gerado.

A atualização provavelmente também tornaria o código muito mais legível, dependendo do contexto.

use Control.InvokePaint você também pode usá-lo para buffer duplo manual