Bewegen eines Graphic-Objektes



  • Hallo Zusammen,
    da bin ich weider mit einem neuen Problem. Ich habe eine PictureBox auf der ich ein Graphic-Object erzeuge

    public Bitmap bm = null;
    public Graphics gr = null;
    
    private void pictureBox_Click(object sender, System.EventArgs e)
    {
    if(bm == null)
      bm = new Bitmap(@"E:\Projekt\VC#\Test\Symbole\AVZFW.ICO");
    if(gr == null)
      gr = pictureBoxKarte.CreateGraphics();
    gr.DrawImage(bm, x, 100);
    x += 50;
    if(gr != null)
    {
      gr.Dispose();
      gr = null;
    }
    }
    

    Bei jedem Click wird ein neues Symbol an einer neuen Stelle erzeugt.

    Mein Problem ist, daß das alte Symbol aber erhalten bleibt. Verwende ich Refresh erscheint das Symbol nur kurz und ist wieder verschwunden. Wie kann ich das alte Symbol löschen und dann nur das neue anzeigen?

    Danke
    Evi48



  • Hi evi,

    zunächst muss ich dir mitteilen, dass ich bei jeder neuen Sprache, die
    ich gelernt habe, immer sehr früh irgendein Grafik-Zeug gemacht habe und
    nie wurde ich so enttäuscht wie bei C#!
    Egal, zu deinem Problem:

    I.A. macht man das so, dass man sich:
    - die 'alte' Region merkt
    - InvalidateRect auf die 'alte' Region
    - Refresh (zeichnet dann nur dass Rechteck neu)
    - neue Position zeichen

    Bei dir ist wohl die Reihenfoge durcheinander geraten
    (erst gemalt, dann refreshed).

    P.S.: evtl. musst du eine Ableitung von PictureBox verwenden, da
    sonst bei Refresh der Hintergrund gelöscht wird und ein flackern entsteht.
    In der Ableitung dann OnEraseBackground (unsicher, ob die so heisst)
    leer überschreiben.

    Jockel



  • Hallo Jockelx,
    ja ich sitze wohl schon zu lange vor dem Bildschirm. Refresh kommt natürlich vor dem DrawImage und dann sieht es auch ohne weitere Klimmzüge schon recht gut aus.

    Aber leider nur auf den ersten Blick. Die PictureBox auf der ich das Graphic-Object erzeuge muß leider sehr groß sein. Daher hat die Form Scrollbars. Wenn ich die benutze kann ich kein weiteres Graphic-Object anzeugen.

    So ein Ereignis habe ich leider nicht gefunden. Genauso ärgert mich, daß Graphics eine versiegelte Klasse ist und ich nicht von ihr erben kann.

    Wie bekomme ich nach dem Verschieben mein Symbol wieder?

    Evi48



  • Jetzt sehe ich erstmal dein Hauptproblem:

    Das Zeichnen von deinem Icon muss natürlich in der Paint-Methode
    von der PictureBox passieren, sonst übermalt die ja alles.
    In OnClick merkst du dir nur die Koordinaten, wo gezeichnet werden soll.

    Jockel



  • Ja da hast du recht und ich habe das auch versucht. Doch auch hier verschwindet nach dem Bewegen des Scrollbar mein Symbol.

    Evi48



  • Jetzt brauch ich doch mal ein bisschen Code.
    Zeichnest du den Hintergrund selber, also irgendwie so:

    OnScrollbarValueChanged -> RefreshPictureBox -> OnPaintPictureBox ?

    Zeig mal die wesentlichen Stellen.



  • Bei dem Click erzeuge ich ein Graphic-Objekt "gr" und nach dem Refresh zeichne ich das Object in der PictureBox.

    Die geremte Version ist fast gleich doch nutzt diese das Ereignis Paint von PictureBox welches mit Invalidate erzwungen wird.

    private void pictureBox_Click(object sender, System.EventArgs e)
    {
    if(bm == null)
      bm = new Bitmap(@"E:\Projekt\VC#\Test\Symbole\AVZFW.ICO");
    if(gr == null)
      gr = pictureBox.CreateGraphics();
    pictureBox.Refresh();
    gr.DrawImage(bm, Ost, 100);
    //gr = Graphics.FromImage(bm);
    //pictureBox.Invalidate();
    Ost += 50;
    
    if(gr != null)
    {
      gr.Dispose();
      gr = null;
    }
    }
    

    Das Ereignis Paint von PictureBox

    private void pictureBox_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
    {
    if(bm != null)
    {
      //e.Graphics.DrawImage(bm,Ost,50);
      Ost += 50;
    }
    }
    

    Das ist der bisherige Code mit dem ich ein Graphic-Object erzeuge und auch in der PictureBox anzeigen kann, wieder neu an einer anderen Stelle erzeugen kann und das vorherige Symbol wird gelöscht. Das funktioniert aber nur so lange wie ich die Finger vom Scrollbar lasse. Habe ich ihn einmal bewegt kann ich das Symbol nicht mehr erzeugen.

    Evi48



  • Oh, muß mich leider für heute abmelden sonst gibt es Ärger. Für heute Danke bis morgen

    Evi48



  • Hallo guten Morgen,
    wie immer sitzt das Problem vor dem Rechner.

    Das EreignisHandle "pictureBox_Paint" wird sehr oft aufgerufen vor allem wenn die Scrollbar benutzt wird. Wie aus dem Code zu sehen ist addiere ich auf Ost immer 50 und das Symbol bekommt einen derart großen Wert, dass es nicht mehr im Fenster dargestellt werden kann.

    Danke für deine Hilfe und Entschuldigung

    Evi48


Anmelden zum Antworten