Jump to content



Photo

GUIExtender - Original version


  • This topic is locked This topic is locked
123 replies to this topic

#1 Melba23

Melba23

    Yes, me!

  • Moderators
  • 15,318 posts

Posted 01 August 2010 - 10:12 AM

New version 21 Feb 12

New: You can now choose the manner in which the GUI extends/retracts by adding a parameter to _GUIExtender_Init. This parameter sets the fixed point of the GUI: Left/Top (default and current behaviour), Centre, Right/Bottom. This fixed point can be overridden for a specific section by using a similar parameter in a _GUIExtender_Section_Extend call. See the new examples for more details.

Thanks to mechaflash213 for the idea. :blink:

This is a non-scriptbreaking change - all current scripts will perform as before. :nuke:

New UDF, examples and zip in this post. ;)

Previous updates:
Spoiler


A recent forum question asked how to have expandable sections in a GUI. Although the coding to do this was not too difficult, it was a bit messy and not too easy to modify for another GUI - as subsequent posts in the thread showed.

So I thought I might develop a UDF to do the same thing, but in as transparent manner as possible - and came up with GUIExtender. This UDF allows you to have multiple sections within a GUI which can be static or extendable. The extendable sections can be extended and retracted either by UDF created buttons or programmatically. The controls on the sections are fully functional and there is no overlap problem when retracted (see the details section if you want to know how). And the UDF can be used in both MessageLoop and OnEvent modes.

Here are several examples:
Spoiler


Some details for the curious among you who might want to know a bit more about how GUIExtender works:
Spoiler


