Hi, ich versuche grad ein bild von rechts einfliegen zu lassen.
Ich benutze Double Buffering um meine Bilder anzuzeigen usw., das Problem is das es mit dem einfliegen lassen nich so recht klappt. Es geht zwar aber es is voll uneffizient und ich hab schon fix ne OutOfMemory Exception erhalten, ich realisiere das nämlich mit einer For-Schleife und zeichne dann alle 10 Pixel weiter das Bild nocheinmal rein, und damit es nich 300 mal da aufgemalt is, übermale ich das alte immer wieder mit dem Hintergrund
for (int i = 1000; i >= 790; i=i-10)
{
myBuffer.Graphics.DrawImage(Image.FromFile(pfad + "Schlafzimmer2.jpg"), 0, 0, 1024, 768);
myBuffer.Graphics.DrawImage(Image.FromFile(pfad + "robocop.png"), i, 270, 320, 500);
myBuffer.Render();
Thread.Sleep(5);
}
jedenfalls is das nich grade das gelbe vom Ei und flüssig läufts auch nich ^^
hat da jemand ne Idee wie ich das anders realisieren könnte?
Und vieleicht auch noch wie ich ein Bild auftauchen lassen kann, wie z.B. bei Power Point?
Hallo,
verwende einen Timer anstatt Thread.Sleep().
Wegen der OutOfMemory Exception, gibst du die Zeichenressourcen wieder frei nach dem Zeichnen?
fz
"We better hurry up and start coding, there are going to be a lot of bugs to fix."
Hallo emerel,
wieso erstellst du in jedem Schleifendurchlauf das Bild neu?
Erstelle es außerhalb der Schleife und nimm dann immer dieser her.
Und kombiniere Pfade mit Path.Combine(string,string)
Thread.Sleep() ist in der GUI eine schlechte Entscheidung. Nimm dazu besser einer Timer.
Gruß
Michael
Also, ich würde das mit nem Timer, dem Paint-Event und Invalidate() realisieren...
Z.B. so:
private Timer timer1;
private IContainer components;
public Form1()
{
InitializeComponent();
// Set the value of the double-buffering style bits to true.
this.SetStyle(ControlStyles.DoubleBuffer |
ControlStyles.UserPaint |
ControlStyles.AllPaintingInWmPaint,
true);
this.UpdateStyles();
}
private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
this.timer1 = new System.Windows.Forms.Timer(this.components);
this.SuspendLayout();
//
// timer1
//
this.timer1.Enabled = true;
this.timer1.Interval = 5;
this.timer1.Tick += new System.EventHandler(this.timer1_Tick);
//
// Form1
//
this.ClientSize = new System.Drawing.Size(512, 384);
this.Name = "Form1";
this.Text = "Main Form";
this.Paint += new System.Windows.Forms.PaintEventHandler(this.Form1_Paint);
this.ResumeLayout(false);
}
int x = 512;
int y = 0;
private void timer1_Tick(object sender, EventArgs e)
{
x--;
if (x == 0)
timer1.Stop();
this.Invalidate(false);
}
private void Form1_Paint(object sender, PaintEventArgs e)
{
Graphics graphics = e.Graphics;
graphics.DrawImage(PaintSample.Properties.Resources.Test, new Point(x, y));
}
Ich habe dir das Sample angehängt. Hoffentlich hilft es dir!
Dein Code war wirklich etwas... unperformant.
Das liegt z.B. auch daran, dass du bei jedem Update das Bild neu lädst.
Beachte auch, dass du mehr als einfaches DoubleBuffer = true brauchst... Siehe Konstruktor 😉
Lg Marc
alles klar probier das gleich ma aus thx ^^
@xxMUROxx na mit
myBuffer.Graphics.DrawImage(Image.FromFile(pfad + "Schlafzimmer2.jpg"), 0, 0, 1024, 768);
hab ich nich extra ein graphics erzeugt sondern gleich die Funktion benutzt
Hallo,
xxMUROxx meinte mit Bild neu erstellen:
myBuffer.Graphics.DrawImage(Image.FromFile(pfad + "Schlafzimmer2.jpg"), 0, 0, 1024, 768);
fz
"We better hurry up and start coding, there are going to be a lot of bugs to fix."
@fz7090, Genau das meinte ich, eine Variable anlegen und die als Parameter der DrawImage Methode übergeben, denn wie du es machst und wie
Das liegt z.B. auch daran, dass du bei jedem Update das Bild neu lädst. auch sagte ist dies dein Problem Unperformant, denn die Disk-Zugriffe sind lokal gesehen (d.h. online Inhalte ausgenommen) die langsamste Zugriffsart.
Gruß
Michael