Jump to content
argumentum

_ChooseColor() but better

Recommended Posts

..I'm coding the High Contrast theme editor and using the _ChooseColor() I wandered why it does not keep the the custom colors I've added.
Found that adding a static declaration would do it. But why stop there. Why not keep going, So I put this together that is non code braking ( backwards compatible ), to replace the one in <Misc.au3>

_ChooseColor_mod_Example()
Func _ChooseColor_mod_Example()
    Local $aCustColors[17]
    $aCustColors[1] = 0xFF0000
    $aCustColors[16] = 0x0000FF
    $aCustColors = _ChooseColor_mod(2, "0x00ff00", 2, 0, $aCustColors)
    ConsoleWrite(@CRLF & $aCustColors[0] & @CRLF & @CRLF)
    ConsoleWrite(@CRLF & _ChooseColor_mod(2, $aCustColors[0], 2, 0, $aCustColors)[0] & @CRLF & @CRLF)
    ConsoleWrite(@CRLF & _ChooseColor_mod(2, "0x00ff00", 2) & @CRLF & @CRLF) ; just as default behaviour
    ConsoleWrite(@CRLF & _ChooseColor_mod(2, "0x00ff00", 2, 0, 'reset as is neither "Default" nor "Array[17]"') & @CRLF & @CRLF) ; just as default behaviour
EndFunc   ;==>_ChooseColor_mod_Example