New - And finally, the GUIExtender UDF itself - just put it in the same folder as the examples:
AutoIt         
#include-once ; #INDEX# ============================================================================================================ ; Title .........: GUIExtender ; AutoIt Version : v3.3 or higher ; Language ......: English ; Description ...: Extends and retracts user-defined sections of a GUI either vertically or horizontally ; Remarks .......: ; Note ..........: ; Author(s) .....: Melba23 ; ==================================================================================================================== ;#AutoIt3Wrapper_au3check_parameters=-d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6 -w 7 ; #GLOBAL VARIABLES# ================================================================================================= ; Declare array to hold section data Global $aGUIExt_Section_Data[1][9] = [[0, 0, 1, 0, "", 9999]] ; [0][0] = Section count                                            [n][0] = Initial section X/Y-coord ; [0][1] = Orientation - 0 = Vertical, 1 = Horizontal               [n][1] = Section height/width (inc border) ; [0][2] = All state - 0 = all retracted, 1 = at least 1 extended   [n][2] = Section state - 0 = Retracted, 1 = extended, 2 = static ; [0][3] = GUI handle                                               [n][3] = Section anchor ControlID (invisible disabled label) ; [0][4] = Fixed point - 0 = Left/Top, 1 = Centre, 2 = Right/Bottom [n][4] = Section final ControlID ; [0][5] = Action all button ControlID                              [n][5] = Section action button ControlID ; [0][6] = Action all button extended text                          [n][6] = Section action button extended text ; [0][7] = Action all button retracted text                         [n][7] = Section action button retracted text ; [0][8] = Action all button type                                   [n][8] = Section action button type ; Declare array to hold data about embedded objects Global $aGUIExt_Obj_Data[1][2] = [[0]] ; [0][0] = Object count ; [n][0] = Embedded object ControlID ; [n][1] = Original object handle ; Declare flag for section action Global $fGUIExt_SectionAction = False ; #CURRENT# ========================================================================================================== ; _GUIExtender_Init:           Initialises the GUI containing the sections and sets orientation and fixed point ; _GUIExtender_Section_Start:  Marks the start point of GUI section ; _GUIExtender_Section_End:    Marks the end of a GUI section ; _GUIExtender_Section_Action: Creates normal or push buttons to action extension or retraction of GUI sections ; _GUIExtender_Action:         Used in GUIGetMsg loops to detect clicks on section action buttons ; _GUIExtender_Restore:        Used reset GUI after a MINIMIZE and RESTORE ; _GUIExtender_Section_Extend: Actions section extension or retraction programatically or via section action buttons ; _GUIExtender_Section_State:  Returns state of section ; _GUIExtender_UDFCtrlCheck:   Hides/Shows and moves UDF-created controls when sections are extended/retracted ; _GUIExtender_ActionCheck:    Indicates when sections are extended/retracted so that _GUIExtender_UDFCtrlCheck can be called ; _GUIExtender_Obj_Data:       Store additional info on embedded objects ; _GUIExtender_Clear:          Called on GUI deletion to clear the data array ready for a new GUI to be initialised ; ==================================================================================================================== ; #INTERNAL_USE_ONLY#================================================================================================= ; _GUIExtender_Section_All_Extend:   Actions all moveable sections ; _GUIExtender_Section_Action_Event: Used to detect clicks on section action buttons in OnEvent mode ; ==================================================================================================================== ; #FUNCTION# ========================================================================================================= ; Name...........: _GUIExtender_Init ; Description ...: Initialises the GUI containing the sections and sets orientation and fixed point ; Syntax.........: _GUIExtender_Init($hWnd[, $iOrient = 0[, $iFixed = 0]]) ; Parameters ....: $hWnd - Handle of GUI containing the sections ;                  $iOrient - 0 = Vert - GUI extends and retracts in vertical sense ;                             1 = Horz - GUI extends and retracts in horizontal sense ;                  $iFixed  - 0 = GUI Left/Top fixed (Default) ;                             1 = GUI centre fixed ;                             2 = GUI Right/Bottom fixed ; Requirement(s).: v3.3 + ; Return values .: Success:  Returns 1 ;                  Failure:  Returns 0 and sets @error as follows: ;                  1 = Invalid handle ;                  2 = Existing initialisation ;                  3 = Invalid parameter with @extended set: 1 = $iOrient, 2 $iFixed ; Author ........: Melba23 ; Remarks .......: This function should be called before any controls are created within the GUI ;                  Only one GUI can be initialised at any one time.  _GUIExtender_Clear must be called before a second ;                  GUI can be initialised.  The previous GUI loses all extension/retraction ability ; Example........: Yes ;===================================================================================================================== Func _GUIExtender_Init($hWnd, $iOrient = 0, $iFixed = 0)     ; Check valid handle     If Not IsHWnd($hWnd) Then Return SetError(1, 0, 0)     ; Check for existing initialisation     If $aGUIExt_Section_Data[0][3] Then Return SetError(2, 0, 0)     ; Check for valid parameters     Switch $iOrient         Case 0, 1             ; Valid         Case Else             Return SetError(3, 1, 0)     EndSwitch     Switch $iFixed         Case 0, 1, 2             ; Valid         Case Else             Return SetError(3, 2, 0)     EndSwitch     ; Store GUI handle     $aGUIExt_Section_Data[0][3] = $hWnd     ; Store orientation     $aGUIExt_Section_Data[0][1] = $iOrient     ; Store fixed point     $aGUIExt_Section_Data[0][4] = $iFixed     ; Set resizing mode to prevent resizing of controls     Opt("GUIResizeMode", 0x0322) ; $GUI_DOCKALL     ; Set automatic restore function for OnEvent mode scripts     GUISetOnEvent(-5, "_GUIExtender_Restore") ; $GUI_EVENT_RESTORE     Return 1 EndFunc ; #FUNCTION# ========================================================================================================= ; Name...........: _GUIExtender_Section_Start ; Description ...: Marks the start point of GUI section ; Syntax.........: _GUIExtender_Section_Start($iSection_Coord, $iSection_Size) ; Parameters ....: $iSection_Coord - Coordinates of left/top edge of section depending on orientation ;                  $iSection_Size  - Width/Height of section ; Requirement(s).: v3.3 + ; Return values .: Success:  Returns section ID ;                  Failure:  Returns 0 and sets @error as follows: ;                  1 = Section overlaps with previous section ; Author ........: Melba23 ; Remarks .......: The function creates a disabled label to act as an anchor for the section position ;                  The function must be called BEFORE any controls in the section have been cretaed ; Example........: Yes ;===================================================================================================================== Func _GUIExtender_Section_Start($iSection_Coord, $iSection_Size)     If $aGUIExt_Section_Data[0][0] > 1 Then         ; Check section start is after previous section end         If $aGUIExt_Section_Data[$aGUIExt_Section_Data[0][0] - 1][0] + $aGUIExt_Section_Data[$aGUIExt_Section_Data[0][0] - 1][1] > $iSection_Coord Then Return SetError(1, 0, 0)     EndIf     ; Add new section     $aGUIExt_Section_Data[0][0] += 1     ; ReDim array if required     If UBound($aGUIExt_Section_Data) < $aGUIExt_Section_Data[0][0] + 1 Then         ReDim $aGUIExt_Section_Data[$aGUIExt_Section_Data[0][0] + 1][9]     EndIf     ; Store passed position and size parameters     $aGUIExt_Section_Data[$aGUIExt_Section_Data[0][0]][0] = $iSection_Coord     $aGUIExt_Section_Data[$aGUIExt_Section_Data[0][0]][1] = $iSection_Size     ; Set state to static if not already set     If $aGUIExt_Section_Data[$aGUIExt_Section_Data[0][0]][2] = "" Then $aGUIExt_Section_Data[$aGUIExt_Section_Data[0][0]][2] = 2     ; Create a zero size disabled label to act as an anchor for the section     If $aGUIExt_Section_Data[0][1] Then ; Depending on orientation         $aGUIExt_Section_Data[$aGUIExt_Section_Data[0][0]][3] = GUICtrlCreateLabel("", $iSection_Coord, 0, 1, 1)     Else         $aGUIExt_Section_Data[$aGUIExt_Section_Data[0][0]][3] = GUICtrlCreateLabel("", 0, $iSection_Coord, 1, 1)     EndIf     GUICtrlSetBkColor(-1, -2) ; $GUI_BKCOLOR_TRANSPARENT     GUICtrlSetState(-1, 128) ; $GUI_DISABLE     ; Set dummy action ControlID if needed     If $aGUIExt_Section_Data[$aGUIExt_Section_Data[0][0]][5] = "" Then $aGUIExt_Section_Data[$aGUIExt_Section_Data[0][0]][5] = 9999     ; Return section ID     Return $aGUIExt_Section_Data[0][0] EndFunc ; #FUNCTION# ========================================================================================================= ; Name...........: _GUIExtender_Section_End ; Description ...: Marks the end point of GUI section ; Syntax.........: _GUIExtender_Section_End() ; Parameters ....: None ; Requirement(s).: v3.3 + ; Return values .: None ; Author ........: Melba23 ; Remarks .......: The function must be called AFTER all the controls in the section have been created ; Example........: Yes ;===================================================================================================================== Func _GUIExtender_Section_End()     ; Determine End ControlID for the section     $aGUIExt_Section_Data[$aGUIExt_Section_Data[0][0]][4] = GUICtrlCreateDummy() - 1 EndFunc ; #FUNCTION# ========================================================================================================= ; Name...........: _GUIExtender_Section_Action ; Description ...: Creates controls to action extension or retraction of GUI sections ; Syntax.........: _GUIExtender_Section_Action($iSection[, $sText_Extended = ""[, $sText_Retracted = ""[, $iX = 0[, $iY = 0[, $iW = 0[, $iH = 0[, $iType = 0[, $iEventMode = 0]]]]]]]]]) ; Parameters ....: $iSection      - Section to action - 0 = all extendable sections ;                  $sText_Extended - Text on button when section is extended - default: small up/left arrow ;                  $sText_Retracted - Text on button when section is retracted - default: small down/right arrow ;                  $iX - Left side of the button ;                  $iY - Top of the button ;                  $iW - Width of the button ;                  $iH - Height of the button ;                  $iType - Type of button: ;                           0 = pushbutton (default) ;                           1 = normal button ;                  $iEventMode - Set to 1 if using OnEvent mode ;                           In this case, the control is automatically linked to the _GUIExtender_Section_Action_Event function ; Requirement(s).: v3.3 + ; Return values .: Success:  Returns 1 ;                  Failure:  Returns 0 and sets @error as follows: ;                  1 = Control not created ; Author ........: Melba23 ; Remarks .......: Sections are static unless an action control has been set ;                  Omitting all optional parameters creates a section which can be actioned programmatically ; Example........: Yes ;===================================================================================================================== Func _GUIExtender_Section_Action($iSection, $sText_Extended = "", $sText_Retracted = "", $iX = 0, $iY = 0, $iW = 1, $iH = 1, $iType = 0, $iEventMode = 0)     ; ReDim array if required     If $iSection > 1 And UBound($aGUIExt_Section_Data) < $iSection + 1 Then         ReDim $aGUIExt_Section_Data[$iSection + 1][9]     EndIf     ; Set state to extended indicating a extendable section     $aGUIExt_Section_Data[$iSection][2] = 1     ; If default arrows required     Local $iDef_Arrows = 0     If $sText_Extended = "" And $sText_Retracted = "" Then         $iDef_Arrows = 1         If $aGUIExt_Section_Data[0][1] Then ; Dependiing on orientation             $sText_Extended = 3             $sText_Retracted = 4         Else             $sText_Extended = 5             $sText_Retracted = 6         EndIf     EndIf     ; What type of button?     Switch $iType         ; Pushbutton         Case 0             ; Create normal button             $aGUIExt_Section_Data[$iSection][5] = GUICtrlCreateButton($sText_Extended, $iX, $iY, $iW, $iH)         Case Else             ; Create pushbutton             $aGUIExt_Section_Data[$iSection][5] = GUICtrlCreateCheckBox($sText_Extended, $iX, $iY, $iW, $iH, 0x1000) ; $BS_PUSHLIKE             ; Set button state             GUICtrlSetState(-1, 1) ; $GUI_CHECKED     EndSwitch     ; Check for error     If $aGUIExt_Section_Data[$iSection][5] = 0 Then Return SetError(2, 0, 0)     ; Change font if default arrows required     If $iDef_Arrows Then GUICtrlSetFont($aGUIExt_Section_Data[$iSection][5], 10, 400, 0, "Webdings")     ; Set event function if required     If $iEventMode Then GUICtrlSetOnEvent($aGUIExt_Section_Data[$iSection][5], "_GUIExtender_Section_Action_Event")     ; Store required text     $aGUIExt_Section_Data[$iSection][6] = $sText_Extended     $aGUIExt_Section_Data[$iSection][7] = $sText_Retracted     ; Store button type     $aGUIExt_Section_Data[$iSection][8] = $iType     Return 1 EndFunc ; #FUNCTION# ========================================================================================================= ; Name...........: _GUIExtender_Action ; Description ...: Used in GUIGetMsg loops to detect clicks on section action buttons and $GUI_EVENT_RESTORE events ; Syntax.........: _GUIExtender_Action($iMsg) ; Parameters ....: $iMsg - Return from GUIGetMsg ; Requirement(s).: v3.3 + ; Return values .: None ; Author ........: Melba23 ; Remarks .......: The return from GUIGetMsg is passed to this function to determine if a section action control was clicked ; Example........: Yes ;===================================================================================================================== Func _GUIExtender_Action($iMsg)     ; If GUI is restored, run the restore function     If $iMsg = -5 Then _GUIExtender_Restore() ; $GUI_EVENT_RESTORE     ; Check if an action control has been clicked     For $i = 0 To $aGUIExt_Section_Data[0][0]         ; If action button clicked         If $iMsg = $aGUIExt_Section_Data[$i][5] Then             ; Check current state             Switch $aGUIExt_Section_Data[$i][2]                 Case 0                     _GUIExtender_Section_Extend($i, True)                 Case Else                     _GUIExtender_Section_Extend($i, False)             EndSwitch             ; Set flag for section action occurring             $fGUIExt_SectionAction = True         EndIf     Next EndFunc ; #FUNCTION# ========================================================================================================= ; Name...........: _GUIExtender_Restore ; Description ...: Used to reset GUI after a MINIMIZE and RESTORE ; Syntax.........: _GUIExtender_Restore() ; Parameters ....: None ; Requirement(s).: v3.3 + ; Return values .: None ; Author ........: Melba23 ; Remarks .......: The GUI is not correctly restored after a MINIMIZE if a section is retracted.  This function cycles ;                  the highest extendable section to reset the correct position of the controls ; Example........: Yes ;===================================================================================================================== Func _GUIExtender_Restore()     ; Hide the GUI to prevent excess flicker     GUISetState(@SW_HIDE, $aGUIExt_Section_Data[0][3])     ; Look for the highest extendable function     For $i = UBound($aGUIExt_Section_Data) - 1 To 1 Step -1         If $aGUIExt_Section_Data[$i][2] <> 2 Then             ; Depending on current state, cycle extendable section             Switch $aGUIExt_Section_Data[$i][2]                 Case 0                     _GUIExtender_Section_Extend($i)                     _GUIExtender_Section_Extend($i, False)                 Case 1                     _GUIExtender_Section_Extend($i, False)                     _GUIExtender_Section_Extend($i)             EndSwitch             ExitLoop         EndIf     Next     ; Show GUI again     GUISetState(@SW_SHOW, $aGUIExt_Section_Data[0][3]) EndFunc ; #FUNCTION# ========================================================================================================= ; Name...........: _GUIExtender_Section_Extend ; Description ...: Actions section extension or retraction programatically or via section action buttons ; Syntax.........: _GUIExtender_Section_Extend($iSection[, $fExtend = True[, $iFixed]]) ; Parameters ....: $iSection - Section to action - 0 = all moveable sections ;                  $fExtend  - True = extend; False = retract ;                  $iFixed    - 0 = Left/Top fixed ;                               1 = Expand/contract centred ;                               2 = Right/bottom fixed ;                               Any other value = Default as set by _GUIExtender_Init (default) ; Requirement(s).: v3.3 + ; Return values .: Success:  Returns 1 ;                  Failure:  Returns 0 and sets @error as follows: ;                  1 = Invalid section ID (@extended: 1 = not in array, 2 = no _Start function used) ;                  2 = Section already in required state ;                  3 = GUI minimized ; Author ........: Melba23 ; Remarks .......: This function is called by the UDF when the section action buttons are clicked, ;                  but can also be called programatically ; Example........: Yes ;===================================================================================================================== Func _GUIExtender_Section_Extend($iSection, $fExtend = True, $iFixed = 9)     Local $aPos, $iCID, $iDelta_GUI     ; Check GUI is not minimized     If BitAND(WinGetState($aGUIExt_Section_Data[0][3]), 16) Then Return SetError(3, 0, 0)     ; Check if all sections to be actioned     If $iSection = 0 Then         _GUIExtender_Section_All_Extend($fExtend)         Return 1     EndIf     ; Check for invalid section (either outside array or no _Start function called)     If $iSection > UBound($aGUIExt_Section_Data) - 1 Then Return SetError(1, 1, 0)     If $aGUIExt_Section_Data[$iSection][1] = "" Then Return SetError(1, 2, 0)     ; Check if state already matches demand     If ($aGUIExt_Section_Data[$iSection][2] = 1 And $fExtend = True) Or ($aGUIExt_Section_Data[$iSection][2] = 0 And $fExtend = False) Then Return SetError(2, 0, 0)     ; Check Move state     Switch $iFixed         Case 0, 1, 2             ; Do nothing         Case Else             ; Set default value             $iFixed = $aGUIExt_Section_Data[0][4]     EndSwitch     ; Get current GUI size and set function calculation values     Local $aGUIPos = WinGetPos($aGUIExt_Section_Data[0][3])     Local $iGUI_Fixed = $aGUIPos[2]     Local $iGUI_Adjust = $aGUIPos[3]     If $aGUIExt_Section_Data[0][1] Then ; If Horz orientation         $iGUI_Fixed = $aGUIPos[3]         $iGUI_Adjust = $aGUIPos[2]     EndIf     ; Determine action required     If $fExtend Then         ; Change button text         GUICtrlSetData($aGUIExt_Section_Data[$iSection][5], $aGUIExt_Section_Data[$iSection][6])         ; Force action control state if needed         If $aGUIExt_Section_Data[$iSection][8] = 1 Then GUICtrlSetState($aGUIExt_Section_Data[$iSection][5], 1) ; $GUI_CHECKED         ; Set section state         $aGUIExt_Section_Data[$iSection][2] = 1         ; Add size of section being extended         $iGUI_Adjust += $aGUIExt_Section_Data[$iSection][1]     Else         ; Change button text         GUICtrlSetData($aGUIExt_Section_Data[$iSection][5], $aGUIExt_Section_Data[$iSection][7])         ; Force action control state if needed         If $aGUIExt_Section_Data[$iSection][8] = 1 Then GUICtrlSetState($aGUIExt_Section_Data[$iSection][5], 4) ; $GUI_UNCHECKED         ; Set section state         $aGUIExt_Section_Data[$iSection][2] = 0         ; Subtract size of section being hidden         $iGUI_Adjust -= $aGUIExt_Section_Data[$iSection][1]     EndIf     ; Hide all sections to prevent ghosting when changing GUI size     For $i = $aGUIExt_Section_Data[1][3] To $aGUIExt_Section_Data[$aGUIExt_Section_Data[0][0]][4]         GUICtrlSetState($i, 32) ; $GUI_HIDE     Next     ; Resize and possibly move GUI     If $aGUIExt_Section_Data[0][1] Then ; Depending on orientation         ; Calculate change in GUI size         $iDelta_GUI = $aGUIPos[2] - $iGUI_Adjust         ; Check GUI fixed point         Switch $iFixed             Case 0                 WinMove($aGUIExt_Section_Data[0][3], "", Default, Default, $iGUI_Adjust, $iGUI_Fixed)             Case 1                 WinMove($aGUIExt_Section_Data[0][3], "", $aGUIPos[0] + Int($iDelta_GUI / 2), Default, $iGUI_Adjust, $iGUI_Fixed)             Case 2                 WinMove($aGUIExt_Section_Data[0][3], "", $aGUIPos[0] + $iDelta_GUI, Default, $iGUI_Adjust, $iGUI_Fixed)         EndSwitch     Else         $iDelta_GUI = $aGUIPos[3] - $iGUI_Adjust         Switch $iFixed             Case 0                 WinMove($aGUIExt_Section_Data[0][3], "", Default, Default, $iGUI_Fixed, $iGUI_Adjust)             Case 1                 WinMove($aGUIExt_Section_Data[0][3], "", Default, $aGUIPos[1] + Int($iDelta_GUI / 2), $iGUI_Fixed, $iGUI_Adjust)             Case 2                 WinMove($aGUIExt_Section_Data[0][3], "", Default, $aGUIPos[1] + $iDelta_GUI, $iGUI_Fixed, $iGUI_Adjust)         EndSwitch     EndIf     ; Initial section position = section 1 start     Local $iNext_Coord = $aGUIExt_Section_Data[1][0]     ; Move sections to required position     Local $iAdjust_X = 0, $iAdjust_Y = 0     For $i = 1 To $aGUIExt_Section_Data[0][0]         ; Is this section visible?         If $aGUIExt_Section_Data[$i][2] > 0 Then             ; Get current position of section anchor             $aPos = ControlGetPos($aGUIExt_Section_Data[0][3], "", $aGUIExt_Section_Data[$i][3])             If $aGUIExt_Section_Data[0][1] Then ; Depending on orientation                 ; Determine required change in X position for section controls                 $iAdjust_X = $aPos[0] - $iNext_Coord                 ; Determine if controls need to be moved back into the GUI                 If $aPos[1] > $iGUI_Fixed Then $iAdjust_Y = $iGUI_Fixed             Else                 ; Determine required change in Y position for section controls                 $iAdjust_Y = $aPos[1] - $iNext_Coord                 ; Determine if controls need to be moved back into the GUI                 If $aPos[0] > $iGUI_Fixed Then $iAdjust_X = $iGUI_Fixed             EndIf             ; For all controls in this section             For $j = $aGUIExt_Section_Data[$i][3] To $aGUIExt_Section_Data[$i][4]                 $iCID = $j                 ; Adjust the position                 $aPos = ControlGetPos($aGUIExt_Section_Data[0][3], "", $iCID)                 If @error Then                     For $k = 1 To $aGUIExt_Obj_Data[0][0]                         If $aGUIExt_Obj_Data[$k][0] = $j Then                             $aPos = ControlGetPos($aGUIExt_Section_Data[0][3], "", $aGUIExt_Obj_Data[$k][1])                             $iCID = $aGUIExt_Obj_Data[$k][1]                             ExitLoop                         EndIf                     Next                     ; If not an object  see if the ControlID returns a handle (an internal tab will not)                     If $iCID = $j And GUICtrlGetHandle($j) = 0 Then $iCID = "Ignore"                 EndIf                 If $iCID = "Ignore" Then ContinueLoop                 ; Move control                 ControlMove($aGUIExt_Section_Data[0][3], "", $iCID, $aPos[0] - $iAdjust_X, $aPos[1] - $iAdjust_Y)                 ; And show the control                 GUICtrlSetState($j, 16) ; $GUI_SHOW             Next             ; Determine start position for next visible section             $iNext_Coord += $aGUIExt_Section_Data[$i][1]         Else             ; Get current position of hidden section anchor             $aPos = ControlGetPos($aGUIExt_Section_Data[0][3], "", $aGUIExt_Section_Data[$i][3])             ; Determine if controls in this section need to be moved outside GUI to prevent possible overlap             If $aGUIExt_Section_Data[0][1] Then ; Depending on orientation                 If $aPos[1] < $iGUI_Fixed Then                     For $j = $aGUIExt_Section_Data[$i][3] To $aGUIExt_Section_Data[$i][4]                         $iCID = $j                         ; Adjust the position                         $aPos = ControlGetPos($aGUIExt_Section_Data[0][3], "", $j)                         If @error Then                             For $k = 1 To $aGUIExt_Obj_Data[0][0]                                 If $aGUIExt_Obj_Data[$k][0] = $j Then                                     $aPos = ControlGetPos($aGUIExt_Section_Data[0][3], "", $aGUIExt_Obj_Data[$k][1])                                     $iCID = $aGUIExt_Obj_Data[$k][1]                                     ExitLoop                                 EndIf                             Next                             ; If not an object  see if the ControlID returns a handle (an internal tab will not)                             If $iCID = $j And GUICtrlGetHandle($j) = 0 Then $iCID = "Ignore"                         EndIf                         If $iCID = "Ignore" Then ContinueLoop                         ; Move control                         ControlMove($aGUIExt_Section_Data[0][3], "", $iCID, $aPos[0], $aPos[1] + $iGUI_Fixed)                     Next                 EndIf             Else                 If $aPos[0] < $iGUI_Fixed Then                     For $j = $aGUIExt_Section_Data[$i][3] To $aGUIExt_Section_Data[$i][4]                         $iCID = $j                         ; Adjust the position                         $aPos = ControlGetPos($aGUIExt_Section_Data[0][3], "", $j)                         If @error Then                             For $k = 1 To $aGUIExt_Obj_Data[0][0]                                 If $aGUIExt_Obj_Data[$k][0] = $j Then                                     $aPos = ControlGetPos($aGUIExt_Section_Data[0][3], "", $aGUIExt_Obj_Data[$k][1])                                     $iCID = $aGUIExt_Obj_Data[$k][1]                                     ExitLoop                                 EndIf                             Next                             ; If not an object  see if the ControlID returns a handle (an internal tab will not)                             If $iCID = $j And GUICtrlGetHandle($j) = 0 Then $iCID = "Ignore"                         EndIf                         If $iCID = "Ignore" Then ContinueLoop                         ; Move control                         ControlMove($aGUIExt_Section_Data[0][3], "", $iCID, $aPos[0] + $iGUI_Fixed, $aPos[1])                     Next                 EndIf             EndIf         EndIf     Next     ; Set correct "all" state if there is a "all" control     If $aGUIExt_Section_Data[0][5] <> 9999 Then         Local $iAll_State = 0         ; Check if any sections extended         For $i = 1 To $aGUIExt_Section_Data[0][0]             If $aGUIExt_Section_Data[$i][2] = 1 Then                 $iAll_State = 1                 ExitLoop             EndIf         Next         ; Sync "all" sections control         Switch $iAll_State             ; None extended             Case 0                 ; Clear flag                 $aGUIExt_Section_Data[0][2] = 0                 ; Set text                 GUICtrlSetData($aGUIExt_Section_Data[0][5], $aGUIExt_Section_Data[0][7])                 ; Set state if required                 If $aGUIExt_Section_Data[0][8] = 1 Then GUICtrlSetState($aGUIExt_Section_Data[0][5], 4) ; $GUI_UNCHECKED             ; Some extended             Case Else                 ; Set flag                 $aGUIExt_Section_Data[0][2] = 1                 ; Set text                 GUICtrlSetData($aGUIExt_Section_Data[0][5], $aGUIExt_Section_Data[0][6])                 ; Set state if required                 If $aGUIExt_Section_Data[0][8] = 1 Then GUICtrlSetState($aGUIExt_Section_Data[0][5], 1) ; $GUI_CHECKED         EndSwitch     EndIf     Return 1 EndFunc ; #FUNCTION# ========================================================================================================= ; Name...........: _GUIExtender_Section_State ; Description ...: Returns current state of section ; Syntax.........: _GUIExtender_Section_State($iSection) ; Parameters ....: $iSection - Section to check ; Requirement(s).: v3.3 + ; Return values .: Success: State of section: 0 = Retracted, 1 = Extended, 2 = Static ;                  Failure: Invalid section returns -1 and sets @error to 1 ; Author ........: Melba23 ; Remarks .......: This allows additional GUI controls to reflect the section state ; Example........: Yes ;===================================================================================================================== Func _GUIExtender_Section_State($iSection)     If $iSection > UBound($aGUIExt_Section_Data) - 1 Then Return SetError(1, 0, -1)     Return $aGUIExt_Section_Data[$iSection][2] EndFunc ; #FUNCTION# ========================================================================================================= ; Name...........: _GUIExtender_UDFCtrlCheck ; Description ...: Hides/Shows and moves UDF-created controls when sections are extended/retracted ; Syntax.........: _GUIExtender_UDFCtrlCheck($hControl_Handle, $iSection, $iX, $iY) ; Parameters ....: $hControl_Handle - Handle of UDF-created control ;                  $iSection        - Section within which control is situated ;                  $iX, $iY         - Coords of control - relative to section not to GUI ; Requirement(s).: v3.3 + ; Return values .: Success:  Returns 1 ;                  Failure:  Returns 0 and sets @error as follows: ;                  1 = Invalid handle ;                  2 = Invalid section ;                  3 = Invalid coordinate value ; Author ........: Melba23 ; Remarks .......: ; Example........: Yes ;===================================================================================================================== Func _GUIExtender_UDFCtrlCheck($hCtrl_Handle, $iSection, $iX, $iY)     Local $iCtrl_Coord     ; Check parameters     If Not IsHWnd($hCtrl_Handle) Or Not WinExists($hCtrl_Handle) Then Return SetError(1, 0, 0)     If $iSection > UBound($aGUIExt_Section_Data) - 1 Then Return SetError(2, 0, 0)     If Not IsInt($iX) Or Not IsInt($iY) Then Return SetError(3, 0, 0)     ; Is the section visible     Switch _GUIExtender_Section_State($iSection)         Case 1             ; If section extended then show the control             ControlShow($aGUIExt_Section_Data[0][3], "", $hCtrl_Handle)             ; Now check required position within the GUI - set intial value depending on orientation             If $aGUIExt_Section_Data[0][1] = 0 Then                 $iCtrl_Coord = $iY + $aGUIExt_Section_Data[1][0] ; Set to offset withint section             Else                 $iCtrl_Coord = $iX + $aGUIExt_Section_Data[1][0]             EndIf             ; Check which earlier sections are extended             For $i = 1 To $iSection - 1                 If _GUIExtender_Section_State($i) Then                     ; Add add their size if extended                     $iCtrl_Coord += $aGUIExt_Section_Data[$i][1]                 EndIf             Next             ; Now move control depending on orientation             If $aGUIExt_Section_Data[0][1] = 0 Then                 WinMove($hCtrl_Handle, "", $iX, $iCtrl_Coord)             Else                 WinMove($hCtrl_Handle, "", $iCtrl_Coord, $iY)             EndIf         Case 0             ; If section retracted hide the control             ControlHide($aGUIExt_Section_Data[0][3], "", $hCtrl_Handle)     EndSwitch     ; Clear flag for section action     $fGUIExt_SectionAction = False     Return 1 EndFunc ; #FUNCTION# ========================================================================================================= ; Name...........: _GUIExtender_ActionCheck ; Description ...: Indicates when sections are extended/retracted so that _GUIExtender_UDFCtrlCheck can be called ; Syntax.........: _GUIExtender_ActionCheck() ; Parameters ....: None ; Requirement(s).: v3.3 + ; Return values .: Returns True if sections have been actioned ;                  Returns False after _GUIExtender_UDFCtrlCheck has been used to adjust UDF-created controls ; Author ........: Melba23 ; Remarks .......: ; Example........: Yes ;===================================================================================================================== Func _GUIExtender_ActionCheck()     Return $fGUIExt_SectionAction EndFunc ; #FUNCTION# ========================================================================================================= ; Name...........: _GUIExtender_Obj_Data ; Description ...: Store additional info on embedded objects ; Syntax.........: _GUIExtender_Obj_Data($iCID, $oObj) ; Parameters ....: $iCID - Returned ControlID from GUICtrlCreateObj ;                  $iObj - Object reference number from initial object creation ; Requirement(s).: v3.3 + ; Return values .: Success:  Returns 1 ;                  Failure:  Returns 0 and sets @error to 1 ; Author ........: Melba23, DllCall from trancexx ; Remarks .......: This allows embedded objects to be used in the UDF ; Example........: Yes ;===================================================================================================================== Func _GUIExtender_Obj_Data($iCID, $iObj)     ; Increase array size     $aGUIExt_Obj_Data[0][0] += 1     ReDim $aGUIExt_Obj_Data[$aGUIExt_Obj_Data[0][0] + 1][2]     ; Store ControlID     $aGUIExt_Obj_Data[$aGUIExt_Obj_Data[0][0]][0] = $iCID     ; Determine and store object handle     Local $aRet = DllCall("oleacc.dll", "int", "WindowFromAccessibleObject", "idispatch", $iObj, "hwnd*", 0)     If @error Or $aRet[0] Then Return SetError(1, 0, 0)     $aGUIExt_Obj_Data[$aGUIExt_Obj_Data[0][0]][1] = $aRet[2]     Return 1 EndFunc ; #FUNCTION# ========================================================================================================= ; Name...........: _GUIExtender_Clear ; Description ...: Called on GUI deletion to clear the data array ready for a new GUI to be initialised ; Syntax.........: _GUIExtender_Clear() ; Requirement(s).: v3.3 + ; Author ........: Melba23 ; Remarks .......: If the data array is not cleared the array is corrupted during initialisation and the UDF crashes ; Example........: Yes ;===================================================================================================================== Func _GUIExtender_Clear()     ; Reset data array     Global $aGUIExt_Section_Data[1][9] = [[0, 0, 1, 0, "", 9999]] EndFunc ; #INTERNAL_USE_ONLY#============================================================================================================ ; Name...........: _GUIExtender_Section_All_Extend ; Description ...: Actions all moveable sections ; Author ........: Melba23 ; Modified.......: ; Remarks .......: This function is used internally by _GUIExtender_Section_Extend when all sections are to be moved ; =============================================================================================================================== Func _GUIExtender_Section_All_Extend($fExtend = True)     ; Set required state for extendable sections     Local $iState = 0     If $fExtend Then $iState = 1     For $i = 1 To $aGUIExt_Section_Data[0][0]         ; Check if section requires change of state         If $aGUIExt_Section_Data[$i][2] <> 2 And $aGUIExt_Section_Data[$i][2] = Not($iState) Then             ; Extend/Shrink as required             _GUIExtender_Section_Extend($i, $fExtend)             ; Set section state to match             $aGUIExt_Section_Data[$i][2] = $iState             ; Set section action control state             Switch $fExtend                 Case True                     GUICtrlSetData($aGUIExt_Section_Data[$i][5], $aGUIExt_Section_Data[$i][6])                     If $aGUIExt_Section_Data[$i][8] = 1 Then GUICtrlSetState($aGUIExt_Section_Data[$i][5], 1) ; $GUI_CHECKED                 Case False                     GUICtrlSetData($aGUIExt_Section_Data[$i][5], $aGUIExt_Section_Data[$i][7])                     If $aGUIExt_Section_Data[$i][8] = 1 Then GUICtrlSetState($aGUIExt_Section_Data[$i][5], 4) ; $GUI_UNCHECKED             EndSwitch         EndIf     Next EndFunc ; #INTERNAL_USE_ONLY#============================================================================================================ ; Name...........: _GUIExtender_Section_Action_Event ; Description ...: Used to detect clicks on section action buttons in OnEvent mode ; Author ........: Melba23 ; Modified.......: ; Remarks .......: This function is called when section action button are clicked in OnEvent mode ; =============================================================================================================================== Func _GUIExtender_Section_Action_Event()     _GUIExtender_Action(@GUI_CTRLID) EndFunc

