GuiCtrlColorChooser - Moderne Farbauswahl (Version 1.0)

  • Hi,

    ich habe mich doch nochmal dazu durchgerungen, in einer Windows-VM etwas umfangreicheres in AutoIt zu programmieren. Dabei herausgekommen ist ein modern gestaltetes Farbauswahl-Control:

    Wie man schon sieht, basiert das ganze auf einem Farbring, aus dem per Mausklick eine Farbe gewählt werden kann. Das Control ist selbstverständlich an die AutoIt-Umgebung angepasst und reagiert entsprechend auf diverse GUICtrl...-Befehle (GUICtrlDelete, GUICtrlSetData, GUICtrlRead, GUICtrlSetStyle). Daher gibt es auch nur eine Funktion, _GuiCtrlColorChooser_Create (Doku im ZIP-Paket). Erwähnenswert ist hier vielleicht noch, dass als interne Datenstruktur keine globale AutoIt-Variable genutzt wird, sondern ausschließlich C-Structs im USERDATA-Feld des Controls.

    Es stehen drei Styles zur Verfügung:

    • $CCS_JUSTCOLOR: Der Kreis in der Mitte signalisiert lediglich die Farbe.
    • $CCS_HEXCODE: Im Kreis in der Mitte erscheint bei einer Farbauswahl der Hex-Farbcode (auf dem Screenshot rechts).
    • $CCS_COLORNAME: Im Kreis in der Mitte erscheint der Farbname auf Englisch, basierend auf den Daten von NTC.js von Chirag Mehta.


    $CCS_HEXCODE und $CCS_COLORNAME sind kombinierbar (auf dem Screenshot links).

    Die UDF steht unter der Mozilla Public License Version 2.0.

    Vielleicht kann ja jemand was damit anfangen. ^^

    Grüße!

  • Und die Kombination der beiden Styles funktioniert? :huh:

    Der Fehler ist bei mir (Windows 7, trotz GUI-Design) nicht nachstellbar... Du nutzt Windows 10, nehme ich an?
    Btw: Unter Debian mit Wine funktioniert gar nichts mit Text richtig, was aber an der fehlenden Dictionary-Klasse liegt. Mehr Möglichkeiten zum Testen habe ich leider nicht.

  • Und die Kombination der beiden Styles funktioniert?

    Nein, auch nicht - mit $CCS_COLORNAME funktioniert bei mir nicht.

    Du nutzt Windows 10, nehme ich an?

    Ja, relevante Infos kannst du dem Bild entnehmen...

    Mehr Möglichkeiten zum Testen habe ich leider nicht.

    Hm, ja ok... ist halt so... brauchst/willst du eine Lizenz für WIN_10? Bei ebay bekommst du die schon für ~ 5 EURO... :D

  • Hi,

    Bei mir läuft das Beispiel unter Win10 sobald ich Zeile 218 durch folgendes ersetze:

    AutoIt
    If $oColors.exists($sHex) Then Return $oColors($sHex);If $oColors.contains($sHex) Then Return $oColors($sHex)

    und "_SendMessage($hWnd, $WM_PAINT)" durch "_WinAPI_RedrawWindow($hWnd)".
    Edit: Denkfehler meinerseits, falsch getestet :/ letzteres ist unnötig.
    ".contains" durch ".exists" zu ersetzten reicht aus.

    Habe es allerdings wie gesagt nur mit der GuiColorChooser Example.au3 ausprobiert.

    mfg
    Zeitriss

    2 Mal editiert, zuletzt von Zeitriss (31. Januar 2017 um 20:29)

  • Bei mir läuft das Beispiel unter Win10 sobald ich Zeile 218 durch folgendes ersetze:

    Jeep - bei mir dann auch!


    $CCS_COLORNAME: Im Kreis in der Mitte erscheint der Farbname auf Englisch, basierend auf den Daten von NTC.js von Chirag Mehta.

    Wenig Sinn macht jedoch, dass ein FarbeName für mehrere FarbWerte steht...

    wobei keiner der Werte auch nur annähernd mit dem in der NTC.js definierten Wert übereinstimmt...

    JavaScript
    ["8B00FF", "Electric Violet"],


    ...und Electric Violet (0x8B00FF) sieht bei mir so aus...
    Electric Violet_3.jpg

    Einmal editiert, zuletzt von Bitnugger (1. Februar 2017 um 08:47)

  • Ah, sehr interessant. Danke, Zeitriss. Mag daran liegen, dass ich zunächst System.Collections.HashMap genutzt habe, wo es ein .Contains gibt. Musste dann aber auf ein Dictionary umschwenken, weil das .Keys-Property nicht richtig funktioniert hat. Vermutlich ist deshalb dann .Contains stehen geblieben. Sehr interessant, dass das unter Windows 7 trotzdem funktioniert.

    @Bitnugger
    Hinsichtlich dessen, dass es 0x1000000 verschiedene Farben (0x000000 - 0xffffff) gibt, hat natürlich nicht jede Farbe einen eigenen Namen. Ich glaube, es sind etwa 1600 Namen hinterlegt.
    Es wird dann immer der Farbname ausgewählt, zu dem rechnerisch die kleinste Differenz besteht. Gerade bei Electric Violett kann diese Differenz schnell recht groß werden, wodurch die Farben dann zwar Electric Violett heißen, aber nicht mehr so aussehen. Dasselbe Problem zeigt die Livedemo von NTC.js aber auch.

  • Ich würde das so handhaben:

    Wenn als Style nur $CCS_COLORNAME angegeben wird,
    dann darf der Farbkreis nur Farben enthalten bzw. zur Auswahl anbieten, für die ein Name definiert wurde. Anderfalls macht der Style absolut keinen Sinn.


    Wenn als Style $CCS_HEXCODE und $CCS_COLORNAME angegeben wird,
    dann darf der Farbkreis alle Farben enthalten bzw. zur Auswahl anbieten und zu dem Hex-Farbcode aber nur dann ein Name anzeigt werden,
    wenn für den ausgewählten Farbwert ein Name definiert wurde.

  • Bei mir (Win 10) schmiert das Skript ohne Errormeldung ab. (also in der Konsole steht nichts, das Fenster friert ein und Windows beschwert sich).

    Als kleiner Tip für die Farbnamen:
    Du benutzt dR^2 + dG^2 + dB^2 um den Abstand zu ermitteln. Der wahrgenommene Abstand ist aber nicht linear in Bezug auf RGB. Du könntest das Farbsystem (ich glaube BugFix hatte eine UDF zur Umrechnung von Farbsystemen) wechseln und in einem Anderen System den Abstand bestimmen, sodass die wahrgenommenen Unterschiede (bei gleichem Farbnamen) minimiert werden.

    lg
    M

  • Ich denke Farbnamen bestimmen immer einen bestimmten Farbbereich

    Ich denke, dass lässt sich interpretieren, wie es einem gerade in den Kram passt.

    Ich formuliere es mal so...

    Die NTC.js bietet ein "n_exactmatch" an... wenn du das als zusätzlichen Style anbietest, hätte ich Verwendung für dein Tool, andernfalls halt nicht.