; #FUNCTION# ====================================================================================================================
; Name ..........: _ChooseColor_mod
; Description ...:
; Syntax ........: _ChooseColor_mod([$iReturnType = 0[, $iColorRef = 0[, $iRefType = 0[, $hWndOwnder = 0[, $vCustColors = Default]]]]])
; Parameters ....: $iReturnType         - [optional] an integer value. Default is 0. See remarks for values.
;                  $iColorRef           - [optional] an integer value. Default is 0.
;                  $iRefType            - [optional] an integer value. Default is 0. See remarks for values.
;                  $hWndOwnder          - [optional] a handle to the parent window. Default is 0.
;                  $vCustColors         - [optional] an array of colors to show as custom values. See remarks for values.
; Return values .: Success - Hex value of the selected color
;                  Failure - $vCustomColors is returned if set, otherwise, -1 is returned. Also sets @error:
;                  | -2 -       User initialized $tagCustcolors via $vCustColors.
;                  | -3 -       User canceled or invalid dll struct.
;                  | -4 -       Invalid $iReturnType value.
;                  | Other -    Error returned from Dll call.
; Author ........: Gary Frost (gafrost)
; Modified ......: argumentum
; Remarks .......: $iReturnType can be 0 (RGB COLORREF), 1 (Hex BGR), or 2 (Hex RGB).
;                  $iRefType can be 0 (ColorRef), 1 (BGR Hex), or 2 (RGB Hex).
;                  $vCustColors is a zero based array[17] where:
;                     index 0 hold the color returned by the function.
;                     index 1 to 16 are the colors to use in Custom colors in RGB.
;                     One can pass the array with array[0] = -2 to initialize the custom colors without loading the interface.
;                     When $vCustColors is used, it returns the modified array. ( not the color as integer ).
;                     Anything other than Default or a proper array, will clear $tagCustcolors ( holder of the custom colors ).
;                     When $vCustColors is omited or Default, $tagCustcolors is kept ( hence, no need for the array to keep custom colors ).
; Related .......: Same Func from <Misc.au3>
; Link ..........: https://www.autoitscript.com/forum/topic/200985-_choosecolor-but-better/
; Example .......: YES
; ===============================================================================================================================
Func _ChooseColor_mod($iReturnType = 0, $iColorRef = 0, $iRefType = 0, $hWndOwnder = 0, $vCustColors = Default) ; basic code from Misc.au3 ; https://www.autoitscript.com/forum/topic/200985-_choosecolor-but-better/

    ; added here for independance of #include <Misc.au3>
    Local Static $tagCHOOSECOLOR = "dword Size;hwnd hWndOwnder;handle hInstance;dword rgbResult;ptr CustColors;dword Flags;lparam lCustData;" & _
            "ptr lpfnHook;ptr lpTemplateName"
    Local Static $__MISCCONSTANT_CC_ANYCOLOR = 0x0100
    Local Static $__MISCCONSTANT_CC_FULLOPEN = 0x0002
    Local Static $__MISCCONSTANT_CC_RGBINIT = 0x0001
    ; added here for independance of #include <Misc.au3>


    Local $vReturn, $bCustColors = False, $tagCustcolors = "dword[16]"
    Local $tChoose = DllStructCreate($tagCHOOSECOLOR)
    Local Static $tCc = DllStructCreate($tagCustcolors) ; added Static (mod.), to keep $tagCustcolors changes by user when called again.

    If $vCustColors == Default Then
        ; nothing
    ElseIf UBound($vCustColors) = 17 Then
        $bCustColors = True
        For $n = 1 To 16
            DllStructSetData($tCc, 1, $vCustColors[$n], $n)
        Next
    Else
        $tCc = DllStructCreate($tagCustcolors) ; reset, just in case you'd want to have it default again
    EndIf

    If $iRefType = 1 Then ; BGR hex color to colorref
        $iColorRef = Int($iColorRef)
    ElseIf $iRefType = 2 Then ; RGB hex color to colorref
        $iColorRef = Hex(String($iColorRef), 6)
        $iColorRef = '0x' & StringMid($iColorRef, 5, 2) & StringMid($iColorRef, 3, 2) & StringMid($iColorRef, 1, 2)
    EndIf

    DllStructSetData($tChoose, "Size", DllStructGetSize($tChoose))
    DllStructSetData($tChoose, "hWndOwnder", $hWndOwnder)
    DllStructSetData($tChoose, "rgbResult", $iColorRef)
    DllStructSetData($tChoose, "CustColors", DllStructGetPtr($tCc))
    DllStructSetData($tChoose, "Flags", BitOR($__MISCCONSTANT_CC_ANYCOLOR, $__MISCCONSTANT_CC_FULLOPEN, $__MISCCONSTANT_CC_RGBINIT))

    Local $aResult = DllCall("comdlg32.dll", "bool", "ChooseColor", "struct*", $tChoose)
    If @error Then
        If Not $bCustColors Then
            Return SetError(@error, @extended, -1)
        Else
            $vCustColors[0] = -1
            Return SetError(@error, @extended, $vCustColors)
        EndIf
    EndIf

    If $bCustColors Then ; this here is better than at the end,
        For $n = 1 To 16 ;  that way you'll get the custom colors anyway.
            $vCustColors[$n] = DllStructGetData($tCc, 1, $n)
        Next
        If $vCustColors[0] = -2 Then Return $vCustColors
    EndIf

    If $aResult[0] = 0 Then ; Return SetError(-3, -3, -1) ; user selected cancel or struct settings incorrect
        If Not $bCustColors Then
            Return SetError(-3, -3, -1)
        Else
            $vCustColors[0] = -1
            Return SetError(-3, -3, $vCustColors)
        EndIf
    EndIf

    Local $sColor_picked = DllStructGetData($tChoose, "rgbResult")

    If $iReturnType = 1 Then ; return Hex BGR Color
        $vReturn = '0x' & Hex(String($sColor_picked), 6)
    ElseIf $iReturnType = 2 Then ; return Hex RGB Color
        $sColor_picked = Hex(String($sColor_picked), 6)
        $vReturn = '0x' & StringMid($sColor_picked, 5, 2) & StringMid($sColor_picked, 3, 2) & StringMid($sColor_picked, 1, 2)
    ElseIf $iReturnType = 0 Then ; return RGB COLORREF
        $vReturn = $sColor_picked
    Else
        $vReturn = -1
        SetError(-4, -4)
    EndIf
    If Not $bCustColors Then Return $vReturn
    $vCustColors[0] = $vReturn
    Return $vCustColors
EndFunc   ;==>_ChooseColor_mod

Hopefully will replace the default one in the next release;) 

Edited by argumentum
better code

Share this post


Link to post
Share on other sites

I like it! Two (minor) nitpicks:

1. $iCustColors is really a boolean, should be used and named as such ;) (Dyslexia is a b***h with 0's and 1's, so I never remember which is True) 
2. Include a header to let us know what the possible results of the function are... I guessed a bit in generating this