New - For ease of downloading, here are all the above files in zip format:Attached File  GUIExtender.zip   13.76K   787 downloads

As always, I welcome constructive comments and effusive compliments! :P

M23

Edited by Melba23, 19 October 2012 - 11:48 AM.

  • argumentum, armoros and syk3s like this
StringSize - Automatically size controls to fit text - ExtMsgBox - A user customisable replacement for MsgBox

Toast - Small GUIs which pop out of the Systray - Marquee - Scrolling tickertape GUIs

Scrollbars - Automatically sized scrollbars with a single command - GUIFrame - Subdivide GUIs into many adjustable frames

GUIExtender - Extend and retract multiple sections within a GUI - NoFocusLines - Remove the dotted focus lines from buttons, sliders, radios and checkboxes

ChooseFileFolder - Single and multiple selections from specified path tree structure - - Notify - Small notifications on the edge of the display

RecFileListToArray - An alternative to _FileListToArray with user-defined include/exclude masks, maximum recursion level, sorting and displayed path options

GUIListViewEx - Insert, delete, move, drag and sort ListView items






#2 taietel

taietel

    I'm the third from the left...

  • Active Members
  • PipPipPipPipPipPip
  • 722 posts

Posted 01 August 2010 - 03:29 PM

Useful stuff, especially for avoiding multiple GUI's at once (moving them together is a pain in the a.. :blink: )! Thank you for sharing!

