pcp Color-Generator v1.1

  • An einer GUI zu schreiben erfordert immer etwas Geschick.
    -Ist die Ausrichtung der einzelnen Elemente in ordnung?
    -Kann ich mit Hilfe eines zusätzlichen Buttons die Arbeit des Users erleichtern?
    -Ist die Farbgebung korrekt? Oder will ich ein anderes Rot benutzen?
    usw.

    Gerade bei der Farbgebung, wenn ich nicht gerade mit Hintergrundbildern arbeite,
    ist es für mich sehr umständlich den Farbton zu ermitteln (und dann noch in Heximal ;))
    den ich für meine Arbeit benötige.

    Deshalb habe ich den Color-Generator geschrieben, der mir mittels bereits vorhandener AutoIt
    Funktion "chooseColor" eine Farbtabelle zum aussuchen der richtigen Farbe bereitstellt.
    Zusätzlich bietet das Tool noch eine Pipette, die es mir erlaubt, per Mauscursor den exakten
    Farbwert einer beispielsweise Desktopanwendung herauszufiltern.


    Für eine Einbindung in Scite4AutoIt3 gibts noch eine Setupdatei obendrauf, die das Tool
    direkt in die Scite Direktorie kopiert und die au3.properties aktualisiert, sodas der
    Generator über die Menü-Leiste "Tools" (wahlweise auch mit "Alt+c") abrufbar ist.

    Spoiler anzeigen
    [autoit]


    ;
    ;===============================================================================
    ; Includes
    ;===============================================================================
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <EditConstants.au3>
    #include <Misc.au3>
    ;
    ;===============================================================================
    ; AutoItSetOption
    ;===============================================================================
    Opt('MustDeclareVars', 1)
    Opt("GUIOnEventMode", 1)
    ;
    ;===============================================================================
    ; Declaring Variables
    ;===============================================================================
    Global Const $S_OPTION_INI_DIR = @ScriptDir & "\options.ini"
    ; GUI:
    Global $h_Whndl
    Global $h_ColorExample_Graph
    Global $h_ColorCode_Input
    Global $h_OK_Button
    Global $h_Choose_Button
    Global $h_Pipette_Button
    Global $h_Clip_CheckBox
    Global $h_ContextMenu
    Global $H_InfoItem_CM
    ; Options:
    Global $ai_Ini
    Global $ai_WinPos[2]
    Global $s_CBS
    ;
    ;===============================================================================
    ; Start Program
    ;===============================================================================
    _main()
    ;
    ;===============================================================================
    ; Functions
    ;===============================================================================
    Func _main()
    $ai_Ini = _setIni(@ScriptDir & "\options.ini")

    _buildMainGUI()
    HotKeySet($ai_Ini[0][1], "_setPippeteOnHotkey")
    While 1
    $ai_WinPos = WinGetPos($h_Whndl)
    $s_CBS = GUICtrlRead($h_Clip_CheckBox)
    Sleep(50)
    WEnd
    EndFunc ;==>_main
    ;
    Func OnAutoItStart()
    _checkIfProgAllreadyExist('pcp Color-Generator - xghjz', 'An instance of pcp Color-Generator is allready running!'); Prüft, ob das Programm schon läuft
    EndFunc ;==>OnAutoItStart
    ;
    ;===============================================================================
    ; Function Name: _setColor
    ; Description: Setzt den zurückgegebenen Farbwert in die GUI
    ;
    ; Syntax: _setColor($i_ColorCode)
    ;
    ; Parameter: $i_ColorCode - Der zu übergebene Farb-Code
    ;
    ;
    ; Author(s): Patric Pendelin <[email='patric.pendelin@gmx.de'][/email]>
    ;===============================================================================
    Func _setColor($i_ColorCode)
    GUICtrlSetData($h_ColorCode_Input, $i_ColorCode)
    GUICtrlSetBkColor($h_ColorExample_Graph, $i_ColorCode)
    If GUICtrlRead($h_Clip_CheckBox) = 1 Then ClipPut($i_ColorCode)
    EndFunc ;==>_setColor
    ;
    ;===============================================================================
    ; Function Name: _getChooseColor
    ; Description: Setzt die "_ChooseColor" Funktion und übergibt den "RGB hex" Code in die "$h_ColorCode_Input"
    ;
    ; Syntax: _getChooseColor()
    ;
    ;
    ; Return Value(s): On Success - Return 1
    ; On Failure - @error
    ;
    ; Author(s): Patric Pendelin <[email='patric.pendelin@gmx.de'][/email]>
    ;===============================================================================
    Func _getChooseColor()
    Local $i_ColorCode
    ;
    $i_ColorCode = _ChooseColor(2, 255, 2, $h_Whndl)
    If Not @error Then
    _setColor($i_ColorCode)
    Return 1
    EndIf
    EndFunc ;==>_getChooseColor
    ;
    ;===============================================================================
    ; Function Name: _setPipette
    ; Description: Überprüft den Farb-Code, auf den der Maus-Cursor zeigt und übergibt den "RGB hex" Code in die "$h_ColorCode_Input"
    ;
    ; Syntax: _setPipette()
    ;
    ;
    ; Author(s): Patric Pendelin <[email='patric.pendelin@gmx.de'][/email]>
    ;===============================================================================
    Func _setPipette()
    Sleep(200)
    Local $i_ColorCode
    Local $h_Dll
    Local $ai_MousePos
    ;
    $h_Dll = DllOpen("user32.dll")
    While 1
    $ai_MousePos = MouseGetPos()
    $i_ColorCode = '0x' & Hex(PixelGetColor($ai_MousePos[0], $ai_MousePos[1]), 6)
    _setColor($i_ColorCode)
    ;
    ; Mouse Pressed Check
    If _IsPressed("01", $h_Dll) Then
    HotKeySet($ai_Ini[0][1], "_setPippeteOnHotkey")
    ExitLoop
    ElseIf _IsPressed("72", $h_Dll) Then; 72 = F3
    HotKeySet($ai_Ini[0][1], "_setPippeteOnHotkey")
    ExitLoop
    EndIf
    Sleep(40)
    WEnd
    DllClose($h_Dll)
    EndFunc ;==>_setPipette
    ;
    Func _setPippeteOnHotkey()
    HotKeySet($ai_Ini[0][1], "blankFunc")
    _setPipette()
    EndFunc ;==>_setPippeteOnHotkey
    ;
    Func blankFunc()
    Return 1
    EndFunc ;==>blankFunc
    ;
    ;===============================================================================
    ; Function Name: _checkIfProgAllreadyExist
    ; Description: Prüft ob das Programm bereits läuft indem der Titel des AutoIt-Fensters verglichen wird.
    ; Bei einer übereinstimmung gibt es eine MessageBox aus und schließt das Programm.
    ;
    ; Syntax: _checkIfProgAllreadyExist($s_Au3WinTitle, $s_Text)
    ;
    ; Parameter: $s_Au3WinTitle - Der Titel des AutoIt-Fensters
    ; $s_Text - Der Text der MessageBox
    ;
    ;
    ; Author(s): Markus Egert
    ; Patric Pendelin <[email='patric.pendelin@gmx.de'][/email]>
    ;===============================================================================
    Func _checkIfProgAllreadyExist($s_Au3WinTitle, $s_Text)
    If WinExists($s_Au3WinTitle) Then
    MsgBox(262144 + 48, 'Error', $s_Text)
    Exit
    EndIf
    AutoItWinSetTitle($s_Au3WinTitle)
    EndFunc ;==>_checkIfProgAllreadyExist
    ;===============================================================================
    ; Function Name: _getIni
    ; Description:
    ;
    ; Syntax: _getIni($s_Path)
    ;
    ; Parameter: $s_Path - Der Pfad zur INI-Datei
    ;
    ; Return Value(s): On Success -
    ; On Failure - @error = 1
    ;
    ;
    ; Author(s): Patric Pendelin <[email='patric.pendelin@gmx.de'][/email]>
    ;===============================================================================
    Func _getIni($s_Path)
    Local $ai_Ini[4][2]
    ;
    If Not FileExists($s_Path) Then Return 1
    ;
    $ai_Ini[0][0] = "hotkey"
    $ai_Ini[0][1] = IniRead($s_Path, "option", "hotkey", "")
    $ai_Ini[1][0] = "toclipboard"
    $ai_Ini[1][1] = IniRead($s_Path, "option", "toclipboard", "")
    $ai_Ini[2][0] = "y"
    $ai_Ini[2][1] = IniRead($s_Path, "coord", "y", "")
    $ai_Ini[3][0] = "x"
    $ai_Ini[3][1] = IniRead($s_Path, "coord", "x", "")

    ;
    Return $ai_Ini
    EndFunc ;==>_getIni
    Func _setIni($s_Path)
    Local $ai_Ini = _getIni($s_Path)
    If Not IsArray($ai_Ini) Then
    FileWrite($s_Path, "")
    IniWrite($s_Path, "option", "hotkey", "{F3}")
    IniWrite($s_Path, "option", "toclipboard", 1)
    IniWrite($s_Path, "coord", "x", "150")
    IniWrite($s_Path, "coord", "y", "200")
    $ai_Ini = _getIni($s_Path)
    Return $ai_Ini
    Else
    Return $ai_Ini
    EndIf

    EndFunc ;==>_setIni
    ;
    ; OnAutoItEnd:
    Func OnAutoItExit()
    IniWrite($S_OPTION_INI_DIR, "coord", "x", $ai_WinPos[0])
    IniWrite($S_OPTION_INI_DIR, "coord", "y", $ai_WinPos[1])
    IniWrite($S_OPTION_INI_DIR, "option", "toclipboard", $s_CBS)
    EndFunc ;==>OnAutoItExit
    ;===============================================================================
    ; GUI
    ;===============================================================================
    Func _buildMainGUI()
    $h_Whndl = GUICreate("Color-Generator", 240, 250, $ai_Ini[3][1], $ai_Ini[2][1])
    ;GUISetBkColor(0xFFFFFF)
    ;
    ; Layout Header;
    GUICtrlCreateGraphic(0, 0, 240, 40)
    GUICtrlSetBkColor(-1, 0xF4F4F4)
    ; Border 1
    GUICtrlCreateGraphic(0, 41, 240, 1)
    GUICtrlSetColor(-1, 0xB4B4B4)
    ; Border 2
    GUICtrlCreateGraphic(0, 42, 240, 1)
    GUICtrlSetColor(-1, 0xE1E1E1)
    ;
    ; Überschrift:
    GUICtrlCreateLabel("Color-Generator", 0, 7, 240, 26, $SS_CENTER)
    GUICtrlSetFont(-1, 15, 400, 0, "Verdana")
    GUICtrlSetColor(-1, 0x0046D5)
    GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
    GUICtrlCreateLabel("Color-Generator", 1, 8, 240, 26, $SS_CENTER)
    GUICtrlSetFont(-1, 15, 400, 0, "Verdana")
    GUICtrlSetColor(-1, 0xB4B4B4)
    GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
    ;
    ; Farb-Code:
    GUICtrlCreateGroup("Color-Code:", 20, 50, 200, 55)
    $h_ColorCode_Input = GUICtrlCreateInput("", 55, 70, 80, 23, BitOR($ES_CENTER, $ES_AUTOHSCROLL))
    GUICtrlSetLimit(-1, 8)
    GUICtrlSetFont(-1, 10, 400, 0, "Verdana")
    $h_OK_Button = GUICtrlCreateButton("OK", 145, 70, 40, 22)
    GUICtrlSetState(-1, $GUI_DEFBUTTON)
    ;
    ; Farbausgabe:
    GUICtrlCreateGroup("Color:", 20, 110, 200, 70)
    $h_ColorExample_Graph = GUICtrlCreateGraphic(35, 128, 170, 40)
    GUICtrlSetBkColor(-1, 0xF4F4F4)
    GUICtrlSetColor(-1, 0xD6D5D9)
    ;GUICtrlCreateGraphic(34, 122, 172, 42)
    GUICtrlCreateGraphic(33, 126, 174, 44)
    GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
    GUICtrlSetColor(-1, 0xD6D5D9)
    ;
    ; Buttons:
    $h_Choose_Button = GUICtrlCreateButton("Choose", 30, 193, 81, 25)
    $h_Pipette_Button = GUICtrlCreateButton("Pipette", 130, 193, 81, 25)
    ;
    ; Checkbox
    $h_Clip_CheckBox = GUICtrlCreateCheckbox("To Clipboard", 8, 228, 90, 20)
    ;GUICtrlSetBkColor(-1, 0xF4F4F4)
    If $ai_Ini[1][1] = 1 Then
    GUICtrlSetState(-1, $GUI_CHECKED)
    Else
    GUICtrlSetState(-1, $GUI_UNCHECKED)
    EndIf
    ;
    ; ContextMenü:
    Global $h_ContextMenu = GUICtrlCreateContextMenu()
    Global $H_InfoItem_CM = GUICtrlCreateMenuItem("Info", $h_ContextMenu)
    GUISetState(@SW_SHOW)
    ;
    WinSetOnTop($h_Whndl, "", 1)
    ;
    ; OnEvents:
    GUISetOnEvent($GUI_EVENT_CLOSE, "_onEvent_Special")
    GUICtrlSetOnEvent($h_OK_Button, "_onEvent_OK_Button")
    GUICtrlSetOnEvent($h_Choose_Button, "_onEvent_Choose_Button")
    GUICtrlSetOnEvent($h_Pipette_Button, "_onEvent_Pipette_Button")
    GUICtrlSetOnEvent($H_InfoItem_CM, "_onEvent_InfoItem_CM")
    ;
    EndFunc ;==>_buildMainGUI
    ;
    ;===============================================================================
    ; OnEvent Functions
    ;===============================================================================
    Func _onEvent_OK_Button()
    Local $i_ColorCode = GUICtrlRead($h_ColorCode_Input)
    If $i_ColorCode Then
    If (StringInStr($i_ColorCode, "0x") <> 0) Or (StringInStr($i_ColorCode, "0X") <> 0) Then
    _setColor($i_ColorCode)
    ElseIf StringInStr($i_ColorCode, "#") == 1 Then
    _setColor(StringReplace($i_ColorCode, "#", "0x"))
    Else
    _setColor("0x" & $i_ColorCode)
    EndIf
    EndIf
    EndFunc ;==>_onEvent_OK_Button
    ;
    Func _onEvent_Choose_Button()
    _getChooseColor()
    EndFunc ;==>_onEvent_Choose_Button
    ;
    Func _onEvent_Pipette_Button()
    _setPipette()
    EndFunc ;==>_onEvent_Pipette_Button
    ;
    Func _onEvent_Special()
    Select
    Case @GUI_CtrlId = $GUI_EVENT_CLOSE
    Exit
    EndSelect
    EndFunc ;==>_onEvent_Special
    ;
    Func _onEvent_InfoItem_CM()
    MsgBox(262144, "Info", 'Color-Generator ' & 'v' & FileGetVersion(@ScriptFullPath) & @CRLF & @CRLF & _
    '2008 by Patric Pendelin' & @CRLF & @CRLF & _
    '*********************************************************' & @CRLF & @CRLF & @CRLF & _
    'Anleitung:' & @CRLF & @CRLF & _
    'Choose:' & @CRLF & _
    'Mit dem Button "Choose" öffnet sich eine Farben Dialog Box' & @CRLF & _
    'mit der man eine Farbe auwählen kann.' & @CRLF & @CRLF & _
    'Pipette:' & @CRLF & _
    'Die Pipette lässt sich mit dem Pipette-Button aktivieren.' & @CRLF & _
    'Wahlweise kann man auch die "F3" Taste benutzen.' & @CRLF & @CRLF & _
    'Zeigt die Maus über eine gewünschten Farbe kann mit' & @CRLF & _
    'dem erneuten drücken von "F3"(zusätzlich zur linken Maus-Taste)' & @CRLF & _
    'die Pipette angehalten werden.')
    EndFunc ;==>_onEvent_InfoItem_CM

    [/autoit]


    Exe und Source liegen der Zip Datei bei.
    autoit.de/wcf/attachment/2464/

    autoit.de/wcf/attachment/2465/

    2 Mal editiert, zuletzt von prizma (15. Juni 2008 um 14:34)

  • Ich find es OK, nur bei der Pipette auch noch nen Hotkey zum Beende, dass man auf von klickbaren Elementen die Farbe nehmen kann :)

  • Du meinst wenn der Cursor über dem Element liegt, dann einen Hotkey drücken um den Farbwert zu ermitteln?

  • Nicht ganz. Die Pipette wird ja durch Klick abgebrochen. Dazu sollte noch ein Abbruch-Hotkey gesetzt werden, z.B. so:

    Spoiler anzeigen
    [autoit]

    ;===============================================================================
    ; Function Name: _setPipette
    ; Description: Überprüft den Farb-Code, auf den der Maus-Cursor zeigt und übergibt den "RGB hex" Code in die "$h_ColorCode_Input"
    ;
    ; Syntax: _setPipette()
    ;
    ;
    ; Author(s): Patric Pendelin <[email='patricpendelin@gmx.de'][/email]>
    ;===============================================================================
    Func _setPipette()
    Local $i_ColorCode
    Local $h_Dll
    Local $ai_MousePos
    Global $PIPETTE_STOP = False
    HotKeySet("{F3}","_StopPipette")
    ;
    $h_Dll = DllOpen("user32.dll")
    While 1
    $ai_MousePos = MouseGetPos()
    $i_ColorCode = '0x' & Hex(PixelGetColor($ai_MousePos[0], $ai_MousePos[1]), 6)
    _setColor($i_ColorCode)
    ;
    ; Mouse Pressed Check
    If _IsPressed("01", $h_Dll) Or $PIPETTE_STOP Then
    ExitLoop
    EndIf
    Sleep(40)
    WEnd
    DllClose($h_Dll)
    EndFunc ;==>_setPipette
    Func _StopPipette()
    HotKeySet("{F3}")
    Global $PIPETTE_STOP = True
    EndFunc

    [/autoit]
  • Ja OK finde ich gut.
    Mit nochmaligen drücken von "F3" könnte die Pipette ja sogar weiterlaufen.
    Ich werde das berücksichtigen und demnächst Aktualisieren.

    Patric

  • Hi,
    vielleicht kannstes ja einfach so machen, dass man die Pipette ziehen kann, wie beim AUtoIt Window Info.
    Und vielleicht noch, dass man den Farbcode unten eingeben kann, und die Farbe dann ausgegeben wird.

  • pcp Color-Generator v1.1


    In der überarbeiteten Version habe ich einige Anregungen umgesetzt.
    So lässt sich die Pipette auch wahlweise mit der "F3" Taste benutzen und starten.
    Auch erlaubt jetzt das Input-Feld in der "Color-Code Group" das Einfügen von
    eigenen Farb-Codes, die mit dem OK-Button ausgewertet werden.

  • Super Arbeit ^^

    Verbesserungsvorschlag:
    Du könntest ja machen, dass das Programm bei einem Tastendruck den aktuellen Wert in eine Ini Datei schreibt.

    Beispiel:

    [autoit]


    ;===============================================================================
    ; HotkeySet
    ;===============================================================================
    HotKeySet("{F2}", "_IniWriteWert")
    ;
    ;===============================================================================
    ; Declaring Variables
    ;===============================================================================
    ; Werte
    Global $Write_Wert = 0
    ;
    ;===============================================================================
    ; HotKeySet Funktions
    ;===============================================================================
    Func _IniWriteWert()
    $Write_Wert = $Write_Wert + 1
    IniWrite("farben.ini", "Farben", "Farbe" & $Write_Wert, GUICtrlRead($h_ColorCode_Input))
    EndFunc ;==>_IniWriteWert
    ;

    [/autoit]

    PS: Ich habs schon eingebaut ^^

    Zitat

    [Heute, 11:39] Raupi: Soll ich es dir machen?
    [Heute, 11:47] BugFix: "Soll ich es dir machen? " - also Raupi !! bitte nicht so öffentlich :rofl:

    Zitat

    [Heute, 11:51] BugFix: und ich werde es mir jetzt machen - das Mittagessen :P

    AMsg UDF v1.00.00 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII 100%
    OwnStyle UDF Version 1.10.00 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII 100%

  • Das is ja n cooles ding jetzt kann ich mal farbcodes ausprobieren und den besten hernehmen

  • Was hat das den damit zu tun :D

    Aber ich finde die Idee trotzdem gut, kann ich gut gebracuhen :P