Aktivera dubbelbuffering för tabpage i C# (skoluppgift)

Permalänk

Aktivera dubbelbuffering för tabpage i C# (skoluppgift)

Hej!

Har en inlämningsuppgift (programmering 1) och vet inte riktigt vad jag ska göra. Har testat och experimenterat runt lite med att bland annat flytta runt raderna, men inte fått det resultatet jag vill ha. Har även sökt runt lite andra forum utan att bli klokare eftersom det verkar väldigt rörigt.

Inlämningsuppgiften går ut på att skapa ett "skjutspel" med en måltavla samt ett sikte. Därefter ska det gå att skjuta på måltavlan och räkna poäng med mera, men det kommer jag till så småningom.

Det som jag har problem med är att få bort flimmret. Siktet ska röra sig efter muspekaren och då "målas" ju måltavlan och siktet upp igen från början, vilket skapar väldigt mycket flimmer, något som jag vill få bort. Tidigare när måltavlan och siktet ritats upp i form1 så har jag löst detta med raden "this.DoubleBuffered = true;". Dock verkar detta inte funka när måltavlan och siktet ritas upp på en tabpage. Vet inte riktigt hur jag ska göra.

Bifogar all min kod här nedan (klassen för måltavla och sikte samt "form-koden"). Får ursäkta den röriga strukturen som uppstått när jag testat och experimenterat runt.

Tacksam för all form av hjälp!

Form1.cs:

public partial class Form1 : Form { Måltavla mål; Sikte sikte; public Form1() { InitializeComponent(); //Skapa ett sikt-objekt med namnet sikte och ge det positionen 0, 0 och storleken 20 sikte = new Sikte(200, 200, 20); //Aktivera dubbelbuffering this.DoubleBuffered = true; } private void Form1_Load(object sender, EventArgs e) { //Sätt höjd och bredd till skärmstorleksvärden int höjd = Screen.PrimaryScreen.Bounds.Height; int bredd = Screen.PrimaryScreen.Bounds.Width; //Sätt storleken på form1 till skärmstorleken this.Size = new Size(bredd, höjd); //Placera måltavlan i mitten av skärmen mål = new Måltavla(ClientSize.Width / 2, ClientSize.Height / 2, 100); //Fyll tabcontrol i form1 this.tabControl1.Dock = DockStyle.Fill; //Uppdatera kontrollen med det senaste resultatet. tabPage1.Paint += tabPage1_Paint; //Maximera fönstret this.WindowState = FormWindowState.Maximized; } private void tabPage1_Paint(object sender, PaintEventArgs e) { mål.Rita(e.Graphics); sikte.Rita(e.Graphics); } private void tabPage1_MouseMove(object sender, MouseEventArgs e) { sikte.X = e.X; sikte.Y = e.Y; tabPage1.Invalidate(); } }

Sikte.cs:

internal class Sikte { //Medlemsdata private int x = 0; private int y = 0; private int radie = 0; //Konstruktor public Sikte(int x, int y, int r) { this.X = x; this.Y = y; this.Radie = r; } //Egenskaper public int X { get { return x; } set { x = value; } } public int Y { get { return y; } set { y = value; } } public int Radie { get { return radie; } set { if (value > 0) { radie = value; } else { radie = -value; } } } public Point Position { get { return new Point(x, y); } set { x = value.X; y = value.Y; } } public void Flytta(int dx, int dy) { x = x + dx; y = y + dy; } //Metoder public void Rita(Graphics g) { int r = radie; g.DrawEllipse(Pens.Green, x - r, y - r, r * 2, r * 2); r = (int)(radie * 0.6); g.DrawEllipse(Pens.Green, x - r, y - r, r * 2, r * 2); r = (int)(radie * 0.4); g.DrawLine(Pens.Green, x - (3 * r), y, x - r, y); g.DrawLine(Pens.Green, x + (3 * r), y, x + r, y); g.DrawLine(Pens.Green, x, y - (3 * r), x, y - r); g.DrawLine(Pens.Green, x, y + (3 * r), x, y + r); r = (int)(radie * 0.1); g.DrawLine(Pens.Purple, x - r, y, x + r, y); g.DrawLine(Pens.Purple, x, y - r, x, y + r); } }

Måltavla.cs:

internal class Måltavla { //Medlemsdata private int x = 0; private int y = 0; private int radie = 0; //Konstruktor public Måltavla(int x, int y, int r) { this.X = x; this.Y = y; this.Radie = r; } //Egenskaper public int X { get { return x; } set { x = value; } } public int Y { get { return y; } set { y = value; } } public int Radie { get { return radie; } set { if (value > 0) { radie = value; } else { radie = -value; } } } public Point Position { get { return new Point(x, y); } set { x = value.X; y = value.Y; } } public void Flytta(int dx, int dy) { x = x + dx; y = y + dy; } //Metoder public void Rita(Graphics g) { int r = radie; g.DrawEllipse(Pens.Black, x - r, y - r, r * 2, r * 2); g.FillEllipse(Brushes.Black, x - r, y - r, r * 2, r * 2); r = (int)(radie * 0.833); g.FillEllipse(Brushes.White, x - r, y - r, r * 2, r * 2); r = (int)(radie * 0.666); g.FillEllipse(Brushes.Black, x - r, y - r, r * 2, r * 2); r = (int)(radie * 0.499); g.FillEllipse(Brushes.White, x - r, y - r, r * 2, r * 2); r = (int)(radie * 0.333); g.FillEllipse(Brushes.Black, x - r, y - r, r * 2, r * 2); r = (int)(radie * 0.166); g.FillEllipse(Brushes.Red, x - r, y - r, r * 2, r * 2); } }