M.I.

#3 Fire

Fire

    Universalist

  • Active Members
  • PipPipPipPipPipPip
  • 362 posts

Posted 01 August 2010 - 07:21 PM

Awesome Stuff.Thank you very much M23.




#4 JohnOne

JohnOne

    John

  • Active Members
  • PipPipPipPipPipPip
  • 8,834 posts

Posted 01 August 2010 - 07:59 PM

Superb M23.

I will definately use this, I have only looked at the examples so far and they are absolutely top of the pops.

Thanks.
AutoIt Absolute Beginners Require a serial
Run('hh mk:@MSITStore:'&StringReplace(@AutoItExe,'.exe','.chm')&'::/html/tutorials/helloworld/helloworld.htm','',@SW_MAXIMIZE)

#5 enaiman

enaiman

    Universalist

  • Active Members
  • PipPipPipPipPipPip
  • 1,922 posts

Posted 01 August 2010 - 11:26 PM

Very-very nice.
That's an awesome job done there. Thanks for sharing it :blink:

SNMP_UDF ... for SNMPv1 and v2c so far, GetBulk and a new example script

wannabe "Unbeatable" Tic-Tac-Toe

Paper-Scissor-Rock ... try to beat it anyway :)


#6 neity

neity

    Seeker

  • Active Members
  • 19 posts

