GDI+ Backbuffer verstehen - Übersicht

  • Hallo Leute,

    Da dies mein erster Post hier im AutoIt.de Forum ist sage ich erst mal hallo!

    Ich beschäftige mich nun schon ca. 4 Monate mit AutoIt und bin nun auf GDI+ gestoßen, da ich eine kleine Anwendung die mit Bildern zu tun hat schreibe.
    Funktioniert alles wunderbar - wäre da nicht dieses flackern.

    Ich verwende jetzt schon einige GDI+ Befehle, wirklich verstehen tu ich sie aber nicht. Habe mich schon durch dutzende Seiten gelesen, auch Tutorials... aber als
    Anfänger versteht man meistens schnell nur noch "Bahnhof".

    Für jemanden der bereits durchblickt und ein Tut schreibt ist es schwierig etwas für Noobs zu erklären da vieles sowieso (seiner Meinung nach) offensichtlich ist.
    Deshalb möchte ich hier für mich selbst (und alle anderen die dies nützlich finden) eine kleine Erklärungs Seite für DAU's (wie mich) erstellen.

    Am besten denke ich ist es für Unwissende wenn man Befehle umschreibt. Das macht vieles leichter.
    Am Beispiel von CentuCore's Code, welcher der kürzeste Code ist den ich bisher gefunden habe versuche ich aufzuschlüsseln

    GDI+ Backbuffer



    Ich verstehe nach wie vor nicht genau den Unterschied zwischen:

    Graphics
    Bitmap
    Image

    Deshalb weis ich auch nicht genau ob meine Anmerkungen im Code korrekt sind.
    Vielleicht hat jemand bessere Umschreibungen, bzw kann den Unterschied zwischen den oben genannten Objekt Typen erklären.
    Ich werde dann diesen Post updaten.


    Danke

    Einmal editiert, zuletzt von Blaxxun (25. Februar 2016 um 01:41)

  • In GDI+ kannst du i.d.R. nur auf den Graphic Handle zeichnen, wobei die Graphics der sichtbarer Bereich ist, also das was du in der GUI siehst.

    Den Graphic Handle kannst du nicht einfach abspeichern, so dass du zuerst in das Bild zeichnest und anschließend das gezeichnete Bild in den Graphic Handle kopierst.
    Somit kannst du einfach das Bild speichern und vermeidest das Flickern.

    Um in das Bild zu zeichnen, benötigst du ein Wrapper Handle -> _GDIPlus_ImageGetGraphicsContext.

    Der Unterschied zwischen Bitmap und Image ist, dass Bitmap eine Untermenge von der Klasse Image ist.

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • Das Flackern kommt daher, dass du das Bild in der Schleife neuzeichnest (_GDIPlus_GraphicsDrawImage($PAPIER, $BILD, 0, 0);). Normal zeichnet man nur einmal, also vor der Schleife.
    Damit das Bild nicht verschwindet, sobald das Fenster mal vom Bildschirm geschoben, minimiert,... wurde muss es neugezeichnet werden. Dafür gibt es eine Message, die Windows sendet, wenn das nötig ist. (Weiß grad nicht genau, welche, glaube $WM_PAINT). Mit GuiRegisterMsg registriert man eine Funktion, die dann aufgerufen wird und das Bild neuzeichnet.
    adurch verschwindet dein Flackern.

  • Danke UEZ.

    Ich habe inzwischen erfolgreich den Backbuffer in mein eigenes Projekt erfolgreich einfügen können.
    Ich habe die Anmerkungen im Code oben ergänzt.

    Hauptschlagwort ist: Graphic Object = SICHTBARER Bereich = PAPIER (Hier kann direkt gezeichnet werden aber SICHTBAR! (Flackern))
    BITMAP = NICHT sichtbarer Bereich > In dem AUCH gezeichnet werden kann aber UNSICHTBAR. --> Wird an Graphic Object übergeben.
    Das Übergeben geschieht mittels "_GDIPlus_ImageGetGraphicsContext" welches MMn....Content genannt werden sollte. (But However)


    Sollte ich hier irgendwo falsch liegen möge man mich bitte unbedingt korrigieren.

    Vielen Dank!

    Einmal editiert, zuletzt von Blaxxun (25. Februar 2016 um 02:02)

  • @Kanashius

    Der Code den ich oben eingeügt habe zeigt eigentlich eine NonFlicker GUI.
    Also einen "So kurz wie möglich Code".

    Aber ich verstehe inzwischen was du sagen willst.

    Ich habe auch in meinem eigenen Code das $WM_PAINT als Funktion verwendet (was hier nicht gezeigt wird) um regelmäßige Updates zu erhalten und um die GUI neu zu zeichnen.
    Vielen Dank :)

    2 Mal editiert, zuletzt von Blaxxun (25. Februar 2016 um 02:22)