- Offizieller Beitrag
gibt es eine Möglichkeit die erstellten Groupboxen von BugFixer zu hiden?
Geht alles
gibt es eine Möglichkeit die erstellten Groupboxen von BugFixer zu hiden?
Geht alles
@BugFixer:
Du bist genial
Vielen Dank, jetzt sieht mein Tool viel besser aus, als mit den blöden anderen Groups
Aktuelle Version v0.8
Details s. Startpost
Ein paar Fragen hätte ich dazu...
PS1: Mit ComboBox/ComboBoxEx funktioniert es wohl nicht?!
PS2: Wäre schön, wenn du für _GuiCtrlGroup_Set noch ein Beispiel für $_aCtrlInside hinzufügen würdest.
Kannst du die Controls, die innerhalb der Group sein sollen, nicht besser gleich in _GuiCtrlGroup_Create integrieren... denn dann hätte der User nichts mehr damit zu schaffen?
Meinst du, dass das Array mit den Control-ID beim Erstellen der Group übergeben werden soll?
Das ist m.W. nicht möglich (lass mich aber gern eines Besseren belehren). Um die Group-Funktionalität zu erhalten muss als Erstes GUIStartGroup() ausgeführt werden (letzter Befehl bei _GuiCtrlGroup_Create) und die anschließend erstellten Control sind dann dieser Group zugehörig.
Trotzdem Danke für den Hinweis - dadurch ist mir erst bewusst geworden, dass ich noch eine Möglichkeit zum Schließen der Group einfügen muss.
Falls du aber eine Möglichkeit kennst, nachträglich Control in eine Group einzufügen, ich bin ganz Ohr.
Kannst du anstelle ControlMove nicht GUICtrlSetPos verwenden, wenn eine CtrlID übergeben wurde?
Warum? Weil die geänderte Größe/Position durch ControlMove nur temporär ist und verloren geht, wenn das Fenster minimiert und danach wiederhergestellt wird, mit GUICtrlSetPos aber nicht.
Danke, wichtiger Hinweis - ist mir bisher nicht klar gewesen. Wird geändert.
Mit ComboBox/ComboBoxEx funktioniert es wohl nicht?!
Sorry, hatte ich nicht eindeutig beschrieben, für mich war klar, dass Control-ID ($aID) keine Handle sein können. Somit ist es im Moment nur mit nativen Control möglich. Werde ich noch auf die To-Do-List setzen.
Wäre schön, wenn du für _GuiCtrlGroup_Set noch ein Beispiel für $_aCtrlInside hinzufügen würdest.
Hmm, es gibt nur zwei Befehle, bei denen ein $aID übergeben wird.
Einmal bei Verschieben: _GuiCtrlGroup_Set($tGroup1, '*,100', $_GROUP_MOVE_REL, $aID)
und dann noch bei Setzen eines Status: _GuiCtrlGroup_SetState($tGroup1, $GUI_HIDE, $aID)
Meinst du, dass das Array mit den Control-ID beim Erstellen der Group übergeben werden soll?
Ja, genau das meinte ich. Nachträglich wird wohl nicht gehen... ok, dass geht dann also nicht. Wegen des Beispiels... das war nicht für mich gedacht.
To-Do-List:
Funktion GroupClose
ControlMove ersetzen durch GUICtrlSetPos
Verschieben /Status setzen auch für nicht-native Control --> ist umgesetzt aber: nach set Status Disable, dann Enable kann kein Control der Group angeklickt werden
Bitte mal die v 0.9 testen,
vielleicht findet jemand den Fehler, bin da irgendwie in einer Sackgasse.
;-- TIME_STAMP 2018-06-02 15:31:10 v 0.9
#include-once
#include <GUIConstantsEx.au3>
#include <WinAPIGdi.au3>
#include <WinAPI.au3>
; == border color settings
Global Const $_GROUPBORDER_LEFT = 0x000001 ; == left border
Global Const $_GROUPBORDER_TOPL = 0x000002 ; == top border left from title
Global Const $_GROUPBORDER_TOPR = 0x000004 ; == top border right from title
Global Const $_GROUPBORDER_TOP = BitOR($_GROUPBORDER_TOPL,$_GROUPBORDER_TOPR) ; == top border
Global Const $_GROUPBORDER_RIGHT = 0x000008 ; == right border
Global Const $_GROUPBORDER_BOTTOM = 0x000010 ; == bottom border
Global Const $_GROUPBORDER_ALL = BitOR($_GROUPBORDER_LEFT,$_GROUPBORDER_TOP,$_GROUPBORDER_RIGHT,$_GROUPBORDER_BOTTOM) ; == full border
; == text settings
Global Const $_GROUPTEXT_FORE = 0x000020 ; == sets text fore color
Global Const $_GROUPTEXT_BACK = 0x000040 ; == sets text BG-color, should be $GUI_BKCOLOR_TRANSPARENT (default), if Group BG-color is diffent to GUI BG-color or same as Group BG-color
Global Const $_GROUPTEXT_TRANS = 0x000080 ; == sets text BG-color to $GUI_BKCOLOR_TRANSPARENT
Global Const $_GROUPTEXT_TEXT = 0x000100 ; == sets the title text
Global Const $_GROUPTEXT_ITALIC = 0x000200 ; == sets text style to italic
Global Const $_GROUPTEXT_DEFAULT = 0x000400 ; == sets text style back to normal
Global Const $_GROUPTEXT_LEFT = 0x000800 ; == sets text position to left side (default)
Global Const $_GROUPTEXT_CENTER = 0x001000 ; == sets text position centered
Global Const $_GROUPTEXT_RIGHT = 0x002000 ; == sets text position to right side
; == background color group
Global Const $_GROUPBACKGROUND = 0x004000 ; == sets BG-color inside border area
; == move the whole control
Global Const $_GROUP_MOVE_ABS = 0x008000 ; == give param as array [x,y,width,height], values that should not change set to "*"
; you can also give values as comma seperated string: "x,y,width,height"
; y,width,height by default has value "*", so you can omit them if not need to change
Global Const $_GROUP_MOVE_REL = 0x010000 ; == same as before, but given values relative to current position/size
; == default disabling colors
Global Const $_GROUP_DISABLE_BGDEF = 0xFAFAFA ; == the default background color value, if disabling the group
Global Const $_GROUP_DISABLE_TXTDEF = 0xF2F2F2 ; == the default title color value, if disabling the group
; == get system metrics
Global $_giTop, $_giSide
__SystemGetWindowBorder($_giTop, $_giSide)
; #FUNCTION# ====================================================================================================================
; Name ..........: _GuiCtrlGroup_Create
; Description ...: Creates a group control as collection of labels
; Syntax ........: _GuiCtrlGroup_Create($_sText, $_iX, $_iY, $_iWidth, $_iHeight[, $_iBorderCol = -1[, $_iForeCol = -1[,
; $_iBackCol = -1[, $_iTitleParam=$_GROUPTEXT_LEFT]]]])
; Parameters ....: $_hGui - GUI, where the group is still create
; $_sText - Titel
; $_iX - x position
; $_iY - y position, its the value for top of the title - border starts at: y +7
; $_iWidth - width
; $_iHeight - height, its the height from top of title to bottom border
; $_iBorderCol - [optional] Color for all border elements. Keyword Default = Silver: 0xC0C0C0, -1 = System (invisible)
; $_iForeCol - [optional] Title text color. Default is -1 (System).
; $_iBackCol - [optional] Group area background color. Default is -1 (System).
; $_iTitleParam - [optional] Title align left (default), centered or right or combined with italic style: BitOr($_CONST_ALIGN_, $_GROUPTEXT_ITALIC)
; Because $_GROUPTEXT_LEFT is the default alignment, you can use $_GROUPTEXT_ITALIC alone, to set italic style left aligned.
; Return values .: Structure with IDs of all group elements
; Author ........: BugFix
; ===============================================================================================================================
Func _GuiCtrlGroup_Create($_hGui, $_sText, $_iX, $_iY, $_iWidth, $_iHeight, $_iBorderCol=Default, $_iForeCol=-1, $_iBackCol=-1, $_iTitleParam=$_GROUPTEXT_LEFT)
$_iY += 7
Local $guiTmp = GUICreate('TEMP')
Local $idText, $aSize[1]
If $_sText <> '' Then
$idText = GUICtrlCreateLabel(' ' & $_sText, 0, 0)
$aSize = ControlGetPos($guiTmp, '', $idText)
GUICtrlDelete($idText)
Else
ReDim $aSize[3]
$aSize[2] = 0
EndIf
GUISwitch($_hGui)
GUIDelete($guiTmp)
If $aSize[2] > $_iWidth -12 Then $aSize[2] = $_iWidth -12
Local $dLeft = 10
If $aSize[2] > 0 Then
Switch $_iTitleParam
Case $_GROUPTEXT_CENTER
$dLeft = Int(($_iWidth-$aSize[2])/2)
Case $_GROUPTEXT_RIGHT
$dLeft = $_iWidth-10-$aSize[2]
EndSwitch
EndIf
Local $idBG = GUICtrlCreateLabel('', $_iX+1, $_iY+1, $_iWidth-2, $_iHeight-2-7)
If $_iBackCol > -1 Then GUICtrlSetBkColor($idBG, $_iBackCol)
GUICtrlSetState($idBG, $GUI_DISABLE)
Local $idLeft = GUICtrlCreateLabel('', $_iX, $_iY, 1, $_iHeight-7)
Local $idTopL = GUICtrlCreateLabel('', $_iX+1, $_iY, $dLeft-1, 1)
Local $idTopR = GUICtrlCreateLabel('', $_iX+$dLeft+$aSize[2], $_iY, $_iWidth-$aSize[2]-$dLeft, 1)
Local $idRight = GUICtrlCreateLabel('', $_iX+$_iWidth, $_iY, 1, $_iHeight-7)
Local $idBottom = GUICtrlCreateLabel('', $_iX+1, $_iY+$_iHeight-7, $_iWidth, 1)
If IsKeyword($_iBorderCol) Then $_iBorderCol = 0xC0C0C0
If $_iBorderCol > -1 Then
GUICtrlSetBkColor($idLeft, $_iBorderCol)
GUICtrlSetBkColor($idTopL, $_iBorderCol)
GUICtrlSetBkColor($idTopR, $_iBorderCol)
GUICtrlSetBkColor($idRight, $_iBorderCol)
GUICtrlSetBkColor($idBottom, $_iBorderCol)
EndIf
If $_sText <> '' Then $_sText = ' ' & $_sText
$idText = GUICtrlCreateLabel($_sText, $_iX+$dLeft, $_iY-7, $aSize[2], 17)
GUICtrlSetBkColor($idText, $GUI_BKCOLOR_TRANSPARENT)
If BitAND($_iTitleParam, $_GROUPTEXT_ITALIC) Then
GUICtrlSetFont($idText, Default, Default, 2)
EndIf
If $_iForeCol > -1 Then GUICtrlSetColor($idText, $_iForeCol)
Local $tagGROUP = "int Text;int Left;int TopL;int TopR;int Right;int Bottom;int Background;int Align;"
Local $tGROUP = DllStructCreate($tagGROUP)
$tGROUP.Text = $idText
$tGROUP.Left = $idLeft
$tGROUP.TopL = $idTopL
$tGROUP.TopR = $idTopR
$tGROUP.Right = $idRight
$tGROUP.Bottom = $idBottom
$tGROUP.Background = $idBG
$tGROUP.Align = BitXOR($_iTitleParam, $_GROUPTEXT_ITALIC)
GUIStartGroup()
Return $tGROUP
EndFunc ;==>_GuiCtrlGroup_Create
; #FUNCTION# ====================================================================================================================
; Name ..........: _GuiCtrlGroup_Close
; Description ...: Starts a new group and so the previous group will closed
; Syntax ........: _GuiCtrlGroup_Set()
; Return values .: None
; Note ..........: Only required, if outside the group radio buttons following. But it can used to close each group.
; Author ........: BugFix
; ===============================================================================================================================
Func _GuiCtrlGroup_Close()
GUIStartGroup()
EndFunc ;==>_GuiCtrlGroup_Close
; #FUNCTION# ====================================================================================================================
; Name ..........: _GuiCtrlGroup_Set
; Description ...: Changes values of a _GuiCtrlGroup_Create() created control.
; Syntax ........: _GuiCtrlGroup_Set(ByRef $_structGroup, $_vValue, $_constFlag, $_aCtrlInside)
; Parameters ....: $_structGroup - Return value from _GuiCtrlGroup_Create()
; $_vValue - The new value, maybe an empty string with some flag.
; $_constFlag - The const to identify the action (see constants at top)
; $_aCtrlInside - With action flag $_GROUP_MOVE_ABS/$_GROUP_MOVE_REL you can give an array of controls
; inside this group. This controls will moved too with the delta x/y values.
; Return values .: None
; Author ........: BugFix
; ===============================================================================================================================
Func _GuiCtrlGroup_Set(ByRef $_structGroup, $_vValue, $_constFlag, $_aCtrlInside= Null)
Local $hWndGui = _WinAPI_GetParent(GUICtrlGetHandle($_structGroup.Background))
Local $idText = $_structGroup.Text
Local $idLeft = $_structGroup.Left
Local $idTopL = $_structGroup.TopL
Local $idTopR = $_structGroup.TopR
Local $idRight = $_structGroup.Right
Local $idBottom = $_structGroup.Bottom
Local $idBackground = $_structGroup.Background
Local $iAlign = $_structGroup.Align
Local $aSize, $aBott, $sTitle;, $vReturn = Null
If BitAND($_constFlag, $_GROUPBORDER_LEFT) Then GUICtrlSetBkColor($idLeft, $_vValue)
If BitAND($_constFlag, $_GROUPBORDER_TOPL) Then GUICtrlSetBkColor($idTopL, $_vValue)
If BitAND($_constFlag, $_GROUPBORDER_TOPR) Then GUICtrlSetBkColor($idTopR, $_vValue)
If BitAND($_constFlag, $_GROUPBORDER_RIGHT) Then GUICtrlSetBkColor($idRight, $_vValue)
If BitAND($_constFlag, $_GROUPBORDER_BOTTOM) Then GUICtrlSetBkColor($idBottom, $_vValue)
If BitAND($_constFlag, $_GROUPBACKGROUND) Then GUICtrlSetBkColor($idBackground, $_vValue)
If BitAND($_constFlag, $_GROUPTEXT_FORE) Then GUICtrlSetColor ($idText, $_vValue)
If BitAND($_constFlag, $_GROUPTEXT_BACK) Then GUICtrlSetBkColor($idText, $_vValue)
If BitAND($_constFlag, $_GROUPTEXT_TRANS) Then GUICtrlSetBkColor($idText, $GUI_BKCOLOR_TRANSPARENT)
If BitAND($_constFlag, $_GROUPTEXT_ITALIC) Then GUICtrlSetFont ($idText, Default, Default, 2)
If BitAND($_constFlag, $_GROUPTEXT_DEFAULT) Then GUICtrlSetFont ($idText, Default, Default, Default)
If BitAND($_constFlag, BitOR($_GROUPTEXT_LEFT,$_GROUPTEXT_CENTER,$_GROUPTEXT_RIGHT,$_GROUPTEXT_TEXT)) Then
$aSize = ControlGetPos($hWndGui, '', $idLeft)
$aBott = ControlGetPos($hWndGui, '', $idBottom)
Local $x = $aSize[0], $y = $aSize[1]
If $_vValue = '' Then
If BitAND($_constFlag, BitOR($_GROUPTEXT_LEFT,$_GROUPTEXT_CENTER,$_GROUPTEXT_RIGHT)) Then
$aSize = ControlGetPos($hWndGui, '', $idText)
Else
$aSize[2] = 0
EndIf
Else
Local $guiTmp = GUICreate('')
GUISwitch($guiTmp)
Local $idTmp = GUICtrlCreateLabel(' ' & $_vValue, 0, 0)
$aSize = ControlGetPos($guiTmp, '', $idTmp)
GUICtrlDelete($idTmp)
GUISwitch($hWndGui)
GUIDelete($guiTmp)
EndIf
Local $dLeft = 10
If $aSize[2] > $aBott[2] -12 Then $aSize[2] = $aBott[2] -12
If $aSize[2] > 0 Then
If BitAND($_constFlag, $_GROUPTEXT_CENTER) Then $dLeft = Int(($aBott[2]-$aSize[2])/2)
If BitAND($_constFlag, $_GROUPTEXT_RIGHT) Then $dLeft = $aBott[2]-10-$aSize[2]
EndIf
GUICtrlSetPos($idTopL, $x+1, $y, $dLeft-1, 1)
GUICtrlSetPos($idTopR, $x+$dLeft+$aSize[2], $y, $aBott[2]+2-$aSize[2]-$dLeft, 1)
GUICtrlSetPos($idText, $x+$dLeft, $y-7, $aSize[2], 17)
If BitAND($_constFlag, $_GROUPTEXT_TEXT) Then
If $_vValue <> '' Then $_vValue = ' ' & $_vValue
GUICtrlSetData($idText, $_vValue)
EndIf
EndIf
If BitAND($_constFlag, BitOR($_GROUP_MOVE_ABS,$_GROUP_MOVE_REL)) Then
If Not IsArray($_vValue) Then $_vValue = StringSplit($_vValue, ',', 2)
If UBound($_vValue) < 4 Then
ReDim $_vValue[4]
For $i = 1 To 3
If $_vValue[$i] = '' Then $_vValue[$i] = '*'
Next
EndIf
Local $bRel = False
If BitAND($_constFlag, $_GROUP_MOVE_REL) Then $bRel = True
GUISetState(@SW_LOCK, $hWndGui)
Local $aDelta = __SubCtrlMove($hWndGui, $_structGroup, $_vValue, $bRel, $iAlign)
; if an array with controls from inside the group is given - move them too
If IsArray($_aCtrlInside) Then
Local $aSize, $dX = $aDelta[0], $dY = $aDelta[1], $bhWnd, $opt = AutoitSetOption('GUICoordMode', 1)
For $i = 0 To UBound($_aCtrlInside) -1
$bhWnd = False
If IsHWnd($_aCtrlInside[$i]) Then
$bhWnd = True
$aSize = WinGetPos($_aCtrlInside[$i])
Else
$aSize = ControlGetPos($hWndGui, '', $_aCtrlInside[$i])
EndIf
__ControlMove($hWndGui, $bhWnd, $_aCtrlInside[$i], $aSize, $dX, $dY)
Next
AutoitSetOption('GUICoordMode', $opt)
EndIf
GUISetState(@SW_UNLOCK, $hWndGui)
EndIf
DllCall("user32.dll", "bool", "RedrawWindow", "hwnd", $hWndGui, "struct*", 0, "handle", 0, "uint", 5)
EndFunc ;==>_GuiCtrlGroup_Set
; #FUNCTION# ====================================================================================================================
; Name ..........: _GuiCtrlGroup_SetState
; Description ...: Changes the state of a _GuiCtrlGroup_Create() created control.
; Syntax ........: _GuiCtrlGroup_SetState(ByRef $_structGroup, $_iState, $_aCtrlInside, $_iTxtColor, $_iBGColor)
; Parameters ....: $_structGroup - Return value from _GuiCtrlGroup_Create()
; $_iState - The new state ($GUI_SHOW, $GUI_HIDE, $GUI_ENABLE, $GUI_DISABLE)
; If setting to DISABLE, you can set the title and background colors for this state.
; The previous colors will returned. You can use them for ENABLE again.
; If you use DISABLE without colors, the defaults will used (see constants on top).
; $_aCtrlInside - When you pass an array of controls, they are set to the same state as the group itself.
; $_iTxtColor - The title color if set to enable/disable
; $_iBGColor - The background color if set to enable/disable
; Return values .: Success - Structure with previous title and background color (if state was set to enable/disable)
; $tCOLOR.TextPrev / $tCOLOR.BGPrev
; Failure - returns -1, sets @error = 1
; Note ..........: Don't forget to catch the return, if sets the state to DISABLE. It's the easiest way to have the right colors to set back the ENABLE state.
; Author ........: BugFix
; ===============================================================================================================================
Func _GuiCtrlGroup_SetState(ByRef $_structGroup, $_iState, $_aCtrlInside=Null, $_iTxtColor=Null, $_iBGColor=Null)
If Not BitAND(BitOR($GUI_SHOW, $GUI_HIDE, $GUI_ENABLE, $GUI_DISABLE), $_iState) Then Return SetError(1,0,-1)
Local Static $aState[4][2] = [[$GUI_SHOW, @SW_SHOW], [$GUI_HIDE, @SW_HIDE], [$GUI_ENABLE, @SW_ENABLE], [$GUI_DISABLE, @SW_DISABLE]]
Local $hWndGui = _WinAPI_GetParent(GUICtrlGetHandle($_structGroup.Background))
Local $tCOLOR = DllStructCreate('int BGPrev;int TextPrev;')
If $_iState = $GUI_DISABLE Then
If $_iTxtColor = Null Then $_iTxtColor = $_GROUP_DISABLE_TXTDEF
If $_iBGColor = Null Then $_iBGColor = $_GROUP_DISABLE_BGDEF
EndIf
$tCOLOR.BGPrev = -1
$tCOLOR.TextPrev = -1
GuiCtrlSetState($_structGroup.Text, $_iState)
GuiCtrlSetState($_structGroup.Left, $_iState)
GuiCtrlSetState($_structGroup.TopL, $_iState)
GuiCtrlSetState($_structGroup.TopR, $_iState)
GuiCtrlSetState($_structGroup.Right, $_iState)
GuiCtrlSetState($_structGroup.Bottom, $_iState)
GuiCtrlSetState($_structGroup.Background, $_iState)
If IsArray($_aCtrlInside) Then
Local $iWinState
For $i = 0 To UBound($aState) -1
If $aState[$i][0] = $_iState Then
$iWinState = $aState[$i][1]
ExitLoop
EndIf
Next
For $i = 0 To UBound($_aCtrlInside) -1
If IsHWnd($_aCtrlInside[$i]) Then
WinSetState($_aCtrlInside[$i], '', $iWinState)
Else
GuiCtrlSetState($_aCtrlInside[$i], $_iState)
EndIf
Next
EndIf
If $_iTxtColor <> Null Then
If Not IsDeclared('WM_CTLCOLORSTATIC') Then Local Const $WM_CTLCOLORSTATIC = 0x0138
Local $hWnd = GUICtrlGetHandle($_structGroup.Text)
Local $hDC = _WinAPI_GetDC($hWnd)
Local $hMemDC = _WinAPI_CreateCompatibleDC($hDC)
_WinAPI_ReleaseDC($hWnd, $hDC)
Local $hBrush = _SendMessage($hWndGui, $WM_CTLCOLORSTATIC, $hMemDC, $hWnd)
Local $BGR = DllCall('gdi32.dll', 'int', 'GetTextColor', 'ptr', $hMemDC)
_WinAPI_DeleteDC($hMemDC)
$tCOLOR.TextPrev = BitOR(BitShift(BitAND($BGR[0], 0x0000FF), -16), BitAND($BGR[0], 0x00FF00), BitShift(BitAND($BGR[0], 0xFF0000), 16))
GUICtrlSetColor($_structGroup.Text, $_iTxtColor)
EndIf
If $_iBGColor <> Null Then
Local $hWnd = GUICtrlGetHandle($_structGroup.Background)
Local $hDC = _WinAPI_GetDC($hWnd)
$tCOLOR.BGPrev = _WinAPI_GetPixel($hDC, 0, 0)
_WinAPI_ReleaseDC($hWnd, $hDC)
GUICtrlSetBkColor($_structGroup.Background, $_iBGColor)
EndIf
DllCall("user32.dll", "bool", "RedrawWindow", "hwnd", $hWndGui, "struct*", 0, "handle", 0, "uint", 5)
Return $tCOLOR
EndFunc ;==>_GuiCtrlGroup_SetState
; == for internal use
Func __SubCtrlMove($_hGui, ByRef $_structGroup, $_aVal, $_bRel=False, $_iAlign=$_GROUPTEXT_LEFT)
Local $idText = $_structGroup.Text
Local $idLeft = $_structGroup.Left
Local $idTopL = $_structGroup.TopL
Local $idTopR = $_structGroup.TopR
Local $idRight = $_structGroup.Right
Local $idBottom = $_structGroup.Bottom
Local $idBackground = $_structGroup.Background
Local $dX, $dY, $dW, $dH
Local $aSize = ControlGetPos($_hGui, '', $idLeft)
Local $aBott = ControlGetPos($_hGui, '', $idBottom)
If $_bRel Then
$dX = $_aVal[0]
$dY = $_aVal[1]
$dW = $_aVal[2]
$dH = $_aVal[3]
If $dX = '*' Then $dX = 0
If $dY = '*' Then $dY = 0
If $dW = '*' Then $dW = 0
If $dH = '*' Then $dH = 0
Else
Local $x = $_aVal[0]
Local $y = $_aVal[1]
Local $width = $_aVal[2]
Local $height = $_aVal[3]
Local $x0 = $aSize[0]
Local $y0 = $aSize[1] -7
Local $width0 = $aBott[2]
Local $height0 = $aSize[3] +7
If $x = '*' Then $x = $x0
If $y = '*' Then $y = $y0
If $width = '*' Then $width = $width0
If $height = '*' Then $height = $height0
$dX = $x - $x0
$dY = $y - $y0
$dW = $width - $width0
$dH = $height - $height0
EndIf
GUICtrlSetPos($idLeft, $aSize[0]+($dX), $aSize[1]+($dY), 1, $aSize[3]+($dH))
GUICtrlSetPos($idBottom, $aBott[0]+($dX), $aBott[1]+($dY)+($dH), $aBott[2]+($dW))
$aSize = ControlGetPos($_hGui, '', $idTopL)
GUICtrlSetPos($idTopL, $aSize[0]+($dX), $aSize[1]+($dY))
$aSize = ControlGetPos($_hGui, '', $idTopR)
GUICtrlSetPos($idTopR, $aSize[0]+($dX), $aSize[1]+($dY), $aSize[2]+($dW))
$aSize = ControlGetPos($_hGui, '', $idRight)
GUICtrlSetPos($idRight, $aSize[0]+($dX)+($dW), $aSize[1]+($dY), 1, $aSize[3]+($dH))
$aSize = ControlGetPos($_hGui, '', $idBackground)
GUICtrlSetPos($idBackground, $aSize[0]+($dX), $aSize[1]+($dY), $aSize[2]+($dW), $aSize[3]+($dH))
$aSize = ControlGetPos($_hGui, '', $idText)
If ($dX <> 0) Or ($dY <> 0) Then GUICtrlSetPos($idText, $aSize[0]+($dX), $aSize[1]+($dY))
If $dW <> 0 Then _GuiCtrlGroup_Set($_structGroup, '', $_structGroup.Align)
Local $aDelta[] = [$dX,$dY]
Return $aDelta
EndFunc ;==>__SubCtrlMove
Func __ControlMove($_hWnd, $_bhWnd, $_vCtrl, $_aSize, $_dX, $_dY)
Local $aParent
If Not $_bhWnd Then
GUICtrlSetPos($_vCtrl, $_aSize[0]+($_dX), $_aSize[1]+($_dY))
Else
$aParent = WinGetPos($_hWnd)
WinMove($_vCtrl, '', $_aSize[0]-$aParent[0]-$_giSide+($_dX), $_aSize[1]-$aParent[1]-$_giTop+($_dY))
EndIf
EndFunc ;==>__ControlMove
;===============================================================================
; Function Name....: __SystemGetWindowBorder
; Description......: Calculates side and top border of window
; Author(s)........: BugFix
;===============================================================================
Func __SystemGetWindowBorder(ByRef $_iTopBorder, ByRef $_iSideBorder)
Local Const $SM_CYCAPTION = 4, $SM_CYEDGE = 46, $SM_CYBORDER = 6, $SM_CXBORDER = 5, $SM_CXEDGE = 45
Local $aMetrics[5][2] = [[$SM_CYCAPTION], [$SM_CYEDGE], [$SM_CYBORDER], [$SM_CXBORDER], [$SM_CXEDGE]]
Local $dll = DllOpen("user32.dll"), $aRet
For $i = 0 To 4
$aRet = DllCall($dll, "int", "GetSystemMetrics", "int", $aMetrics[$i][0])
If IsArray($aRet) Then $aMetrics[$i][1] = $aRet[0]
Next
DllClose($dll)
$_iTopBorder = $aMetrics[0][1] + $aMetrics[1][1] + $aMetrics[2][1]
$_iSideBorder = $aMetrics[3][1] + $aMetrics[4][1]
EndFunc ;==>__SystemGetWindowBorder
Alles anzeigen
#include <GroupEx.au3>
#include <GuiComboBox.au3>
Global $iGUIColor = 0xFFF9E5
Global $iBGColor = 0xE0F9FF, $iBorderColor = 0x00008B, $iTextColor = 0xC60707
Enum $lbName, $inName, $lbStatus, $inStatus, $lbOrt, $inOrt, $cbNormal, $lbNormal, $combo, $radio1, $radio2, $iCount
Global $aID[$iCount]
Global $radio3, $radio4
Global $hGui = GUICreate('Example GroupEx', 900, 700)
GUISetBkColor($iGUIColor)
; Group erstellen mit Title-Style Italic, Standardausrichtung links
Global $tGroup1 = _GuiCtrlGroup_Create($hGui, 'Device Information', 10, 55, 880, 155, $iBorderColor, $iTextColor, $iBGColor, $_GROUPTEXT_ITALIC)
$aID[$lbName] = GUICtrlCreateLabel('Title', 25, 83, 70)
_BKTrans(-1)
$aID[$inName] = GUICtrlCreateInput('', 100, 80, 200, 21)
$aID[$lbStatus] = GUICtrlCreateLabel('State', 310, 83, 40)
_BKTrans(-1)
$aID[$inStatus] = GUICtrlCreateInput('', 355, 80, 115, 21)
$aID[$lbOrt] = GUICtrlCreateLabel('Location', 485, 83, 50)
_BKTrans(-1)
$aID[$inOrt] = GUICtrlCreateInput('', 535, 80, 100, 21)
$aID[$cbNormal] = GUICtrlCreateCheckbox(' ', 655, 83, 13, 13)
$aID[$lbNormal] = GUICtrlCreateLabel(' Current Sample', 670, 83)
_BKTrans(-1)
$aID[$combo] = _GUICtrlComboBox_Create($hGui, '', 100, 110, 200, 30)
$aID[$radio1] = GUICtrlCreateRadio(' ', 320, 113, 13, 13)
GUICtrlSetState(-1, $GUI_CHECKED)
$aID[$radio2] = GUICtrlCreateRadio(' ', 340, 113, 13, 13)
_GuiCtrlGroup_Close()
$radio3 = GUICtrlCreateRadio(' ', 100, 350, 13, 13)
GUICtrlSetState(-1, $GUI_CHECKED)
$radio4 = GUICtrlCreateRadio(' ', 120, 350, 13, 13)
GUISetState()
_Msg('Move group downward by 100px with all internal controls ($aID)')
_GuiCtrlGroup_Set($tGroup1, '*,100', $_GROUP_MOVE_REL, $aID)
_Msg('Group title - set default style')
_GuiCtrlGroup_Set($tGroup1, '', $_GROUPTEXT_DEFAULT)
_Msg('Group title - set background color - feasible, but not so nice')
_GuiCtrlGroup_Set($tGroup1, 0xAAAAFF, $_GROUPTEXT_BACK)
_Msg('Group title - set background again transparency')
_GuiCtrlGroup_Set($tGroup1, '', $_GROUPTEXT_TRANS)
_Msg('Group title - set text color')
_GuiCtrlGroup_Set($tGroup1, 0x000080, $_GROUPTEXT_FORE)
_Msg('Group border - top and right - change color')
_GuiCtrlGroup_Set($tGroup1, 0xFF1234, BitOR($_GROUPBORDER_TOP,$_GROUPBORDER_RIGHT))
_Msg('Group title - centered')
_GuiCtrlGroup_Set($tGroup1, '', $_GROUPTEXT_CENTER)
_Msg('Group title - right')
_GuiCtrlGroup_Set($tGroup1, '', $_GROUPTEXT_RIGHT)
_Msg('Group area - change color')
_GuiCtrlGroup_Set($tGroup1, 0xAAFFAA, $_GROUPBACKGROUND)
_Msg('Group DISABLE (with all controls inside), border color and title BGColor stay unchanged')
; _GuiCtrlGroup_SetState(ByRef $_structGroup, $_iState, $_aCtrlInside= Null, $_iTxtColor=Null, $_iBGColor=Null)
; Here, the current color of title text and group area is queried before the disable color is set.
; The values read out are returned as struct and can then be used again in ENABLE.
Global $tColor = _GuiCtrlGroup_SetState($tGroup1, $GUI_DISABLE, $aID)
_Msg('Group ENABLE (with all controls inside)')
_GuiCtrlGroup_SetState($tGroup1, $GUI_ENABLE, $aID, $tColor.TextPrev, $tColor.BGPrev)
_Msg('Group HIDE (with all controls inside)')
_GuiCtrlGroup_SetState($tGroup1, $GUI_HIDE, $aID)
_Msg('Group SHOW (with all controls inside)')
_GuiCtrlGroup_SetState($tGroup1, $GUI_SHOW, $aID)
Do
Until GUIGetMsg() = -3
Func _BKTrans($_iID)
GUICtrlSetBkColor($_iID, $GUI_BKCOLOR_TRANSPARENT)
EndFunc
Func _Msg($_sMsg)
MsgBox(262208, 'Action', $_sMsg, 5)
EndFunc
Alles anzeigen
Ich denke es liegt daran, weil du die Controls mit Handle (Combo) mit WinSetState bearbeitest... da gibst du als Wert @SW_* an... bei den Controls mit ID aber $GUI_*.
==> ControlHide, ControlShow, ControlDisable, ControlEnable
For $i = 0 To UBound($_aCtrlInside) -1
$hCtrl = IsHWnd($_aCtrlInside[$i]) ? $_aCtrlInside[$i] : ControlGetHandle($hWndGui, '', $_aCtrlInside[$i])
Switch $_iState
Case $GUI_SHOW
ControlShow($hCtrl, '', '')
Case $GUI_HIDE
ControlHide($hCtrl, '', '')
Case $GUI_ENABLE
ControlEnable($hCtrl, '', '')
Case $GUI_DISABLE
ControlDisable($hCtrl, '', '')
EndSwitch
Next
Alles anzeigen
Edit: Der Fehler tritt auch auf, wenn die For-Next-Schleife nicht ausgeführt wird.
Edit: Es liegt an dieser Zeile...
GUICtrlSetState($_structGroup.Background, $_iState)
Oh man, war ein klassisches Eigentor.
Meine Groupelemente sind ja alle Label. Und wenn ich die Label auf Hide setze (was sinnfrei ist, da das keinen Einfluß auf das Aussehen hat), werden die darüber gelagerten Control nicht mehr klickbar, auch nicht nach Enable. Habe ich nun korrigiert.
Ich poste gleich die neue Version im Startpost.
So funktioniert es...
; #FUNCTION# ====================================================================================================================
; Name ..........: _GuiCtrlGroup_SetState
; Description ...: Changes the state of a _GuiCtrlGroup_Create() created control.
; Syntax ........: _GuiCtrlGroup_SetState(ByRef $_structGroup, $_iState, $_aCtrlInside, $_iTxtColor, $_iBGColor)
; Parameters ....: $_structGroup - Return value from _GuiCtrlGroup_Create()
; $_iState - The new state ($GUI_SHOW, $GUI_HIDE, $GUI_ENABLE, $GUI_DISABLE)
; If setting to DISABLE, you can set the title and background colors for this state.
; The previous colors will returned. You can use them for ENABLE again.
; If you use DISABLE without colors, the defaults will used (see constants on top).
; $_aCtrlInside - When you pass an array of controls, they are set to the same state as the group itself.
; $_iTxtColor - The title color if set to enable/disable
; $_iBGColor - The background color if set to enable/disable
; Return values .: Success - Structure with previous title and background color (if state was set to enable/disable)
; $tCOLOR.TextPrev / $tCOLOR.BGPrev
; Failure - returns -1, sets @error = 1
; Note ..........: Don't forget to catch the return, if sets the state to DISABLE. It's the easiest way to have the right colors to set back the ENABLE state.
; Author ........: BugFix
; ===============================================================================================================================
Func _GuiCtrlGroup_SetState(ByRef $_structGroup, $_iState, $_aCtrlInside = Null, $_iTxtColor = Null, $_iBGColor = Null)
If Not BitAND(BitOR($GUI_SHOW, $GUI_HIDE, $GUI_ENABLE, $GUI_DISABLE), $_iState) Then Return SetError(1, 0, -1)
Local $hWndGui = _WinAPI_GetParent(GUICtrlGetHandle($_structGroup.Background))
Local $tCOLOR = DllStructCreate('int BGPrev;int TextPrev;')
If $_iState = $GUI_DISABLE Then
If $_iTxtColor = Null Then $_iTxtColor = $_GROUP_DISABLE_TXTDEF
If $_iBGColor = Null Then $_iBGColor = $_GROUP_DISABLE_BGDEF
EndIf
$tCOLOR.BGPrev = -1
$tCOLOR.TextPrev = -1
If $_iState = $GUI_SHOW Or $_iState = $GUI_HIDE Then
GUICtrlSetState($_structGroup.Text, $_iState)
GUICtrlSetState($_structGroup.Left, $_iState)
GUICtrlSetState($_structGroup.TopL, $_iState)
GUICtrlSetState($_structGroup.TopR, $_iState)
GUICtrlSetState($_structGroup.Right, $_iState)
GUICtrlSetState($_structGroup.Bottom, $_iState)
GUICtrlSetState($_structGroup.Background, $_iState)
EndIf
If IsArray($_aCtrlInside) Then
Local $hCtrl
For $i = 0 To UBound($_aCtrlInside) - 1
$hCtrl = IsHWnd($_aCtrlInside[$i]) ? $_aCtrlInside[$i] : ControlGetHandle($hWndGui, '', $_aCtrlInside[$i])
Switch $_iState
Case $GUI_SHOW
ControlShow($hCtrl, '', '')
Case $GUI_HIDE
ControlHide($hCtrl, '', '')
Case $GUI_ENABLE
ControlEnable($hCtrl, '', '')
Case $GUI_DISABLE
ControlDisable($hCtrl, '', '')
EndSwitch
Next
EndIf
If $_iTxtColor <> Null Then
If Not IsDeclared('WM_CTLCOLORSTATIC') Then Local Const $WM_CTLCOLORSTATIC = 0x0138
Local $hWnd = GUICtrlGetHandle($_structGroup.Text)
Local $hDC = _WinAPI_GetDC($hWnd)
Local $hMemDC = _WinAPI_CreateCompatibleDC($hDC)
_WinAPI_ReleaseDC($hWnd, $hDC)
Local $hBrush = _SendMessage($hWndGui, $WM_CTLCOLORSTATIC, $hMemDC, $hWnd)
Local $BGR = DllCall('gdi32.dll', 'int', 'GetTextColor', 'ptr', $hMemDC)
_WinAPI_DeleteDC($hMemDC)
$tCOLOR.TextPrev = BitOR(BitShift(BitAND($BGR[0], 0x0000FF), -16), BitAND($BGR[0], 0x00FF00), BitShift(BitAND($BGR[0], 0xFF0000), 16))
GUICtrlSetColor($_structGroup.Text, $_iTxtColor)
EndIf
If $_iBGColor <> Null Then
Local $hWnd = GUICtrlGetHandle($_structGroup.Background)
Local $hDC = _WinAPI_GetDC($hWnd)
$tCOLOR.BGPrev = _WinAPI_GetPixel($hDC, 0, 0)
_WinAPI_ReleaseDC($hWnd, $hDC)
GUICtrlSetBkColor($_structGroup.Background, $_iBGColor)
EndIf
DllCall("user32.dll", "bool", "RedrawWindow", "hwnd", $hWndGui, "struct*", 0, "handle", 0, "uint", 5)
Return $tCOLOR
EndFunc ;==>_GuiCtrlGroup_SetState
Alles anzeigen
Neu v0.11
Nun ist auch das Auffangen/Setzen der Farbe beim Disable/Enable nicht mehr erforderlich.
Neu v0.12
Ein paar Optimierungen.
Neu v 0.14
Für den Titel können Fontname und -größe bestimmt werden.
SCRIPT BREAKING CHANGE: Parameter für Parent-Gui nicht mehr erforderlich.
SCRIPT BREAKING CHANCE
Du meinst sicher SCRIPT BREAKING CHANGE
Du meinst sicher SCRIPT BREAKING CHANGE
Na klar - aber eine Chance ist es doch auch?