Gå til innhold

C#: Flere forms som alle kaller OnPaint kontinuerlig, kun en tegnes av gangen


Anbefalte innlegg

Hei!

Si at jeg har en form som kjører i en evig paint-loop ved at jeg kaller this.Invalidate() nederst i OnPaint-metoden. Dette funker fint, helt til jeg bestemmer meg for å lage to instanser av denne klassen, da vil kun en av dem tegnes om gangen.

 

Si for eksempel at OnPaint i Form1 ser slik ut:

protected override void OnPaint ( PaintEventArgs e )
	{
		base.OnPaint( e );
		g = e.Graphics;

		size = g.MeasureString("tekst", font);
		g.TranslateTransform( this.Width / 2, this.Height / 2 );
		g.RotateTransform( angle++ );

		g.DrawString( "tekst", font, brush, 
			new PointF(-(size.Width / 2), -(size.Height / 2)) );

		Application.DoEvents();
		this.Invalidate();
	}

 

Alt den koden gjør er å tegne "tekst" som roterer rundt.

 

med denne Main-metoden funker det:

		static void Main ()
	{
		Application.EnableVisualStyles();
		Application.SetCompatibleTextRenderingDefault( false );

		using (Form1 f1 = new Form1())
		{
			f1.Show();
			Application.Run();
		}
	}

 

med denne gjør det ikke det:

		static void Main ()
	{
		Application.EnableVisualStyles();
		Application.SetCompatibleTextRenderingDefault( false );

		Form[] forms = new Form[ 5 ];
		for (int i = 0; i < forms.Length; i++)
		{
			forms[ i ] = new Form1();
			forms[ i ].Show();
		}
		Application.Run();
	}

 

Så, hva kan jeg gjøre for å vise alle sammen samtidig, uten dette problemet?

Lenke til kommentar
Videoannonse
Annonse

Får ikke dette programmet til å kræsje? ville tro dette førte til stack overflow ganske raskt, da en funksjon ikke rekker å avslutte før den kaller seg selv...

 

Bruk heller en loop et sted hvor du kaller invalidate.

 

F.eks. kan du fjerne Application.Run, og heller lage din egen loop som kjører noe slikt:

 

while(m_app_running)
{
 Application.DoEvents();
 form.Invalidate();
}

 

Det application.Run gjør i all hovedsak, er å lage en loop som kjører Application.DoEvents og sjekke om eventuelt formen lukkes.

 

Du må også passe på at TextRenderingHint står på AntiAlias eller ClearTypeGridFit hvis du bruker MeasureString, ellers vil MeasureString returnere feil størrelse.

Lenke til kommentar

jorn: jeg prøvde dette, men da ble ikke formen vist. kan prøve litt mer. Vil det funke å bare kjøre i separate app domains?

 

geir: Neida, programmet krasjer ikke. derimot krasjer din metode når jeg lukker formen, selv om jeg setter m_app_running=false i FormClosing. kan også prøve litt mer å sette opp loopen på den måten. Takk for de andre tipsene også, men du svarte egentlig ikke på det jeg spurte om. Har forøvrig sett andre sider som foreslår min loop-metode fremfor din, men hva er egentlig den praktiske forskjellen?

 

EDIT: joda, med din måte funka det fint. problem solved!

Endret av hockey500
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...