Posted 02 August 2010 - 02:13 PM

good! thank you for shared it.

#7 Digisoul

Digisoul

    Universalist

  • Active Members
  • PipPipPipPipPipPip
  • 312 posts

Posted 03 August 2010 - 05:49 PM

Awesome Melba23, Posted Image
you always amaze me with your UDFs. 5 stars from me
73 108 111 118 101 65 117 116 111 105 116 Posted Image

#8 Melba23

Melba23

    Yes, me!

  • Moderators
  • 15,318 posts

Posted 05 August 2010 - 08:46 AM

New version - 5/08/10

GUIExtender can now extend and retract sections horizontally or vertically. You set the required orientation when initialising the UDF and all sections in the GUI then use that orientation when extending or retracting.

New UDF and new example in the first post.

Enjoy! :blink:

M23
StringSize - Automatically size controls to fit text - ExtMsgBox - A user customisable replacement for MsgBox

Toast - Small GUIs which pop out of the Systray - Marquee - Scrolling tickertape GUIs

Scrollbars - Automatically sized scrollbars with a single command - GUIFrame - Subdivide GUIs into many adjustable frames

GUIExtender - Extend and retract multiple sections within a GUI - NoFocusLines - Remove the dotted focus lines from buttons, sliders, radios and checkboxes

