GUI / Fenster Größenänderung - wie geht das mit GDIPlus Elementen?

  • Neulich bin ich über @Oscar 's FotoSort gestolpert (Weil das Thema wieder gepuscht wurde).

    Das Programm war für mich eine Offenbarung, genau so ein Tool fehlte mir.
    Ein paar Dinge hätte ich schon gern anders. Unter anderem war mit die Darstellung bei HD-Auflösung zu klein (Vollbild wollte ich nicht) und zu wenig Pfade. Ich will den Platz besser ausnutzen.

    Also habe ich mich an eine alternative Version gewagt.
    Unter anderem wollte ich etwas schaffen was ich noch nie hinbekommen habe: Eine GUI/Form die ich in der Größe ändern kann.

    Die GUI an sich funktioniert, auch das hinzufügen weiterer Dateipfade (und das entfernen dieser wenn der Platz nicht mehr reicht).

    Aber wie macht man das mit dem Bild-Preview welches per GDIPlus erstellt wird? Ich hatte schon verstanden das dieses ja sowieso bei der kleinsten Änderung wieder neu gezeichnet werden muss (WM_PAINT),
    ergo dachte ich das es nach Änderung der GUI-Größe dann halt auch einfach in einer neuen Größe gezeichnet wird.

    Problem Nr. 1: Wenn ich die GUI größer ziehe (nicht maximieren) wird zwar auch die Preview größer. Aber nur bis zu einem Maximalwert, dann hört es auf. Von der Größe her könnte das die Anfangsgröße der GUI sein.
    Ein Bild dazu:

    Spoiler anzeigen

    Problem Nr. 2: Wenn ich die GUI wieder verkleinere bleiben gezeichnete Ränder zurück ... was mache ich am besten dagegen? WM_PAINT zeichnet doch sowieso schon die ganze GUI/Form neu, oder?
    Hier ein Bild:

    Spoiler anzeigen


    Hier der Quelltext:

    Und als Datei: FotoSortNeu.au3

    BLinz

    • Offizieller Beitrag

    Die GUI an sich funktioniert, auch das hinzufügen weiterer Dateipfade (und das entfernen dieser wenn der Platz nicht mehr reicht).

    Aber wie macht man das mit dem Bild-Preview welches per GDIPlus erstellt wird? Ich hatte schon verstanden das dieses ja sowieso bei der kleinsten Änderung wieder neu gezeichnet werden muss (WM_PAINT),
    ergo dachte ich das es nach Änderung der GUI-Größe dann halt auch einfach in einer neuen Größe gezeichnet wird.

    So wie ich das damals gemacht habe, würde ich das heute nicht mehr machen. Vor allem nicht, wenn die GUI größenveränderbar sein soll.
    Eine größenveränderbare GUI ist sowieso schon eine große Aufgabe und wenn Du dann auch noch die Windows-DPI mit einbeziehen willst... :rolleyes:
    Jedenfalls musst Du das GDI+ Previewbild nicht einfach nur löschen und dann neu erstellen. Du musst das neuzeichnen selbst vornehmen.
    Das heißt, dass Du zuerst den alten Inhalt löschen musst (mit der Hintergrundfarbe übermalen). Erst dann kannst Du die Bitmap und Graphic löschen und neu erstellen.

    Man kann das Ganze aber auch Windwos überlassen, indem man ein Pic-Control verwendet und die GDI+ Bitmap in eine HBITMAP (GDI ohne Plus) wandelt und dann an das Pic-Control sendet.
    Allerdings wird dann das Breiten-/Höhenverhältnis des angezeigten Bildes nicht mehr eingehalten. Will man das beibehalten, dann muss man per WM_SIZE das Bild neu berechnen.
    Ich habe mal ein kleines Beispielscript geschrieben:

    Spoiler anzeigen
  • Irgendwie habe ich befürchtet das es so kompliziert wird. Zum einen weil es von dir dann bestimmt gleich so gemacht worden wäre.
    Zum anderen weil ich praktisch nichts dazu gefunden habe.


    Das heißt, dass Du zuerst den alten Inhalt löschen musst (mit der Hintergrundfarbe übermalen). Erst dann kannst Du die Bitmap und Graphic löschen und neu erstellen.

    Mhh, aber beim verkleinern liegen ja an der zu übermalenden Stellen wieder andere Controls, oder?


    Und das Problem beim vergrößern? Warum ist da plötzlich "Ende" ?


    Ich schaue mir mal dein Beispiel an (und lerne)

    Das Pic-Control wäre natürlich sehr einfach, das kann ich genauso anheften wie alles andere.
    Das Bild-Seitenverhältnis könnte ich auch dadurch anpassen das ich per GUICtrlSetPos() oder ControlMove() das Pic-Control anpasse.
    Sieht dann natürlich komisch aus, ich meine ich hatte das bei anderen so schon mal gesehen.
    Ich könnte darunter ja wieder ein 2. Control als Hintergrund setzen.

    Danke!