BugFix Posted June 1, 2018 Share Posted June 1, 2018 (edited) In my opinion, I posted a previous version years ago, but I could not find anything. So here for you: With GroupEx.au3 you can create another kind of group controls. It is a collection of labels, which is returned as a structure, consisting of the following elements: .Text = title text .Left = left side of border .TopL = top side of border - left from title .TopR = top side of border - right from title .Right = right side of border .Bottom = bottom side of border .Background = area inside the borders Functions: _GuiCtrlGroup_Create - Creates a group control as collection of labels_GuiCtrlGroup_Close - Closes a group (new in v0.10) _GuiCtrlGroup_Set - Changes values of a _GuiCtrlGroup_Create() created control. _GuiCtrlGroup_SetState - Changes the state of a _GuiCtrlGroup_Create() created control. - Style The title text can have normal or italic style. I did not use style bold, font and size because it would destroy the arithmetic of the group. Underlined or striked style is not usefull for title. - Colors For each element of the structure you can set different colors. The title has by default as back color $GUI_BKCOLOR_TRANSPARENT. You can change this color too, but it looks not so nice. - Movement You can move the group (absolute or relative to the parent) and the controls inside too (passed as array of ID). - State You can change the state of a group ($GUI_SHOW, $GUI_HIDE, $GUI_ENABLE, $GUI_DISABLE) and the state for all controls inside too (passed as array of ID). If setting to DISABLE, you can set the title and background colors for this state. The previous colors will returned as structure. You can use them for ENABLE again. If you use DISABLE without colors, the defaults will used (see constants on top of the script). EDIT 02.06.2018 NEW: - Now non-native controls (e.g. _GUICtrlComboBox_Create) are also taken into account when moving and setting the status. - Function _GuiCtrlGroup_Close to close a group. FIXED: Error after disabling / enabling - controls inside was'nt clickable EDIT 12.06.2018 v0.13 Some little changes: - The current used color for title and group area will stored in the group-structure in the moment, you set to disable. Therefore are the color parameters in the function _GuiCtrlGroup_SetState() optional. - The default disable/enable state uses the system colors. - In functions _GuiCtrlGroup_Set() and _GuiCtrlGroup_SetState() you can pass an array of ID or a single ID variable. GroupEx.au3 v0.13 expandcollapse popup;-- TIME_STAMP 2018-06-12 09:01:34 v 0.13 #include-once #include <GUIConstantsEx.au3> #include <WindowsConstants.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 = _WinAPI_GetSysColor($COLOR_GRAYTEXT) ; == the default title color value, if disabling the group ; == get system metrics Global $_giTop, $_giSide __SystemGetWindowBorder($_giTop, $_giSide) ; == get system colors Global Const $_giActiveWindowBG = _WinAPI_GetSysColor($COLOR_WINDOW) Global Const $_giEnabledText = _WinAPI_GetSysColor($COLOR_WINDOWTEXT) Global Const $_giActiveBorder = _WinAPI_GetSysColor($COLOR_ACTIVEBORDER) ; #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 = $COLOR_ACTIVEBORDER, -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 = $_giActiveBorder 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;int BGPrev;int TextPrev;" 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) $tGROUP.BGPrev = ($_iBackCol = -1 ? $_giActiveWindowBG : $_iBackCol) $tGROUP.TextPrev = ($_iForeCol = -1 ? $_giEnabledText : $_iForeCol) GUIStartGroup() Return $tGROUP EndFunc ;==>_GuiCtrlGroup_Create ; #FUNCTION# ==================================================================================================================== ; Name ..........: _GuiCtrlGroup_Close ; Description ...: Starts a new group and so the previous group will closed ; Syntax ........: _GuiCtrlGroup_Close() ; 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 - [optional] With action flag $_GROUP_MOVE_ABS/$_GROUP_MOVE_REL you can give an array of controls ; (or a single control variable) 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 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) $_structGroup.BGPrev = $_vValue EndIf If BitAND($_constFlag, $_GROUPTEXT_FORE) Then GUICtrlSetColor($idText, $_vValue) $_structGroup.TextPrev = $_vValue EndIf 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 $_aCtrlInside <> Null Then If Not IsArray($_aCtrlInside) Then Local $aTmp[1] = [$_aCtrlInside] $_aCtrlInside = $aTmp EndIf 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) ; $_aCtrlInside - [optional] When you pass an array of controls (or a single control variable), they are set to the same state as the group itself. ; $_iTxtColor - [optional] The title color if set to disable/enable. With 'Null' the default/previous color will used. "-1" uses the system color. ; $_iBGColor - [optional] The background color if set to disable/enable. With 'Null' the default/previous color will used. "-1" uses the system color. ; Return values .: Failure - returns -1, sets @error = 1 (Wrong state value) ; 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)) Switch $_iState ; select the colors to set in the new state Case $GUI_DISABLE If $_iTxtColor = Null Then $_iTxtColor = $_GROUP_DISABLE_TXTDEF If $_iBGColor = Null Then $_iBGColor = $_GROUP_DISABLE_BGDEF Case $GUI_ENABLE If $_iTxtColor = Null Then $_iTxtColor = $_structGroup.TextPrev If $_iBGColor = Null Then $_iBGColor = $_structGroup.BGPrev $_structGroup.TextPrev = ($_iTxtColor = -1 ? $_giEnabledText : $_iTxtColor) $_structGroup.BGPrev = ($_iBGColor = -1 ? $_giActiveWindowBG : $_iBGColor) EndSwitch GUISetState(@SW_LOCK, $hWndGui) GuiCtrlSetState($_structGroup.Text, $_iState) If $_iState = $GUI_SHOW Or $_iState = $GUI_HIDE Then 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 $_aCtrlInside <> Null Then If Not IsArray($_aCtrlInside) Then Local $aTmp[1] = [$_aCtrlInside] $_aCtrlInside = $aTmp EndIf 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 GUICtrlSetColor($_structGroup.Text, $_iTxtColor) If $_iBGColor <> Null Then GUICtrlSetBkColor($_structGroup.Background, $_iBGColor) GUISetState(@SW_UNLOCK, $hWndGui) DllCall("user32.dll", "bool", "RedrawWindow", "hwnd", $hWndGui, "struct*", 0, "handle", 0, "uint", 5) 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 Example expandcollapse popup#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) ; create group with title style italic, default align left 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) ConsoleWrite('CREATION BG: ' & $tGroup1.BGPrev & ', hex: 0x' & Hex($tGroup1.BGPrev,6) & @CRLF) _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 stored before the disable color is set. ; With Null for colors, the defaults will used. _GuiCtrlGroup_SetState($tGroup1, $GUI_DISABLE, $aID) _Msg('Group ENABLE (with all controls inside)') _GuiCtrlGroup_SetState($tGroup1, $GUI_ENABLE, $aID) ; without color parameter, the previous colors will used ;~ _GuiCtrlGroup_SetState($tGroup1, $GUI_ENABLE, $aID, Null, 0xAAAAFF) ; you can change the title and group area (BG) color (to omit one, use Null) _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 GroupEx[0.13].au3 Edited June 12, 2018 by BugFix x_bennY, Gianni and IanN1990 3 Best Regards BugFix Link to comment Share on other sites More sharing options...
IanN1990 Posted June 1, 2018 Share Posted June 1, 2018 This looks amazing! Excellent work. Link to comment Share on other sites More sharing options...
BugFix Posted June 2, 2018 Author Share Posted June 2, 2018 New version v0.10 Have forgot the function to close the group - now exists this. After disabling and enabling, the controls inside wasn't clickable. Fixed.Now non-native controls (e.g. _GUICtrlComboBox_Create) are also taken into account when moving and setting the status. Best Regards BugFix Link to comment Share on other sites More sharing options...
BugFix Posted June 12, 2018 Author Share Posted June 12, 2018 New version v0.13 Some small changes. See 1st post. Best Regards BugFix Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now