GroupEx.au3 -- User Group Control, vielseitig modifizierbar

    • Offizieller Beitrag

    In einem Post wurde gefragt, wie man bei einer Group den Rahmen färben kann.
    Da man an dem Control nicht mit Ownerdraw herumschrauben kann, habe ich Funktionen gebaut zum Erstellen und Ändern einer Group. Die Group ist aus einzelnen Label zusammengesetzt, kann aber verändert werden, ohne jedes Element einzeln ansprechen zu müssen.
    Beim Erstellen der Group wird intern GUIStartGroup() aufgerufen um die Group-Funktionalität zu gewährleisten.
    Übrigens lassen sich nicht nur Groups erstellen, sondern da die Elemente auch einzeln dargestellt werden können, verschiedene Rahmenstrukturen.

    History

    Edit 26.04.2022 v0.14:

    SCRIPT BREAKING CHANGE: Die Angabe der Parent-GUI ist nicht mehr erforderlich.

    - GEÄNDERT: Die _Create-Funktion erkennt selbst das Parent-Handle.

    - GEÄNDERT: Optimierung der Messung der Titel-Dimensionen.

    - NEU: _GuiCtrlGroup_Create() kann Fontnamen und -größe für den Gruppentitel bestimmen..

    Dazu wird an den Titel in spitzen Klammern angehängt: "<FontName;FontSize>", z.B. "My-Title<Consolas;10>"

    Spitze Klammern als Bestandteil des Titel-Textes müssen maskiert werden: "\<something\>".

    Fontname und -größe können nur während der Erstellung festgelegt werden und sind anschließend unveränderbar!


    Edit 03.06.2018 v012:

    - Farbmanagement beim Disable/Enable intern optimiert

    - Flackern bei Enable inside - Ctrl beseitigt

    - Integration Systemcolor Abfrage

    Edit 02.06.2018 v0.11:

    - Beim Disable/Enable wird die bisherige Farbe von Text und Groupfläche automatisch gespeichert. Es können Farbwerte optional übergeben werden. Ohne Werte (bzw. mit 'Null') werden die Standardwerte für Disable bzw. die vorherigen Enable Farben verwendet.

    Edit 02.06.2018 v0.10:

    - Jetzt werden auch nicht-native Ctrl berücksichtigt beim Verschieben und Status setzen

    - Fehler nach Disable - Enable (nicht anklickbare Control) beseitigt

    Edit 01.06.2018 v0.8:

    ACHTUNG - die neue Version hat Änderungen in den Parametern (Art und Anzahl) und ist nicht kompatibel mit Skripten die mit Vorversionen erstellt wurden!

    NEU

    - Funktion: _GuiCtrlGroup_SetState Setzt den Status für die Group (ENABLE/DISABLE/HIDE/SHOW) und optional für Controls innerhalb der Group (als Array übergeben)

    Bei Disable kann die Farbe für Titeltext und Grouphintergrund im Disable-Zustand übergeben werden. Es gibt Standardwerte (Grautöne), die benutzt werden, falls kein Wert übergeben wird (s. Konstanten im Skriptkopf). Die bisherigen Farben werden zurückgegeben und können dann bei Enable wieder verwendet werden.

    - beim Erstellen kann bereits Italic als Schriftstyle gewählt werden (kombinierbar mit Align)

    - Beim Verschieben der Group lassen sich ebenfalls die enthaltenen Controls (als Array übergeben) mit verschieben

    GEÄNDERT

    - Funktion: _GuiCtrlGroup_Create Der Parameter $_iAlign wurde ersetzt durch $_iTitleParam (kombinierbar Ausrichtung und Style)

    - Funktion: _GuiCtrlGroup_Set Das Gui-Handle ist als Parameter nicht mehr erforderlich. Optionaler Parameter $_aCtrlInside zum Verschieben der Controls mit der Group

    Edit 14.09.2013 v0.7:
    - da war noch ein Bug beim Zeichnen von Controls innerhalb der Group ausserhalb der Main-GUI ==> gefixed

    Edit 14.09.2013 v0.6:
    - Bug bei Verwendung der Funktion in mehreren GUI gefixed ==> Dadurch zusätzlicher Parameter für GUI bei "_GuiCtrlGroup_Create".
    Das bisherige Bsp. ist aufgrund der Syntaxänderung nicht mehr verwendbar. 2 neue Bsp. im Anhang

    Edit 23.07.2013 v0.5:
    Titelpositionen: $_GROUPTEXT_LEFT (Standard), $_GROUPTEXT_CENTER, $_GROUPTEXT_RIGHT
    - als zusätzlichen Parameter beim Erstellen angeben oder
    - mit _GuiCtrlGroup_Set() ohne Wert aufrufen oder
    - in Kombination mit $_GROUPTEXT_TEXT aufrufen

    Edit 22.07.2013 v0.3:
    ControlMove möglich mit Flag
    - $_GROUPMOVE_ABS (Parameter absolut innerhalb des Child-Window) oder
    - $_GROUPMOVE_REL (Parameter relativ zur vorherigen Position)
    Parameter können als Array oder kommagetrennter String übergeben werden. Für Parameter, die nicht verändert werden sollen, "*" übergeben.
    Reihenfolge: x, y, Breite, Höhe
    Es sind nur Parameter in der Reihenfolge von links zu übergeben, soll z.B. nur die y-Position geändert werden reicht aus: "*,y"

    Edit 22.07.2013 v0.2:
    Die folgenden Operationen brauchen keinen Wert für Parameter "$_vValue". Leerstring übergeben.
    - Textlabel kann per Flag $_GROUPTEXT_ITALIC auf Style "Italic" gesetzt werden
    - Mit Flag $_GROUPTEXT_DEFAULT wird der Style wieder aufgehoben
    - BackColor des Textlabels mit Flag $_GROUPTEXT_TRANS von Farbe wieder auf Transparenz setzbar

    v 0.14

    Zu viele Zeichen für einen Thread. ;)

    Online ist der Code auf meinem Git-Account einsehbar.

    Beispiel

    DL bisher: 383

  • Wie immer genial 8o

    Wenn ich es richtig sehe, fehlt noch die Möglichkeit für das ändern der Hintergrundfarbe für den Titel der Gruppe.

  • Und eine weitere Datei in meinem "AutoIt3/Includes" - Ordner!

    Wie immer super, kann ich bestimmt mal brauchen. :D

    MfG

    There's a joke that C has the speed and efficieny of assembly language combined with readability of....assembly language. In other words, it's just a glorified assembly language. - Teh Interwebz

    C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do, you blow off your whole leg. - Bjarne Stroustrup
    Genie zu sein, bedeutet für mich, alles zu tun, was ich will. - Klaus Kinski

    • Offizieller Beitrag

    Neu v0.2

    - Style Italic/Default für Titel
    - Transparenz Back Color Titel per Flag setzbar

    Die Styles underlined und strike lassen sich nicht anwenden, da zum Einpassen des Textes Leerzeichen vorangestellt werden, die dann auch von diesen Styles betroffen wären.
    Den Font bold zu setzen ist nicht sinnvoll, da hierbei die Arithmetik des gesamten Gebildes sich verschieben würde. Und ich denke mit Italic + Farbe sind ausreichende Gestaltungsvarianten gegeben.

  • Hallo,
    nett gemacht. Ich hätte das aber auf diese Art gemacht:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Example()

    [/autoit] [autoit][/autoit] [autoit]

    Func Example()
    GUICreate("My GUI group") ; will create a dialog box that when displayed is centered

    [/autoit] [autoit][/autoit] [autoit]

    GUICtrlCreateGroup("Group 1", 10, 60, 90, 140)
    GUICtrlCreateRadio("Radio 1", 30, 90, 50, 20)
    GUICtrlCreateRadio("Radio 2", 30, 110, 60, 50)
    GUICtrlCreateGroup("", -99, -99, 1, 1) ;close group

    [/autoit] [autoit][/autoit] [autoit]

    _GUICtrlCreateGroup("Group 1", 140, 60, 90, 140, 0xFF0000, 0xCC5500)
    GUICtrlCreateRadio("Radio 1", 160, 90, 50, 20)
    GUICtrlCreateRadio("Radio 2", 160, 110, 60, 50)
    GUICtrlCreateGroup("", -99, -99, 1, 1) ;close group

    [/autoit] [autoit][/autoit] [autoit]

    _GUICtrlCreateGroup("Group 1", 270, 60, 90, 140, 0x0000FF, 0x0F0FF0, 2)
    GUICtrlCreateRadio("Radio 1", 290, 90, 50, 20)
    GUICtrlCreateRadio("Radio 2", 290, 110, 60, 50)
    GUICtrlCreateGroup("", -99, -99, 1, 1) ;close group

    [/autoit] [autoit][/autoit] [autoit]

    GUISetState() ; will display an empty dialog box

    [/autoit] [autoit][/autoit] [autoit]

    ; Run the GUI until the dialog is closed
    While 1
    Local $msg = GUIGetMsg()

    [/autoit] [autoit][/autoit] [autoit]

    If $msg = $GUI_EVENT_CLOSE Then ExitLoop
    WEnd
    EndFunc ;==>Example

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _GuiCtrlCreateGroup($sText, $iX, $iY, $iW, $iH, $iRectCol = -1, $iFontCol = -1, $iFontAttribute = -1)
    GUIStartGroup()
    Local $nGraph = GUICtrlCreateGraphic($iX, $iY, $iW, $iH, 0)
    If $iRectCol <> -1 Then GUICtrlSetGraphic(-1, $GUI_GR_COLOR, $iRectCol)
    GUICtrlSetGraphic(-1, $GUI_GR_RECT, 0, 0, $iW, $iH)
    GUICtrlCreateLabel($sText, $iX + 5, $iY - 5, Default, Default, 0x1) ; $SS_CENTER
    If $iFontCol <> -1 Then GUICtrlSetColor(-1, $iFontCol)
    If $iFontAttribute <> -1 Then GUICtrlSetFont(-1, Default, Default, $iFontAttribute)
    EndFunc ;==>_GuiCtrlCreateGroup

    [/autoit]
  • Danke!!! Du bist der Hammer!

    Edit: Und ja, funkey's Methode ist meiner Meinung nach noch besser, da passt das mit der Breite und Höhe besser, bei BugFix ist es bisschen größer, als es sein soll. (Und die Höhe wird sogar noch größer gemacht als die Breite)

    Da es hier doch einige falsch machen:

    Zitat von einem User dieses Forums

    Die Standard-Standart eines Flamingos ist einbeinig. ;)

    Einmal editiert, zuletzt von Joriktos (22. Juli 2013 um 15:17)

  • BugFix : Da hast du Recht. Das ist auch sehr sinnvoll und vor allem sehr gute Arbeit. :thumbup:

    @all:
    Ich benutze nun funkey's Methode, da diese einfacher ist und mir reicht. Dazu habe ich sie aber nochmal überarbeitet und das ist dabei herausgekommen:

    ColoredGroupBox.au3
    [autoit]


    #include-once
    #include <GUIConstants.au3>

    [/autoit] [autoit][/autoit] [autoit]

    ; #FUNCTION# ====================================================================================================================
    ; Name ..........: _GuiCtrlCreateGroup
    ; Description ...: Create a Group in which you can set the Border-Color
    ; Syntax ........: _GuiCtrlCreateGroup($sText, $iX, $iY, $iW, $iH[, $iRectCol = -1[, $iTextCol = -1[, $iTextBkColor = -2[,
    ; $iFontAttribute = -1]]]])
    ; Parameters ....: $sText - The text of the control.
    ; $iX - The left side of the control.
    ; $iY - The top of the control.
    ; $iW - The width of the control.
    ; $iH - The height of the control.
    ; $iRectCol - [optional] The Rectangle-Color. Default is Black (0x000000).
    ; $iTextCol - [optional] The Text-Color. Default is Black (0x000000).
    ; $iTextBkColor - [optional] The Text-Background-Color. Default is transparent (-2).
    ; $iFontAttribute - [optional] The Font-Attributes. Default is -1. (italic:2; underlined:4; strike:8)
    ; Return values .: $aGroup
    ; $aGroup[0] - The Handle of the Graphic.
    ; $aGroup[1] - The Handle of the Line (Label with 1px height) which overdraws the Graphic below the Text with the GUI-Background-Color.
    ; $aGroup[2] - The Handle of the Text-Label.
    ; Author ........: funkey (autoit.de)
    ; Modified ......: Joriktos
    ; Remarks .......: Tip: If you want to set another font, use $aGroup[2] to get the Handle of the Text-Label.
    ; But if you want to change the width, don't forget to change the width of $aGroup[1] too.
    ; Related .......:
    ; Link ..........:
    ; Example .......:
    ; ===============================================================================================================================
    Func _GuiCtrlCreateGroup($sText, $iX, $iY, $iW, $iH, $iRectCol = -1, $iTextCol = -1, $iTextBkColor = -2, $iFontAttribute = -1)
    Local $aGroup[3]
    $aGroup[0] = GUICtrlCreateGraphic($iX, $iY, $iW, $iH, 0) ; Create a Graphic
    If $iRectCol <> -1 Then GUICtrlSetGraphic($aGroup[0], $GUI_GR_COLOR, $iRectCol) ; Set the Rectangle-Color - Standard: Black (0x000000)
    GUICtrlSetGraphic($aGroup[0], $GUI_GR_RECT, 0, 0, $iW, $iH) ; Draws the Graphic into a Rectangle
    $aGroup[1] = GUICtrlCreateLabel($sText, $iX + 5, $iY, Default, 1, 0x1) ; Overdraw the Rectangle-Graphic with a Line (Label with 1px height) for the Text. The line is colored like the GUI-Background.
    $aGroup[2] = GUICtrlCreateLabel($sText, $iX + 5, $iY - 6, Default, Default, 0x1) ; Label for the Text - 0x1 = $SS_CENTER
    If $iTextCol <> -1 Then GUICtrlSetColor($aGroup[2], $iTextCol) ; Set the Text-Color - Standard: Black (0x000000)
    If $iTextBkColor <> -1 Then GUICtrlSetBkColor($aGroup[2], $iTextBkColor) ; Set the Text-Backgound-Color - Standard: Transparent (-2)
    If $iFontAttribute <> -1 Then GUICtrlSetFont($aGroup[2], Default, Default, $iFontAttribute) ; Set the Font-Attributes

    [/autoit] [autoit][/autoit] [autoit]

    GUIStartGroup() ; For a full functional Group ;)

    [/autoit] [autoit][/autoit] [autoit]

    Return $aGroup ; Returns the 3 Handles
    EndFunc ;==>_GuiCtrlCreateGroup

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ; #FUNCTION# ====================================================================================================================
    ; Name ..........: _GUICtrlDeleteGroup
    ; Description ...: This deletes a Group which was created with _GUICtrlCreateGroup() before.
    ; Syntax ........: _GUICtrlDeleteGroup($aGroup)
    ; Parameters ....: $aGroup - An array of unknowns.
    ; Return values .: None
    ; Author ........: Joriktos
    ; Modified ......: -
    ; Remarks .......:
    ; Related .......:
    ; Link ..........:
    ; Example .......: No
    ; ===============================================================================================================================
    Func _GUICtrlDeleteGroup($aGroup)
    For $i = 0 To UBound($aGroup) - 1
    GUICtrlDelete($aGroup[$i])
    Next
    EndFunc ;==>_GUICtrlDeleteGroup

    [/autoit]


    Ich habe noch eine Funktion gebastelt um das "Control" wieder zu löschen und ich habe es nun so gebastelt, dass ein Array mit 3 Handles zurück gegeben wird, mit denen man nachträglich noch sämtliche Dinge ändern kann :thumbup:


    Gruß
    Joriktos

  • Hi,
    zum Thema habe ich noch eine Lösung im en. Forum gefunden. ;)

    Spoiler anzeigen
    [autoit]


    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Global $GuiTest = GUICreate("Color Test", 330, 220, -1, -1, BitOR($WS_SYSMENU, $WS_CAPTION, $WS_MINIMIZEBOX, $WS_POPUPWINDOW, $WS_BORDER, $WS_CLIPSIBLINGS), BitOR($WS_EX_TOPMOST, $WS_EX_WINDOWEDGE))
    GUISetBkColor(0x585768)

    [/autoit] [autoit][/autoit] [autoit]

    Global $GuiLabel = GUICtrlCreateLabel("A bunch of buttons in a test GUI", 0, 20, 330, 15, $SS_CENTER)
    GUICtrlSetColor(-1, 0xffffff)

    [/autoit] [autoit][/autoit] [autoit]

    Global $Section1 = XSkinGroup("This Text Should Be White", 10, 40, 310, 170, 0xffffff)
    ; GUICtrlSetColor(-1,0xffffff)

    [/autoit] [autoit][/autoit] [autoit]

    Global $ButtonLabel1 = GUICtrlCreateLabel("Item Label 1", 20, 60, 130, 15)
    GUICtrlSetColor(-1, 0xffffff)
    Global $Button1 = GUICtrlCreateButton("Button 1", 140, 55, 170, 25)

    [/autoit] [autoit][/autoit] [autoit]

    Global $ButtonLabel2 = GUICtrlCreateLabel("Item Label 2", 20, 90, 130, 15)
    GUICtrlSetColor(-1, 0xffffff)
    Global $Button2 = GUICtrlCreateButton("Button 2", 140, 85, 170, 25)

    [/autoit] [autoit][/autoit] [autoit]

    Global $ButtonLabel3 = GUICtrlCreateLabel("Item Label 3", 20, 120, 130, 15)
    GUICtrlSetColor(-1, 0xffffff)
    Global $Button3 = GUICtrlCreateButton("Button 3", 140, 115, 170, 25)

    [/autoit] [autoit][/autoit] [autoit]

    Global $ButtonLabel4 = GUICtrlCreateLabel("Item Label 4", 20, 150, 130, 15)
    GUICtrlSetColor(-1, 0xffffff)
    Global $Button4 = GUICtrlCreateButton("Button 4", 140, 145, 170, 25)

    [/autoit] [autoit][/autoit] [autoit]

    Global $ButtonLabel5 = GUICtrlCreateLabel("Item Label 5", 20, 180, 130, 15)
    GUICtrlSetColor(-1, 0xffffff)
    Global $Button5 = GUICtrlCreateButton("Button 5", 140, 175, 170, 25)

    [/autoit] [autoit][/autoit] [autoit]

    GUISetState(@SW_SHOW, $GuiTest)

    [/autoit] [autoit][/autoit] [autoit]

    While True
    $msg = GUIGetMsg(1)
    Select
    Case $msg[0] = $GUI_EVENT_CLOSE
    Exit
    EndSelect
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func XSkinGroup($text, $Pleft, $Ptop, $Pwidth, $Pheight, $color)
    Local $XS_n, $PControl
    If StringInStr(@OSType, "WIN32_NT") Then
    $XS_n = DllCall("uxtheme.dll", "int", "GetThemeAppProperties")
    DllCall("uxtheme.dll", "none", "SetThemeAppProperties", "int", 0)
    EndIf
    $PControl = GUICtrlCreateGroup($text, $Pleft, $Ptop, $Pwidth, $Pheight)
    ;GUICtrlSetBkColor($PControl, $color)
    GUICtrlSetColor($PControl, $color)
    If StringInStr(@OSType, "WIN32_NT") And IsArray($XS_n) Then
    DllCall("uxtheme.dll", "none", "SetThemeAppProperties", "int", $XS_n[0])
    EndIf
    Return $PControl
    EndFunc ;==>XSkinGroup
    ; Quelle: http://www.autoitscript.com/forum/topic/37…oup-text-color/

    [/autoit]

    Edit: Post # 12 - Hinweis von Oscar: Ja, das kann sein ist Posted 14 December 2006 - 03:47 PM :(

  • Bin ich jetzt echt so blind oder gibt es keine Möglichkeit den Hintergrund der Group transparent zu schalten?

    Ein Tag ist schön, wenn am ende vom "exit" alles gut gelaufen ist :)