ChooseFileFolder - Single and multiple selections from specified path tree structure - - Notify - Small notifications on the edge of the display

RecFileListToArray - An alternative to _FileListToArray with user-defined include/exclude masks, maximum recursion level, sorting and displayed path options

GUIListViewEx - Insert, delete, move, drag and sort ListView items


#9 AlmarM

AlmarM

    Programming my way.

  • Active Members
  • PipPipPipPipPipPip
  • 1,642 posts

Posted 06 August 2010 - 01:20 AM

Wow, thats really cool. Thanks. :blink:

#10 wakillon

wakillon

    Tiny Tools Coder

  • Active Members
  • PipPipPipPipPipPip
  • 2,477 posts

Posted 06 August 2010 - 08:51 PM

Usefull and nice ! Posted Image

It give me some ideas...

Edited by wakillon, 14 January 2011 - 09:58 AM.

  • AutoIt Version : 3.3.8.1/3.3.9.4 SciTE 3.3.0 Language:040C OS:WIN_7/ CPU:X64 OS:X64 

  • Last updated Scripts and executables with full embedded files are available on : GoogleCode 


#11 BlueLord

BlueLord

    Seeker

  • Active Members
  • 29 posts

Posted 13 August 2010 - 08:49 PM

Hy Melba23, Hy all,
I like your GUIExtender UDF.
I have an idea for an application.
I trie to adapt your udf to my needs, but now i am in a dead point.
I need a hint how to use "Func _GUIExtender_Section_Action".
I want to activate the hidden section using to radio button, and i dont need the "MORE" button, with the arrow.
My programing skills are not sow good... maybe a hint...
In attachament i put the modification and a screen shoot

THANKS!!!!!

Attached Thumbnails

  • selection_problem.jpg

Attached Files



#12 Datenshi

Datenshi

    Prodigy

  • Active Members
  • PipPipPip
  • 179 posts

Posted 15 August 2010 - 01:58 AM

Good work Melba

#13 Melba23

Melba23

    Yes, me!

  • Moderators
  • 15,318 posts

Posted 25 August 2010 - 10:24 AM

BlueLord,

Sorry for the delay in replying - I was away for a few weeks. ;)

All you need to do is to use the _GUIExtender_Section_Action function with only the $iSection parameter, as explained in the function header and shown in the final example. This creates an extendable section without a UDF-created button.

In your example script, just change this line:
_GUIExtender_Section_Action($iThis_Section + 1, "", "", 270, 60, 15, 15) ; Note easy way to denote next section

to read:
_GUIExtender_Section_Action($iThis_Section + 1)

You now have no automatically created button and your radio button will still work as you wish.

All clear? :)

M23
StringSize - Automatically size controls to fit text - ExtMsgBox - A user customisable replacement for MsgBox

Toast - Small GUIs which pop out of the Systray - Marquee - Scrolling tickertape GUIs

Scrollbars - Automatically sized scrollbars with a single command - GUIFrame - Subdivide GUIs into many adjustable frames

GUIExtender - Extend and retract multiple sections within a GUI - NoFocusLines - Remove the dotted focus lines from buttons, sliders, radios and checkboxes

ChooseFileFolder - Single and multiple selections from specified path tree structure - - Notify - Small notifications on the edge of the display

RecFileListToArray - An alternative to _FileListToArray with user-defined include/exclude masks, maximum recursion level, sorting and displayed path options

GUIListViewEx - Insert, delete, move, drag and sort ListView items


#14 BlueLord

BlueLord

    Seeker

  • Active Members
  • 29 posts

Posted 30 August 2010 - 07:30 PM

OK!
Thanks!

#15 BlueLord

BlueLord

    Seeker

  • Active Members
  • 29 posts

Posted 01 September 2010 - 04:31 PM

Hy,
Me again...
I have a "minor" bug in my GUI.
When i first start the script the element's from "$iSettingMenu_Section" not appear.
But after i activare a hide section "$iMMenu_Section" elements appear and after hide again the "$iMMenu_Section" are not hidden.
I whant that the elements of "$iSettingMenu_Section" to appear when i first start the script.
I have attachen the script and a picture...

Attached Thumbnails

  • FORUM.png

Attached Files



#16 Melba23

Melba23

    Yes, me!

  • Moderators
  • 15,318 posts

Posted 01 September 2010 - 07:58 PM

BlueLord,

You were seriously overcomplicating the script - if you let the UDF create the Action controls, you do not need to deal with the state of the extendable sections. ;)

You also need to make sure you have the sections following on directly one from the other. That is to say that the start coordinate of a section should equal the sum of the start position and size of the section before it - take a look at the values now. :P

I think this is what you want - I have commented where necessary: ;)
AutoIt         
#include <GUIConstantsEx.au3> #include "GUIExtender.au3" #include <GUIConstantsEx.au3> #include <StaticConstants.au3> #include <ButtonConstants.au3> #include <WindowsConstants.au3> ;; Create GUI window $win_1 = GUICreate("Check List Generator = powered by BlueLord", 365, 440) ; Initialise UDF _GUIExtender_Init($win_1) $iQuickMenu_Section = _GUIExtender_Section_Start(0, 100) $print_selc_group = GUICtrlCreateGroup("Print Mode . . .", 10, 20, 140, 65);* GUIStartGroup("Print Mode . . .") $prt_full = GUICtrlCreateRadio("Complete Print", 20, 35, 100, 20) GUICtrlSetTip(-1, "Print Complet '", "Full Print Mode", 1) $prt_indv = GUICtrlCreateRadio("Individual Print", 20, 60, 100, 20) GUICtrlSetTip(-1, "Print Individual", "Individual Print Mode", 1) GUICtrlSetState($prt_full, $GUI_CHECKED) $print_selc_group = GUICtrlCreateGroup("Print", 210, 20, 140, 65);* GUIStartGroup("Print . . .") $Print_Button = GUICtrlCreateButton("Print", 250, 35, 70, 40, $BS_ICON) GUICtrlSetImage(-1, "shell32.dll", 252) GUICtrlSetTip($Print_Button, "Print Your Selection", "Print!", 1) ; This sets an action ControlID but you need to do all the work! _GUIExtender_Section_Action($iQuickMenu_Section + 1) _GUIExtender_Section_End() $iMMenu_Section = _GUIExtender_Section_Start(100, 30) ; These are UDF generated Action controls - you need not worry about them! $g_section_but = _GUIExtender_Section_Action($iMMenu_Section + 1, "g", "g", 20, 100, 95, 20, 1) $u_section_but = _GUIExtender_Section_Action($iMMenu_Section + 2, "u", "u", 120, 100, 95, 20, 1) $a_section_but = _GUIExtender_Section_Action($iMMenu_Section + 3, "a", "a", 220, 100, 95, 20, 1) _GUIExtender_Section_End() $iGMenu_Section = _GUIExtender_Section_Start(130, 80) $m_g_group = GUICtrlCreateGroup("G", 10, 130, 340, 70) _GUIExtender_Section_End() $iUMenu_Section = _GUIExtender_Section_Start(210, 80) $m_u_group = GUICtrlCreateGroup("U", 10, 210, 340, 70) _GUIExtender_Section_End() $iAMenu_Section = _GUIExtender_Section_Start(290, 80) $m_a_group = GUICtrlCreateGroup("A", 10, 290, 340, 70) _GUIExtender_Section_End() $iSettingMenu_Section = _GUIExtender_Section_Start(370, 70) $setting2 = GUICtrlCreateGroup("Settings", 10, 370, 140, 60);* $helpgroup = GUICtrlCreateGroup("_?_", 210, 370, 140, 60);* GUIStartGroup("Settings") $prt_set = GUICtrlCreateButton("", 20, 385, 40, 40, $BS_ICON) GUICtrlSetImage(-1, "shell32.dll", 1007) GUICtrlSetTip(-1, "Change Printer Settings", "Printer Settings", 1) $full_set = GUICtrlCreateButton("", 60, 385, 40, 40, $BS_ICON) GUICtrlSetImage(-1, "shell32.dll", -145) GUICtrlSetTip(-1, "Settings", "Settings", 1) $ini_set = GUICtrlCreateButton("", 100, 385, 40, 40, $BS_ICON) GUICtrlSetImage(-1, "shell32.dll", -132);-132 GUICtrlSetTip(-1, "Delete", "Delete", 1) GUIStartGroup("_?_") $about_prg = GUICtrlCreateButton("", 220, 385, 40, 40, $BS_ICON) GUICtrlSetImage(-1, "shell32.dll", -278) ;-28 GUICtrlSetTip(-1, "Info", "About", 1) $help_prg = GUICtrlCreateButton("", 260, 385, 40, 40, $BS_ICON) GUICtrlSetImage(-1, "shell32.dll", -155) ;-155 GUICtrlSetTip(-1, "Help", "Help", 1) $exit_prg = GUICtrlCreateButton("", 300, 385, 40, 40, $BS_ICON) GUICtrlSetImage(-1, "shell32.dll", -28);-278 GUICtrlSetTip(-1, "Close program", "Exit", 1) _GUIExtender_Section_End() GUICtrlCreateGroup("", -99, -99, 1, 1) ; Now collapse the section you do not want to show - not all of them as before! _GUIExtender_Section_Extend($iMMenu_Section, False) _GUIExtender_Section_Extend($iGMenu_Section, False) _GUIExtender_Section_Extend($iUMenu_Section, False) _GUIExtender_Section_Extend($iAMenu_Section, False) GUISetState() While 1     $iMsg = GUIGetMsg()     ; Check for normal AutoIt controls     Switch $iMsg         Case $GUI_EVENT_CLOSE, $exit_prg             Exit         Case $Print_Button             _DublePrintButton_Action($iMsg)         ; We need to deal with the radio buttons because they control the user created action control         ; As the 2 radios are in a group, only one of them can be active at a time         ; so it is really easy to decide what to do!         Case $prt_full             _GUIExtender_Section_Extend($iAMenu_Section, False)             _GUIExtender_Section_Extend($iUMenu_Section, False)             _GUIExtender_Section_Extend($iGMenu_Section, False)             _GUIExtender_Section_Extend($iMMenu_Section, False)         Case $prt_indv             _GUIExtender_Section_Extend($iMMenu_Section)     EndSwitch     ; Check for UDF-generated GUIExtender controls     ; The UDF will deal with them - we need not wory about them!     _GUIExtender_Action($iMsg) WEnd Func _DublePrintButton_Action($iMsg)     If GUICtrlRead($prt_indv) = 1 Then         MsgBox(0, "Individual Print Mode", "OK - Individual Print")     Else         MsgBox(0, "Complete Print Mode", "OK - Complete Print")     EndIf EndFunc   ;==>_DublePrintButton_Action