; #FUNCTION# ====================================================================================================================
; Name ..........: _ChooseColor_mod
; Description ...: 
; Syntax ........: _ChooseColor_mod([$iReturnType = 0[, $iColorRef = 0[, $iRefType = 0[, $hWndOwnder = 0[, $vCustColors = Default]]]]])
; Parameters ....: $iReturnType         - [optional] an integer value. Default is 0. See remarks for values.
;                  $iColorRef           - [optional] an integer value. Default is 0.
;                  $iRefType            - [optional] an integer value. Default is 0. See remarks for values.
;                  $hWndOwnder          - [optional] a handle to the parent window. Default is 0.
;                  $vCustColors         - [optional] an array of colors to show as custom values. Default is Default.
; Return values .: Success - Hex value of the selected color
;                  Failure - $vCustomColors is returned if set, otherwise, -1 is returned. Also sets @error: 
;                  | -3 -       User canceled or invalid dll struct. 
;                  | -4 -       Invalid $iReturnType value.
;                  | Other -    Error returned from Dll call.
; Author ........: argumentum
; Modified ......: 
; Remarks .......: $iReturnType can be 0 (RGB COLORREF), 1 (Hex BGR), or 2 (Hex RGB).
;~                 $iRefType can be 0 (ColorRef), 1 (BGR Hex), or 2 (RGB Hex).
; Related .......: 
; Link ..........: https://www.autoitscript.com/forum/topic/200985-_choosecolor-but-better/
; Example .......:
; ===============================================================================================================================

 


All my code provided is Public Domain... but it may not work. ;) Use it, change it, break it, whatever you want.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By DannyJ
      Hello Forum, 
      I have one special Combo-box [with BitOR($CBS_DROPDOWNLIST, $GUI_SS_DEFAULT_COMBO, $CBS_SIMPLE) ] and if I press one button I want to change the Combo-box's background color, and after I press Button B I want to change it to the basic settings and it not works.
      I wanna do this with one combo-box.
      I have already tried several methods and I tried  GUICtrlComboSetColors that I have found on this forum.
      (But this methods works perfectly with Cobo boxes that don't have BitOR($CBS_DROPDOWNLIST, $GUI_SS_DEFAULT_COMBO, $CBS_SIMPLE). 
      Here is the example code
      #include <ButtonConstants.au3> #include <ComboConstants.au3> #include <GUIConstantsEx.au3> #include <WindowsConstants.au3> #Region ### START Koda GUI section ### Form= ;$CBS_DROPDOWNLIST ;$GUI_SS_DEFAULT_COMBO $Form1 = GUICreate("Form1", 504, 249, 252, 227) $Combo1 = GUICtrlCreateCombo("", 136, 24, 193, 25,BitOR($CBS_DROPDOWNLIST, $GUI_SS_DEFAULT_COMBO, $CBS_SIMPLE)) ; I want to change this special combo's background color if I press button 1 $Button1 = GUICtrlCreateButton("Button1", 112, 96, 75, 25) $Button2 = GUICtrlCreateButton("Button2", 264, 96, 75, 25) GUISetState(@SW_SHOW) #EndRegion ### END Koda GUI section ### GUICtrlSetData($Combo1," " & "|" & "apple" & "|" & "banana" & "|" & "cherry" ," ") While 1 $nMsg = GUIGetMsg() Switch $nMsg Case $GUI_EVENT_CLOSE Exit Case $Button1 GUICtrlSetBkColor($Combo1,0x0078D7) Case $Button2 ;Makes the original bc color GUICtrlSetBkColor($Combo1,0xFFFFFF) EndSwitch WEnd  
      Thanks you in advance your help
    • By user4157124
      ConsoleWrite('>Message here.' & @CRLF) outputs colored text (per + > - ! characters).
      ConsoleWrite('warning' & @TAB & '38' & @TAB & 'more text ...' & @CRLF) enables jump to line 38 on doubleclick.

      Using "jump to line" format, only red and pink text coloring seems possible (simply prefixing color directives to output-text disables jump to line functionality). Is it possible to combine the two (define custom color while keeping "jump to line" functionality)?
    • By Miliardsto
      I have the following code. You can see there are $color_normal and $color_trans
      In my case normal is too dark . And color trans is to much violet.
      If you run it you will see how its looks. I want gui with listView have the same color like taskbar in windows 10.
      How to achieve that?
       
       
      #include <Date.au3> #include <MsgBoxConstants.au3> #include <GuiListBox.au3> #include <WindowsConstants.au3> #include <GUIConstantsEx.au3> #include <GuiListView.au3> HotKeySet("{ESC}", "Terminate") $color_normal = "0x" & StringLeft(StringRight(RegRead("HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Accent", "AccentPalette"), 24), 6) $color_trans = "0x" & StringLeft(StringRight(RegRead("HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Accent", "AccentPalette"), 16), 6) $trans = RegRead("HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Themes\Personalize", "EnableTransparency") ConsoleWrite("Transpart = " & $trans & @CRLF) ConsoleWrite("Color normal = " & $color_normal & @CRLF) ConsoleWrite("Color trans = " & $color_trans & @CRLF) ConsoleWrite(_Get_taskbar_color()); It return AARRGGBB $taskbarColor = _Get_taskbar_color() Global $gui = GUICreate("Test", 150, 58,@DesktopWidth-300,@DesktopHeight-58,$WS_POPUP,BitOR($WS_EX_TOPMOST, $WS_EX_TOOLWINDOW)) Global $idListview = GUICtrlCreateListView("", 0, 0, 150, 58,BitOR($LBS_NOTIFY,$LBS_SORT), 0) ;_GuiCtrlMakeTrans(-1,100) ; Add column _GUICtrlListView_AddColumn($idListview, "Msgs", 100) GUICtrlSetFont(-1, 7, 400, 0, "Segoe UI") GUICtrlSetColor(-1, 0x470C4F) GUICtrlSetBkColor($idListview, 0x310638) GUISetState() While 1 Switch GUIGetMsg() Case $GUI_EVENT_CLOSE Exit EndSwitch WEnd Func Terminate() Exit EndFunc Func _Get_taskbar_color() If RegRead("HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Themes\Personalize", "ColorPrevalence") Then If RegRead("HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Themes\Personalize", "EnableTransparency") Then Return "0xD9" & StringLeft(StringRight(RegRead("HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Accent", "AccentPalette"), 16), 6) Else Return "0xFF" & StringLeft(StringRight(RegRead("HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Accent", "AccentPalette"), 24), 6) EndIf Else If RegRead("HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Themes\Personalize", "EnableTransparency") Then Return "0xD9000000" Else Return "0xFF000000" EndIf EndIf EndFunc  
    • By dejhost
      Happy New Year everyone!
      I would like to extract the color values of certain pixels in an image.  This is how I picture the workflow: 
      User opens an image of his choice. Image is shown on the screen. User draws a line into the image. This happens by marking the startpixel and the endpixel of the line The line is drawn, so the user can check visually if he is happy with the line.  The following pixel based properties belonging to the line are stored in Excel: X-Coordinate Y-Coordinate Color Value Additional operations: Extracting for max- and min. color values; Statistical operations.   Browsing through the helpfile of AutoIt I find plenty of functions for treating images (e.g. GDIPlus), but I am completely unsure if Autoit will get me there. Should I read the entire image into an array? Should I rather attempt to script an external image software (e.g. IrfanView, Gimp)?
      I would be very thankful if someone could give some recommendations and maybe list a couple of the most important commands to use.
      Thank you very much.
      Dejhost
       
       
    • By reida
      Hello, help me please, to choose "+41 Switzerland" from the list
      <select name="cc" id="cc" style="width: 140px;"> <option value="1" label="+1 USA, Canada">+1 USA, Canada</option> <option value="7" label="+7 Russia, Kazakhstan">+7 Russia, Kazakhstan</option> <option value="41" label="+41 Switzerland">+41 Switzerland</option> <option value="44" label="+44 United Kingdom">+44 United Kingdom</option> <option value="49" label="+49 Germany" selected="selected">+49 Germany</option> <option value="61" label="+61 Australia">+61 Australia</option> <option value="370" label="+370 Lithuania">+370 Lithuania</option> <option value="375" label="+375 Belarus">+375 Belarus</option> <option value="380" label="+380 Ukraine">+380 Ukraine</option> <option value="992" label="+992 Tajikistan">+992 Tajikistan</option> <option value="995" label="+995 Georgia">+995 Georgia</option> <option value="998" label="+998 Uzbekistan">+998 Uzbekistan</option> <option value="43" label="+43 Austria">+43 Austria</option> <option value="994" label="+994 Azerbaijan">+994 Azerbaijan</option> </select>  
×
×
  • Create New...