• Offizieller Beitrag

    Und noch eine UDF! :)

    Wieder ein Control-Element. Ich hatte schon mal ein Script fuer eine Bewertung mit Sternen geschrieben, aber das war halt keine universelle UDF.

    Hier ist jetzt die UDF, auch wieder mit WindowProc! Man kann beliebig viele von den "Stern-Bewertungen" erstellen. Im Beispielscript habe ich mal 10 Stück erstellt. Das soll eine Art von Film-Bewertung darstellen.

    Hier mal der Screenshot dazu:

    Screenshot.png

    Die Bewertung findet mit der linken Maustaste statt. Wenn man auf einen der fünf Sterne klickt, wird die Bewertung entsprechend angezeigt. Mit der rechten Maustaste kann man auf Null Sterne zurückkehren. Für die Film-Bewertung könnte das heißen, dass man den Film noch nicht gesehen hat.

    Update v1.1.0.0 (24.07.2018):

    - Ich habe die UDF komplett umgeschrieben. Ich habe die Vorgehensweise von chesstiger übernommen. Dadurch kann man die Anzahl der Sterne mit GuiCtrlSetData setzen und auslesen mit GuiCtrlRead. Außerdem spart man sich das globale Array und es sind viel weniger Funktionen. Vielen Dank, chesstiger!

  • Hi,

    ich hätte da noch ein oder zwei Tipps, du entdeckst ja gerade fleißig, wie das Subclassing mit Win32 funktioniert. :D

    Also... Erstens: Im Moment bewahrst du die ganzen Daten eines Controls in einem globalen Array auf. Das geht zwar - muss aber nicht sein. Die WinAPI bietet extra Mechanismen für das "Mitschleppen" von Benutzerdaten an. Am einfachsten und elegantesten geht das direkt in der Fenstertabelle mittels SetWindowLong (bzw. SetWindowLongPtr !!!) in dem Feld GWL_USERDATA, da kannst du exakt einen 32/64 bit Wert hinterlegen. Einfach alle relevanten Daten in eine C-Struktur packen (Speicher mit MemVirtualAlloc alloziieren) und dann den Pointer in die Fenstertabelle schreiben. Dann später in der WndProc auslesen, fertig. Du hast immer die instanzspezifischen Daten, ganz ohne globales Array. Ansonsten könnte man auch eine Fenstereigenschaft verwenden, siehe SetProp. Das ist aber ehrlich gesagt auch eher eine Stilsache.

    Der zweite Verbesserungsvorschlag betrifft die WndProc an sich. Du hast ja zwei Funktionen zum Lesen/Schreiben der Sterne-Anzahl geschrieben. Kann man so machen - ist aber nicht die feine englische Art. Denn AutoIt hat ja schon zwei Funktionen dafür, nämlich GUICtrlRead und GUICtrlSetData. DIese beiden Funktionen "zaubern" auch nicht, sie senden im Hintergrund einfach die entsprechenden Window Messages an das jeweilige Control. Nämlich WM_SETTEXT, WM_GETTEXT und WM_GETTEXTLENGTH (zur Bestimmung der Buffergröße). Verarbeitest du diese Nachrichten in deiner WndProc korrekt, dann kannst du dir die beiden extra Funktionen sparen. Wirkt außerdem eleganter, wenn sich das Control wie ein natives Kontrollelement ansprechen lässt.

    All das habe ich nebenbei auch in meinem letzten User Control umgesetzt, wenn du mal schauen möchtest: GuiCtrlColorChooser - Moderne Farbauswahl (Version 1.0)

    (Achtung, der Fix aus Beitrag 6 ist für Win10 nötig. Muss ich mal updaten!)

    Ansonsten: Sehr schön gemacht. Allemal schicker als eine ComboList. :thumbup: