none
Graphics nicht gleich Graphics??

    Frage

  • Hallo Forum,

    ich gebe die gleiche Bitmap einmal über die Paint-Funktion und dann über eine Graphics-Funktion aus. Überaschenderweise sind die Ergebnisse nicht gleich, bei der zweiten Ausgabe wird die Bitmap um gut 3-4 Pixel größer dargestellt. Wer kann mir das erklären bzw. helfen das zu verhindern?

    lg heinz

         'PaintEventArgs bezieht sich auf Panel_Spielfeld
    Private Sub AusgabeSpielfeld(ByVal e As PaintEventArgs)
                
                e.Graphics.DrawImage(pulsSymbBM, myPoint)
    End Sub
    
    Private Sub SymbolPulsierenLassen(ByVal skalFaktor As Single, ByVal w As Int16)
    
            '   Erstellt ein Graphics für das Steuerelement 
            Dim g As Graphics = Panel_Spielfeld.CreateGraphics()
            g.DrawImage(pulsSymbBM, myPoint)
            g.Dispose()
     End Sub
    

    Dienstag, 26. Februar 2013 19:50

Antworten

  • Hallo Heinz,

    bei  Invalidate kannst Du den Bereich angeben, der neu gezeichnet werden soll. Der landet im ClipRectangle, was Du wiederum auswerten kannst, um nur einen Teilbereich neu zu zeichnen.

    So funktioniert das unter Windows seit eh und je... siehe Painting and Drawing (Windows)

    Über CreateGraphics erzeugte "Hilfs" Device-Contexte muss man selbst genau so einstellen wie es Windows beim Paint-Ereignis (WM_PAINT) für einen tut.

    Gruß Elmar

    • Als Antwort markiert Heinz9 Dienstag, 26. Februar 2013 20:50
    Dienstag, 26. Februar 2013 20:33
    Beantworter

Alle Antworten

  • Hallo Heinz,

    am Graphics liegt es meist nicht, wenn die Größe nicht passt.

    Eher an den Begrenzungen, denn das Paint Ereignis bezieht sich auf das ClientRectangle des Panels, wobei der z. B. der Rahmen abgezogen wird. Zu sehen auch im PaintEventArgs.ClipRectangle. Bei CreateGraphics wird das interne Fensterhandle verwendet, was nicht immer die gleichen Ergebnisse liefert.

    In Deinem Falle würde ich auf eine eigene Methode verzichten.
    Setze auf Klassenebene die Variablen für das Ereignis und rufe Invalidate für den Spielfeldbereich auf, der hier wohl pulsieren soll. Dann funktionieren auch Dinge wie DoubleBuffered richtig.

    Gruß Elmar

    Dienstag, 26. Februar 2013 20:13
    Beantworter
  • Hallo Elmar,

    das Invalidat des gesamten Spielfeldes will ich ja gerade damit verhindern, weil ich denke das es doch nicht sinnvoll ist wegen der Änderung eines kleinen Bildbereiches (und das 4 x hintereinander) das gesamte Bild (180 Bitmaps) auszugeben.

    Weiters erklärt deine Aussage für mich nicht das die Bitmap als ganzes GRÖßER wird  und nicht nur verschoben ist. 40x40 Pixel sollten auch 40x40 Pixel bleiben.

    Hast du noch andere Lösungen?

    lg heinz

    Dienstag, 26. Februar 2013 20:28
  • Hallo Heinz,

    bei  Invalidate kannst Du den Bereich angeben, der neu gezeichnet werden soll. Der landet im ClipRectangle, was Du wiederum auswerten kannst, um nur einen Teilbereich neu zu zeichnen.

    So funktioniert das unter Windows seit eh und je... siehe Painting and Drawing (Windows)

    Über CreateGraphics erzeugte "Hilfs" Device-Contexte muss man selbst genau so einstellen wie es Windows beim Paint-Ereignis (WM_PAINT) für einen tut.

    Gruß Elmar

    • Als Antwort markiert Heinz9 Dienstag, 26. Februar 2013 20:50
    Dienstag, 26. Februar 2013 20:33
    Beantworter
  • Hallo Elmar,

    ok, ich werde das versuchen (obwohl 40 Pixel, 40 Pixel bleiben sollten), vielen Dank,

    lg heinz

    Dienstag, 26. Februar 2013 20:49
  • Hallo Heinz,

    die 40 Pixel in der Bitmap bleiben, nur das wie und wo gemalt wird, kann sich deutlich unterscheiden.

    Schau Dir mal an: Drawing at Timed Intervals (Windows)

    Das ist "klassisches" Windows API und macht prinzipiell das Gleiche (CreateGraphics ist ein GetDC). Schau Dir an wie viel "Aufstand" gemacht wird, um einen kleinen Stern an eine Stelle zu platzieren - DrawPolyLine entspräche dabei DrawImage.

    Bei Windows Forms "pfuscht" noch GDI+ als Erweiterung dazwischen, auch wenn sie vieles von dort verpackt. So skaliert DrawImage in einigen Konstellationen uvm.

    Korrigieren kann man das alles, nur fehlt dafür bei Dir zu viel vom Kontext um es genau zu bestimmen.

    Tipp am Rande:

    In Graphiken neu zeichnen lassen ohne panel und ohne picturebox hatte ich mal vor längerem am Beispiel von "Schiffe versenken" gezeigt wie man ein Spielfeld aufteilen kann und Teilfelder ansteuern kann. Das Prinzip lässt sich auf eine Vielzahl von Spielen übertragen.

    Gruß Elmar

    Dienstag, 26. Februar 2013 22:01
    Beantworter