All clear? :)

M23

Edit: Typnig!

Edited by Melba23, 01 September 2010 - 08:09 PM.

StringSize - Automatically size controls to fit text - ExtMsgBox - A user customisable replacement for MsgBox

Toast - Small GUIs which pop out of the Systray - Marquee - Scrolling tickertape GUIs

Scrollbars - Automatically sized scrollbars with a single command - GUIFrame - Subdivide GUIs into many adjustable frames

GUIExtender - Extend and retract multiple sections within a GUI - NoFocusLines - Remove the dotted focus lines from buttons, sliders, radios and checkboxes

ChooseFileFolder - Single and multiple selections from specified path tree structure - - Notify - Small notifications on the edge of the display

RecFileListToArray - An alternative to _FileListToArray with user-defined include/exclude masks, maximum recursion level, sorting and displayed path options

GUIListViewEx - Insert, delete, move, drag and sort ListView items


#17 BlueLord

BlueLord

    Seeker

  • Active Members
  • 29 posts

Posted 01 September 2010 - 08:27 PM

Thank's
I'm new in autoit and programing. I like autoit and i trie to lern.
I don't have good programming skills and i make slow progress.
Maybe sometimes i complcate the script.
Thanks again

#18 BlueLord

BlueLord

    Seeker

  • Active Members
  • 29 posts

Posted 02 September 2010 - 06:26 PM

Hello... me again ;)
I test my modificated script from you, it's ok but when i minimize and then maximize back the window the element's of last section are hidden.

Second point:
I'm asking if it's a method to "hide" minimize and "close" button.
In my script i used "-1,-1,$WS_BORDER)" to hide this buttons.
Thanks

Attached Thumbnails

  • untitled.jpg


#19 Melba23

Melba23

    Yes, me!

  • Moderators
  • 15,318 posts

Posted 02 September 2010 - 07:41 PM

BlueLord,

Interesting..... ;)

As a workaround, make these changes: :)
$iSettingMenu_Section = _GUIExtender_Section_Start(370, 70) _GUIExtender_Section_Action($iSettingMenu_Section) Switch $iMsg     Case $GUI_EVENT_CLOSE, $exit_prg         Exit     Case $GUI_EVENT_RESTORE         _GUIExtender_Section_Extend($iSettingMenu_Section, False)         _GUIExtender_Section_Extend($iSettingMenu_Section)

I will investigate further. Thanks for bringing it to my attention. ;)


M23

Edit: New version of the UDF in the first post - just use that and the problem goes away! :P

Thanks for bringing the problem to my attention. o:)

M23

Edited by Melba23, 03 September 2010 - 02:00 PM.

StringSize - Automatically size controls to fit text - ExtMsgBox - A user customisable replacement for MsgBox

Toast - Small GUIs which pop out of the Systray - Marquee - Scrolling tickertape GUIs

Scrollbars - Automatically sized scrollbars with a single command - GUIFrame - Subdivide GUIs into many adjustable frames

GUIExtender - Extend and retract multiple sections within a GUI - NoFocusLines - Remove the dotted focus lines from buttons, sliders, radios and checkboxes

ChooseFileFolder - Single and multiple selections from specified path tree structure - - Notify - Small notifications on the edge of the display

RecFileListToArray - An alternative to _FileListToArray with user-defined include/exclude masks, maximum recursion level, sorting and displayed path options

GUIListViewEx - Insert, delete, move, drag and sort ListView items


#20 Melba23

Melba23

    Yes, me!

  • Moderators
  • 15,318 posts

Posted 03 September 2010 - 01:57 PM

NEW VERSION

GUIExtender now restores the GUI correctly after a MINIMIZE/RESTORE cycle. Windows replaces GUI sections in their original rather then their current positions which led to some sections not being displayed incorrectly or not at all when earlier sections are retracted. ;)

I have added a function to the UDF to reset the GUI to the desired state, which it does by cycling the highest numbered extendable section and so resetting the positions of all the sections and their controls.

If you are in OnEvent mode or if you already call _GUIExtender_Action then you need to take no action as this function is called automatically. :)

If you are in GetMessage mode and are NOT using any UDF-created action controls, you need to add the following to your GUIGetMsg loop:
Case $GUI_EVENT_RESTORE     _GUIExtender_Restore()

If only the final section of your GUI is extendable, you can get away with not doing this as the earlier sections will always be in the correct position. However, I would still recommend adding the $GUI_EVENT_RESTORE line so you get into the habit and do not forget in other scripts! :P

New UDF and a modified example to show how to amend the GUIGetMsg loop as described above now in the first post. New Zip file also uploaded.

Thanks to BlueLord for pointing out the problem. ;)

M23

Edit: Clarity (I hope!)

Edited by Melba23, 03 September 2010 - 04:57 PM.

StringSize - Automatically size controls to fit text - ExtMsgBox - A user customisable replacement for MsgBox

Toast - Small GUIs which pop out of the Systray - Marquee - Scrolling tickertape GUIs

Scrollbars - Automatically sized scrollbars with a single command - GUIFrame - Subdivide GUIs into many adjustable frames

GUIExtender - Extend and retract multiple sections within a GUI - NoFocusLines - Remove the dotted focus lines from buttons, sliders, radios and checkboxes

ChooseFileFolder - Single and multiple selections from specified path tree structure - - Notify - Small notifications on the edge of the display

RecFileListToArray - An alternative to _FileListToArray with user-defined include/exclude masks, maximum recursion level, sorting and displayed path options

GUIListViewEx - Insert, delete, move, drag and sort ListView items





0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users