Jump to content



Photo

Vertical Scrolling Problem


  • Please log in to reply
13 replies to this topic

#1 lark

lark

    Seeker

  • Active Members
  • 47 posts

Posted 01 January 2012 - 01:28 AM

Hello, first post here :)

I have had some trouble with creating a vertical scroll in a GUI. Not in the normal sense, though.
What I am trying to do in a newer project - an auto-clicking program- is to have the user be able to add new events by clicking on a button, but then when the GUI had no more space left for more events, then to have a vertical scroll be put in.
I have tried a bunch of things, and have left my latest attempt in the code at lines 39 - 41.
Any ideas? Or is there a totally different method for this that I seem to have overlooked?

Here is the source:
AutoIt         
#include <ButtonConstants.au3> #include <ComboConstants.au3> #include <EditConstants.au3> #include <GUIConstantsEx.au3> #include <StaticConstants.au3> #include <WindowsConstants.au3> #include <GuiScrollBars.au3> #include <ScrollBarConstants.au3> #region ### START Koda GUI section ### Form= $form1 = GUICreate("Auto Clicker", 545, 600, 196, 169) $neweventbutton = GUICtrlCreateButton("New Event", 144, 16, 75, 25) $eventtypecombo = GUICtrlCreateCombo("Left Click", 8, 64, 113, 25) GUICtrlSetData($eventtypecombo, "Right Click|WinWaitActive|Run...") $runtimesinput = GUICtrlCreateInput("1", 432, 64, 49, 21) $Label2 = GUICtrlCreateLabel("Run", 408, 64, 24, 17) ;I do this a lot to make things easier - labeling the ID of some controls. $winwaitactiveinput = GUICtrlCreateInput("Untitled - Notepad", 120, 64, 97, 21) ;7  <--The id of that control is 7 GUICtrlSetState($winwaitactiveinput, $GUI_HIDE) $Label3 = GUICtrlCreateLabel("Randomize position by", 8, 112, 110, 17) ; 8 $randompixelinput = GUICtrlCreateInput("0", 120, 112, 25, 21) ;9 $Label4 = GUICtrlCreateLabel("pixels.", 152, 112, 33, 17) ;10 $Label5 = GUICtrlCreateLabel("After", 256, 112, 31, 17) $waittime1input = GUICtrlCreateInput("1000", 288, 112, 73, 21) $Label6 = GUICtrlCreateLabel("to", 368, 112, 13, 17) $waittime2input = GUICtrlCreateInput("2000", 384, 112, 73, 21) $Label7 = GUICtrlCreateLabel("miliseconds.", 464, 112, 61, 17) $Label8 = GUICtrlCreateLabel("times.", 480, 64, 31, 17) $Label1 = GUICtrlCreateLabel("x", 240, 64, 9, 17) ;17 $xcoordinput = GUICtrlCreateInput("0", 248, 64, 25, 21) ;18 $Label9 = GUICtrlCreateLabel("y", 288, 64, 9, 17) ;19 $ycoordinput = GUICtrlCreateInput("0", 296, 64, 25, 21) ;20 $findcoordbutton = GUICtrlCreateButton("Find...", 320, 64, 43, 17) ;21 GUISetState(@SW_SHOW) #endregion ### END Koda GUI section ### Global $numberOfEvents = 1 $eventTypeComboData1 = GUICtrlRead(4) While 1 If $numberOfEvents = 5 Then   GUISetStyle(BitOR(Default, $WS_VSCROLL)) EndIf $nMsg = GUIGetMsg() Switch $nMsg   Case $GUI_EVENT_CLOSE    Exit   Case $neweventbutton    addnewevent() EndSwitch For $tempCounter = 0 To ($numberOfEvents - 1) Step 1   Switch $nMsg    Case 21 + ($tempCounter * 18)     findMouseCoordinates($nMsg)    Case 4 + ($tempCounter * 18)     $eventTypeComboData2 = GUICtrlRead(4 + ($tempCounter * 18))     If $eventTypeComboData1 <> $eventTypeComboData2 Then      Switch $eventTypeComboData2       Case "Left Click"        GUICtrlSetState(7 + ($tempCounter * 18), $GUI_HIDE)        GUICtrlSetState(8 + ($tempCounter * 18), $GUI_SHOW)        GUICtrlSetState(9 + ($tempCounter * 18), $GUI_SHOW)        GUICtrlSetState(10 + ($tempCounter * 18), $GUI_SHOW)        GUICtrlSetState(17 + ($tempCounter * 18), $GUI_SHOW)        GUICtrlSetState(18 + ($tempCounter * 18), $GUI_SHOW)        GUICtrlSetState(19 + ($tempCounter * 18), $GUI_SHOW)        GUICtrlSetState(20 + ($tempCounter * 18), $GUI_SHOW)        GUICtrlSetState(21 + ($tempCounter * 18), $GUI_SHOW)       Case "Right Click"        GUICtrlSetState(7 + ($tempCounter * 18), $GUI_HIDE)        GUICtrlSetState(8 + ($tempCounter * 18), $GUI_SHOW)        GUICtrlSetState(9 + ($tempCounter * 18), $GUI_SHOW)        GUICtrlSetState(10 + ($tempCounter * 18), $GUI_SHOW)        GUICtrlSetState(17 + ($tempCounter * 18), $GUI_SHOW)        GUICtrlSetState(18 + ($tempCounter * 18), $GUI_SHOW)        GUICtrlSetState(19 + ($tempCounter * 18), $GUI_SHOW)        GUICtrlSetState(20 + ($tempCounter * 18), $GUI_SHOW)        GUICtrlSetState(21 + ($tempCounter * 18), $GUI_SHOW)       Case "WinWaitActive"        GUICtrlSetState(7 + ($tempCounter * 18), $GUI_SHOW)        GUICtrlSetState(8 + ($tempCounter * 18), $GUI_HIDE)        GUICtrlSetState(9 + ($tempCounter * 18), $GUI_HIDE)        GUICtrlSetState(10 + ($tempCounter * 18), $GUI_HIDE)        GUICtrlSetState(17 + ($tempCounter * 18), $GUI_HIDE)        GUICtrlSetState(18 + ($tempCounter * 18), $GUI_HIDE)        GUICtrlSetState(19 + ($tempCounter * 18), $GUI_HIDE)        GUICtrlSetState(20 + ($tempCounter * 18), $GUI_HIDE)        GUICtrlSetState(21 + ($tempCounter * 18), $GUI_HIDE)       Case "Run..."        GUICtrlSetState(7 + ($tempCounter * 18), $GUI_SHOW)        GUICtrlSetState(8 + ($tempCounter * 18), $GUI_HIDE)        GUICtrlSetState(9 + ($tempCounter * 18), $GUI_HIDE)        GUICtrlSetState(10 + ($tempCounter * 18), $GUI_HIDE)        GUICtrlSetState(17 + ($tempCounter * 18), $GUI_HIDE)        GUICtrlSetState(18 + ($tempCounter * 18), $GUI_HIDE)        GUICtrlSetState(19 + ($tempCounter * 18), $GUI_HIDE)        GUICtrlSetState(20 + ($tempCounter * 18), $GUI_HIDE)        GUICtrlSetState(21 + ($tempCounter * 18), $GUI_HIDE)      EndSwitch      $eventTypeComboData1 = $eventTypeComboData2     EndIf   EndSwitch Next Sleep(25) WEnd Func findMouseCoordinates($buttonId) Local $mouseposition = MouseGetPos() ToolTip($mouseposition[0] & ", " & $mouseposition[1], $mouseposition[0] + 12, $mouseposition[1] + 12, Default, Default, 4) While 1   Local $mouseposition2 = MouseGetPos()   If $mouseposition[0] <> $mouseposition2[0] Or $mouseposition[1] <> $mouseposition2[1] Then    $mouseposition[0] = $mouseposition2[0]    $mouseposition[1] = $mouseposition2[1]    ToolTip("")    ToolTip($mouseposition2[0] & ", " & $mouseposition2[1], $mouseposition2[0] + 12, $mouseposition2[1] + 12, Default, Default, 4)   EndIf   Local $nMsg = GUIGetMsg()   Switch $nMsg    Case $GUI_EVENT_CLOSE     Exit    Case $buttonId     ToolTip("")     ExitLoop   EndSwitch   Sleep(25) WEnd EndFunc   ;==>findMouseCoordinates Func addnewevent() GUICtrlCreateCombo("Left Click", 8, 64 + ($numberOfEvents * 150), 113, 25) ;3 GUICtrlSetData(-1, "Right Click|WinWaitActive|Run...") ;not a new ctrl GUICtrlCreateInput("1", 432, 64 + ($numberOfEvents * 150), 49, 21) ;4 GUICtrlCreateLabel("Run", 408, 64 + ($numberOfEvents * 150), 24, 17) ;5 GUICtrlCreateInput("Untitled - Notepad", 120, 64 + ($numberOfEvents * 150), 97, 21) ;6 GUICtrlSetState(-1, $GUI_HIDE) ;not a new ctrl GUICtrlCreateLabel("Randomize position by", 8, 112 + ($numberOfEvents * 150), 110, 17) GUICtrlCreateInput("0", 120, 112 + ($numberOfEvents * 150), 25, 21) ;8 GUICtrlCreateLabel("pixels.", 152, 112 + ($numberOfEvents * 150), 33, 17) GUICtrlCreateLabel("Every", 256, 112 + ($numberOfEvents * 150), 31, 17) ;10 GUICtrlCreateInput("1000", 288, 112 + ($numberOfEvents * 150), 73, 21) GUICtrlCreateLabel("to", 368, 112 + ($numberOfEvents * 150), 13, 17) ;12 GUICtrlCreateInput("2000", 384, 112 + ($numberOfEvents * 150), 73, 21) GUICtrlCreateLabel("miliseconds.", 464, 112 + ($numberOfEvents * 150), 61, 17) ;14 GUICtrlCreateLabel("times.", 480, 64 + ($numberOfEvents * 150), 31, 17) GUICtrlCreateLabel("x", 240, 64 + ($numberOfEvents * 150), 9, 17) ;16 GUICtrlCreateInput("0", 248, 64 + ($numberOfEvents * 150), 25, 21) GUICtrlCreateLabel("y", 288, 64 + ($numberOfEvents * 150), 9, 17) ;18 GUICtrlCreateInput("0", 296, 64 + ($numberOfEvents * 150), 25, 21) GUICtrlCreateButton("Find...", 320, 64 + ($numberOfEvents * 150), 43, 17) ;20 ;18 controls are being created. $numberOfEvents = $numberOfEvents + 1 EndFunc   ;==>addnewevent



Thanks,
~mischieftoo







#2 Melba23

Melba23

    Yes, me!

  • Moderators
  • 15,398 posts

Posted 01 January 2012 - 10:15 AM

mischieftoo,

Welcome to the AutoIt forum. :)

Unfortunately, your use of the term "auto-clicking" makes us a little suspicious of your intentions - you might like to read the Forum Rules before too long to make sure you are not infringing them. :D

But as according to the server you were the first new member of 2012 here are a few hints to help you on your way: ;)

;I do this a lot to make things easier - labeling the ID of some controls

That is what most people do for all their controls - then you can use the variable instead of the actual number later:
; Rather than GUICtrlSetState(7 + ($tempCounter * 18), $GUI_HIDE) ; You can use GUICtrlSetState($winwaitactiveinput + ($tempCounter * 18), $GUI_HIDE)

It makes the whole script easier to read. And imagine the difficulties of updating the hard-coded numbers if you were to add another control somewhere in the middle of the GUI as you developed the script - if you use variables there is no problem at all. :)

I would strongly suggest you start learning about arrays - they are just the thing for storing the IDs of the various controls you create each time you add an event. And you do need to store them - how else will you read them later? I suggest the Arrays tutorial in the Wiki if you are not familiar with them - you need to be as they are an important tool for any coder.

And for an easy way to deal with the scroll bars, take a look at the GUIScrollBars UDF in my sig - specifically the second example for _GUIScollbars_Size.

Good luck with the script - and a Happy New Year.

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


#3 lark

lark

    Seeker

  • Active Members
  • 47 posts

Posted 02 January 2012 - 01:56 AM

Thanks Melba23. I looked at the UDFs you had, and was able to get it working. :)
But you mentioned storing the IDs of the controls in arrays - why would I do that, if I could just draw the data from things like
GUICtrlSetState(7 + ($tempCounter * 18), $GUI_HIDE)

except using variables, as you suggested, to access data from each control that I might use. But could you explain to me why I would store the IDs in arrays?

Thanks,
-mischieftoo

#4 Melba23

Melba23

    Yes, me!

  • Moderators
  • 15,398 posts

Posted 02 January 2012 - 09:35 AM

mischieftoo,

Let us imagine you add only 2 controls each time - a button and an input (you can easily scale up the example to deal with as many as you wish). :D

You start by creating 2 arrays:
Global $aButton[1] = [0] Global $aInput[1] = [0]

Now you create the addtional items in the function like this:
; Increase the count - this is the equivalent of your $tempCounter variable $aButton[0] += 1 $aInput[0] += 1 ; Increase the size of the arrays - without destroying the existing data- so there is enough room for the new ControlIDs ReDim $aButton[$aButton[0] + 1] ReDim $aInput[$aInput[0] + 1] ; Now create the controls $aButton[$aButton[0]] = GUICtrlCreateButton(.... $aInput[$aInput[0]] = GUICtrlCreateInput(....

You can now reference these controls as simply as:
GUICtrlSetState($aButton[$iIndex], $GUI_HIDE) GUICtrlSetState($aInput[$iIndex], $GUI_HIDE)

where $iIndex is the index of the set you wish to hide.

I suggest that this is a more elegant way of dealing with the controls than your current method. :)

If you wanted to go the whole hog, you could use a 2D array and then you would reduce the number of lines necessary considerably:
; Create just one array Global $aControl[0][2] = [[0]] ; In the function you increase the count $aControl[0][0] += 1 ; Increase the size ReDim $aControl[$aControl[0][0] + 1][2] ; Create the controls $aControl[$aControl[0][0]][0] = GUICtrlCreateButton(.... ; This goes into the [n][0] element $aControl[$aControl[0][0]][1] = GUICtrlCreateInput(....  ; This goes into the [n][1] element ; And you use them like this For $i = 10 To 1     GUICtrlSetState($aControl[$iIndex][$i], $GUI_HIDE) ; Hide the button when $i = 0, the input when $i = 1 Next ; Imagine the lines you save if you have lots of controls!!!

As I said earlier, arrays are an essential part of a coder's toolbox and can really simplify a script enormously. :)

I hope all the above is clear - please ask if not. ;)

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


#5 lark

lark

    Seeker

  • Active Members
  • 47 posts

Posted 02 January 2012 - 11:36 PM

I understand now. Thanks!

#6 nikosliapis

nikosliapis

    Wayfarer

  • Active Members
  • Pip
  • 50 posts

Posted 14 March 2012 - 08:41 PM

And for an easy way to deal with the scroll bars, take a look at the GUIScrollBars UDF in my sig - specifically the second example for _GUIScollbars_Size.

Good luck with the script - and a Happy New Year.

M23

Hello i have a similar situation in one of my scripts and i tried to use your _GUIScollbars_Size UDF but unfortunately i am noob in coding and couldn't figure it out. In my script i add combo boxes to a gui, but from a point on they don't fit in my window
An example of my code is below:
Plain Text         
#include <ButtonConstants.au3> #include <ComboConstants.au3> #include <GUIConstantsEx.au3> #include <StaticConstants.au3> #include <WindowsConstants.au3> #include <GUIScrollBars.au3> #include <ScrollBarConstants.au3> #include "GUIScrollbars_Size.au3" #include <Array.au3> ; a[/i] [i]Dim $combo[1] $form1 = GUICreate("Form1", 615, 438, 192, 124) $Combo[0] = GUICtrlCreateCombo("Combo1", 104, 24, 145, 25) $Button1 = GUICtrlCreateButton("Cancel", 272, 392, 99, 25) $Button2 = GUICtrlCreateButton("Add Combo", 136, 392, 97, 25) GUISetState(@SW_SHOW) $i=0[/i] [i]While 1 $nMsg = GUIGetMsg() Switch $nMsg   Case $GUI_EVENT_CLOSE    Exit   Case $Button1    Exit   Case $Button2    $i=$i+1    ReDim $combo[$i+1]    $combo[$i] = GUICtrlCreateCombo("Combo" & ($i+1), 104, 24+$i*25, 145,25) EndSwitch WEnd[/i] [i]


I would aprecciate any help.
Thanks in advance
Coding can be fun when you do it your own.

#7 Melba23

Melba23

    Yes, me!

  • Moderators
  • 15,398 posts

Posted 14 March 2012 - 08:59 PM

nikosliapis,

Do you want the whole GUI to have scrollbars, or do you want the combos to appear within a separate scrolled area? :oops:

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


#8 nikosliapis

nikosliapis

    Wayfarer

  • Active Members
  • Pip
  • 50 posts

Posted 14 March 2012 - 09:12 PM

nikosliapis,

Do you want the whole GUI to have scrollbars, or do you want the combos to appear within a separate scrolled area? :oops:

M23


This is only an example, in my actual script the whole gui must have scrollbars, also i need only vertical scrolling.
Thank you.
Coding can be fun when you do it your own.

#9 Melba23

Melba23

    Yes, me!

  • Moderators
  • 15,398 posts

Posted 14 March 2012 - 09:59 PM

nikosliapis,

This should give you something to work with: :bye:
AutoIt         
#include <ButtonConstants.au3> #include <ComboConstants.au3> #include <GUIConstantsEx.au3> #include <StaticConstants.au3> #include <WindowsConstants.au3> #include <GUIScrollBars.au3> #include <ScrollBarConstants.au3> #include "GUIScrollbars_Size.au3" #include <Array.au3> $fScroll = False $iGUI_Ht = 438 Dim $combo[1] $form1 = GUICreate("Form1", 615, $iGUI_Ht, 192, 124) $combo[0] = GUICtrlCreateCombo("Combo1", 104, 50, 145, 25) $Button1 = GUICtrlCreateButton("Cancel", 272, 10, 99, 25) $Button2 = GUICtrlCreateButton("Add Combo", 136, 10, 97, 25) GUISetState(@SW_SHOW) $i = 0 While 1     $nMsg = GUIGetMsg()     Switch $nMsg         Case $GUI_EVENT_CLOSE             Exit         Case $Button1             Exit         Case $Button2             $i = $i + 1             ReDim $combo[$i + 1]             $combo[$i] = GUICtrlCreateCombo("Combo" & ($i + 1), 104, 50 + $i * 25, 145, 25)             If 50 + ($i * 25) + 30 > $iGUI_Ht Then                 $aRet = _GUIScrollbars_Size(0, 50 + ($i * 25) + 30, 0, $iGUI_Ht)                 If $fScroll = False Then                     GUIRegisterMsg($WM_VSCROLL, "_Scrollbars_WM_VSCROLL")                     _GUIScrollBars_Init($form1)                     _GUIScrollBars_ShowScrollBar($form1, $SB_VERT, True)                     _GUIScrollBars_ShowScrollBar($form1, $SB_HORZ, False)                     _GUIScrollBars_SetScrollInfoPage($form1, $SB_VERT, $aRet[2])                     _GUIScrollBars_SetScrollInfoMax($form1, $SB_VERT, $aRet[3])                     $fScroll = True                 Else                     _GUIScrollBars_SetScrollInfoPage($form1, $SB_VERT, $aRet[2])                     _GUIScrollBars_SetScrollInfoMax($form1, $SB_VERT, $aRet[3])                 EndIf             EndIf     EndSwitch WEnd Func _Scrollbars_WM_VSCROLL($hWnd, $Msg, $wParam, $lParam)     #forceref $Msg, $wParam, $lParam     Local $nScrollCode = BitAND($wParam, 0x0000FFFF)     Local $iIndex = -1, $yChar, $yPos     Local $Min, $Max, $Page, $Pos, $TrackPos     For $x = 0 To UBound($aSB_WindowInfo) - 1         If $aSB_WindowInfo[$x][0] = $hWnd Then             $iIndex = $x             $yChar = $aSB_WindowInfo[$iIndex][3]             ExitLoop         EndIf     Next     If $iIndex = -1 Then Return 0     Local $tSCROLLINFO = _GUIScrollBars_GetScrollInfoEx($hWnd, $SB_VERT)     $Min = DllStructGetData($tSCROLLINFO, "nMin")     $Max = DllStructGetData($tSCROLLINFO, "nMax")     $Page = DllStructGetData($tSCROLLINFO, "nPage")     $yPos = DllStructGetData($tSCROLLINFO, "nPos")     $Pos = $yPos     $TrackPos = DllStructGetData($tSCROLLINFO, "nTrackPos")     Switch $nScrollCode         Case $SB_TOP             DllStructSetData($tSCROLLINFO, "nPos", $Min)         Case $SB_BOTTOM             DllStructSetData($tSCROLLINFO, "nPos", $Max)         Case $SB_LINEUP             DllStructSetData($tSCROLLINFO, "nPos", $Pos - 1)         Case $SB_LINEDOWN             DllStructSetData($tSCROLLINFO, "nPos", $Pos + 1)         Case $SB_PAGEUP             DllStructSetData($tSCROLLINFO, "nPos", $Pos - $Page)         Case $SB_PAGEDOWN             DllStructSetData($tSCROLLINFO, "nPos", $Pos + $Page)         Case $SB_THUMBTRACK             DllStructSetData($tSCROLLINFO, "nPos", $TrackPos)     EndSwitch     DllStructSetData($tSCROLLINFO, "fMask", $SIF_POS)     _GUIScrollBars_SetScrollInfo($hWnd, $SB_VERT, $tSCROLLINFO)     _GUIScrollBars_GetScrollInfo($hWnd, $SB_VERT, $tSCROLLINFO)     $Pos = DllStructGetData($tSCROLLINFO, "nPos")     If ($Pos <> $yPos) Then         _GUIScrollBars_ScrollWindow($hWnd, 0, $yChar * ($yPos - $Pos))         $yPos = $Pos     EndIf     Return $GUI_RUNDEFMSG EndFunc   ;==>_Scrollbars_WM_VSCROLL

Please ask if you have any questions. :oops:

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


#10 nikosliapis

nikosliapis

    Wayfarer

  • Active Members
  • Pip
  • 50 posts

Posted 14 March 2012 - 10:33 PM

Well i understand that you store information in the array $aRet in order to create or adjust the scrollbar using
_GUIScrollBars_Init($form1)  _GUIScrollBars_ShowScrollBar($form1, $SB_VERT, True) _GUIScrollBars_ShowScrollBar($form1, $SB_HORZ, False) _GUIScrollBars_SetScrollInfoPage($form1, $SB_VERT, $aRet[2]) _GUIScrollBars_SetScrollInfoMax($form1, $SB_VERT, $aRet[3])
.
( to create)
and
_GUIScrollBars_SetScrollInfoPage($form1, $SB_VERT, $aRet[2]) _GUIScrollBars_SetScrollInfoMax($form1, $SB_VERT, $aRet[3])

(to adjust)

But i don't understand what this line and the function "_Scrollbars_WM_VSCROLL" do.
GUIRegisterMsg($WM_VSCROLL, "_Scrollbars_WM_VSCROLL")

Also would it be to much of me to ask you to make the script so that the combos scroll in a separate area (as you originally suggested), in order for the buttons
to be visible all time.
After that there is one more step, to make the scrollbar scroll down automatically, but please don't do that, I'll try to figure that my self. Only tell me if it is very difficult or not.
Thank you very much for the quick replies.
Coding can be fun when you do it your own.

#11 Melba23

Melba23

    Yes, me!

  • Moderators
  • 15,398 posts

Posted 15 March 2012 - 11:23 AM

nikosliapis,

I hope the weather is better where you are - I am looking at less than 25m in fog and our aircraft are firmly locked up in the hangar. :bye:

But i don't understand what this line and the function "_Scrollbars_WM_VSCROLL" do

Try reading the GUIRegisterMsg tutorial in the Wiki - ask again if you still have problems.

make the script so that the combos scroll in a separate area

Here is a quick and dirty example: :
AutoIt         
#include <GUIConstantsEx.au3> #include <WindowsConstants.au3> #include <WinAPI.au3> #include <GUIScrollBars.au3> #include <ScrollBarConstants.au3> #include <GUIScrollbars_Size.au3> Global $aCombo[2] = [1] Global $iGUI_Child_Ht = 300, $fScroll = False $hGUI = GUICreate("Form1", 500, 500) $cButton_1 = GUICtrlCreateButton("Cancel", 10, 10, 80, 25) $cButton_2 = GUICtrlCreateButton("Add Combo", 100, 10, 80, 25) $hGUI_Child = GUICreate("Child", 300, $iGUI_Child_Ht, 100, 100, BitOr($WS_POPUP, $WS_BORDER)) GUISetBkColor(0xCCFFCC) $aCombo[1] = GUICtrlCreateCombo("Combo1", 10, 10, 145, 25) ; Set main GUI as parent _WinAPI_SetParent($hGUI_Child, $hGUI) ; Show child GUISetState() GUISetState(@SW_SHOW, $hGUI) While 1     $aMsg = GUIGetMsg(1)     Switch $aMsg[1]         Case $hGUI             Switch $aMsg[0]                 Case $GUI_EVENT_CLOSE, $cButton_1                     Exit                 Case $cButton_2                     GUISwitch($hGUI_Child)                     $aCombo[0] += 1                     ReDim $aCombo[$aCombo[0] + 1]                     $aCombo[$aCombo[0]] = GUICtrlCreateCombo("Combo" & $aCombo[0], 10, 10 + (($aCombo[0] - 1) * 25), 145, 25)                     If 10 + (($aCombo[0] - 1) * 25) + 30 > $iGUI_Child_Ht Then                         $aRet = _GUIScrollbars_Size(0, 10 + (($aCombo[0] - 1) * 25) + 30, 0, $iGUI_Child_Ht)                         If $fScroll = False Then                             GUIRegisterMsg($WM_VSCROLL, "_Scrollbars_WM_VSCROLL")                             _GUIScrollBars_Init($hGUI_Child)                             _GUIScrollBars_ShowScrollBar($hGUI_Child, $SB_VERT, True)                             _GUIScrollBars_ShowScrollBar($hGUI_Child, $SB_HORZ, False)                             _GUIScrollBars_SetScrollInfoPage($hGUI_Child, $SB_VERT, $aRet[2])                             _GUIScrollBars_SetScrollInfoMax($hGUI_Child, $SB_VERT, $aRet[3])                             $fScroll = True                         Else                             _GUIScrollBars_SetScrollInfoPage($hGUI_Child, $SB_VERT, $aRet[2])                             _GUIScrollBars_SetScrollInfoMax($hGUI_Child, $SB_VERT, $aRet[3])                         EndIf                     EndIf                     GUISwitch($hGUI)             EndSwitch     EndSwitch WEnd Func _Scrollbars_WM_VSCROLL($hWnd, $Msg, $wParam, $lParam)     #forceref $Msg, $wParam, $lParam     Local $nScrollCode = BitAND($wParam, 0x0000FFFF)     Local $iIndex = -1, $yChar, $yPos     Local $Min, $Max, $Page, $Pos, $TrackPos     For $x = 0 To UBound($aSB_WindowInfo) - 1         If $aSB_WindowInfo[$x][0] = $hWnd Then             $iIndex = $x             $yChar = $aSB_WindowInfo[$iIndex][3]             ExitLoop         EndIf     Next     If $iIndex = -1 Then Return 0     Local $tSCROLLINFO = _GUIScrollBars_GetScrollInfoEx($hWnd, $SB_VERT)     $Min = DllStructGetData($tSCROLLINFO, "nMin")     $Max = DllStructGetData($tSCROLLINFO, "nMax")     $Page = DllStructGetData($tSCROLLINFO, "nPage")     $yPos = DllStructGetData($tSCROLLINFO, "nPos")     $Pos = $yPos     $TrackPos = DllStructGetData($tSCROLLINFO, "nTrackPos")     Switch $nScrollCode         Case $SB_TOP             DllStructSetData($tSCROLLINFO, "nPos", $Min)         Case $SB_BOTTOM             DllStructSetData($tSCROLLINFO, "nPos", $Max)         Case $SB_LINEUP             DllStructSetData($tSCROLLINFO, "nPos", $Pos - 1)         Case $SB_LINEDOWN             DllStructSetData($tSCROLLINFO, "nPos", $Pos + 1)         Case $SB_PAGEUP             DllStructSetData($tSCROLLINFO, "nPos", $Pos - $Page)         Case $SB_PAGEDOWN             DllStructSetData($tSCROLLINFO, "nPos", $Pos + $Page)         Case $SB_THUMBTRACK             DllStructSetData($tSCROLLINFO, "nPos", $TrackPos)     EndSwitch     DllStructSetData($tSCROLLINFO, "fMask", $SIF_POS)     _GUIScrollBars_SetScrollInfo($hWnd, $SB_VERT, $tSCROLLINFO)     _GUIScrollBars_GetScrollInfo($hWnd, $SB_VERT, $tSCROLLINFO)     $Pos = DllStructGetData($tSCROLLINFO, "nPos")     If ($Pos <> $yPos) Then         _GUIScrollBars_ScrollWindow($hWnd, 0, $yChar * ($yPos - $Pos))         $yPos = $Pos     EndIf     Return $GUI_RUNDEFMSG EndFunc   ;==>_Scrollbars_WM_VSCROLL
You will notice that the combos appear to get bigger if they are created after the scrollbars appear - this is explained here. It is not difficult to prevent, but would only further complicate the example so I left it as it is. :doh:

Any more questions? :oops:

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


#12 nikosliapis

nikosliapis

    Wayfarer

  • Active Members
  • Pip
  • 50 posts

Posted 15 March 2012 - 04:03 PM

I don't want to disappoint you, but i leave in greece and the weather is pretty sunny the last 2 days :oops:

I trully want to thank you for all your help, you gave me enough material to study. When i finish the script,
i'll post it here to see, it is an "Arduino Programmer"

Thank you again.
Coding can be fun when you do it your own.

#13 nikosliapis

nikosliapis

    Wayfarer

  • Active Members
  • Pip
  • 50 posts

Posted 16 March 2012 - 02:02 PM

Well here i am again with a new problem.

Just test the code below and you'll understand
Plain Text         
#include <ButtonConstants.au3> #include <ComboConstants.au3> #include <GUIConstantsEx.au3> #include <StaticConstants.au3> #include <WindowsConstants.au3> #include <GUIScrollBars.au3> #include <ScrollBarConstants.au3> #include "GUIScrollbars_Size.au3" #include <Array.au3> ; a Dim $combo[1] $main = GUICreate("Main", 615, 438, 192, 124) $Button1 = GUICtrlCreateButton("Cancel", 272, 392, 99, 25) $Button2 = GUICtrlCreateButton("Add Combo", 136, 392, 97, 25) $child = GUICreate ("Child", 550, 350, 10,10, $WS_CHILD, $WS_EX_CLIENTEDGE, $main) $Combo[0] = GUICtrlCreateCombo("Combo1", 104, 24, 145, 25) GUISetState(@SW_SHOW) GUISwitch ($main) GUISetState(@SW_SHOW) $fScroll = False $i=0 While 1 $nMsg = GUIGetMsg() Switch $nMsg   Case $GUI_EVENT_CLOSE    Exit   Case $Button1    Exit   Case $Button2    GUISwitch ($child)    $i=$i+1    ReDim $combo[$i+1]    $combo[$i] = GUICtrlCreateCombo("Combo" & ($i+1), 104, 24+$i*25, 145,25)    If 24+$i*25 > 330 Then     $aRet = _GUIScrollbars_Size(0, 24+$i*25, 0, 330)     If $fScroll = False Then      GUIRegisterMsg($WM_VSCROLL, "_Scrollbars_WM_VSCROLL")      _GUIScrollBars_Init($child)                     _GUIScrollBars_ShowScrollBar($child, $SB_VERT, True)                     _GUIScrollBars_ShowScrollBar($child, $SB_HORZ, False)                     _GUIScrollBars_SetScrollInfoPage($child, $SB_VERT, $aRet[2])                     _GUIScrollBars_SetScrollInfoMax($child, $SB_VERT, $aRet[3])      _GUIScrollBars_SetScrollInfoPos($child, $SB_VERT, $aRet[3])                     $fScroll = True     Else      _GUIScrollBars_SetScrollInfoPage($child, $SB_VERT, $aRet[2])                     _GUIScrollBars_SetScrollInfoMax($child, $SB_VERT, $aRet[3])      _GUIScrollBars_SetScrollInfoPos($child, $SB_VERT, $aRet[3])     EndIf    EndIf EndSwitch WEnd Func _Scrollbars_WM_VSCROLL($hWnd, $Msg, $wParam, $lParam)     #forceref $Msg, $wParam, $lParam     Local $nScrollCode = BitAND($wParam, 0x0000FFFF)     Local $iIndex = -1, $yChar, $yPos     Local $Min, $Max, $Page, $Pos, $TrackPos     For $x = 0 To UBound($aSB_WindowInfo) - 1         If $aSB_WindowInfo[$x][0] = $hWnd Then             $iIndex = $x             $yChar = $aSB_WindowInfo[$iIndex][3]             ExitLoop         EndIf     Next     If $iIndex = -1 Then Return 0     Local $tSCROLLINFO = _GUIScrollBars_GetScrollInfoEx($hWnd, $SB_VERT)     $Min = DllStructGetData($tSCROLLINFO, "nMin")     $Max = DllStructGetData($tSCROLLINFO, "nMax")     $Page = DllStructGetData($tSCROLLINFO, "nPage")     $yPos = DllStructGetData($tSCROLLINFO, "nPos")     $Pos = $yPos     $TrackPos = DllStructGetData($tSCROLLINFO, "nTrackPos")     Switch $nScrollCode         Case $SB_TOP             DllStructSetData($tSCROLLINFO, "nPos", $Min)         Case $SB_BOTTOM             DllStructSetData($tSCROLLINFO, "nPos", $Max)         Case $SB_LINEUP             DllStructSetData($tSCROLLINFO, "nPos", $Pos - 1)         Case $SB_LINEDOWN             DllStructSetData($tSCROLLINFO, "nPos", $Pos + 1)         Case $SB_PAGEUP             DllStructSetData($tSCROLLINFO, "nPos", $Pos - $Page)         Case $SB_PAGEDOWN             DllStructSetData($tSCROLLINFO, "nPos", $Pos + $Page)         Case $SB_THUMBTRACK             DllStructSetData($tSCROLLINFO, "nPos", $TrackPos)     EndSwitch     DllStructSetData($tSCROLLINFO, "fMask", $SIF_POS)     _GUIScrollBars_SetScrollInfo($hWnd, $SB_VERT, $tSCROLLINFO)     _GUIScrollBars_GetScrollInfo($hWnd, $SB_VERT, $tSCROLLINFO)     $Pos = DllStructGetData($tSCROLLINFO, "nPos")     If ($Pos <> $yPos) Then         _GUIScrollBars_ScrollWindow($hWnd, 0, $yChar * ($yPos - $Pos))         $yPos = $Pos     EndIf     Return $GUI_RUNDEFMSG EndFunc   ;==>_Scrollbars_WM_VSCROLL



The problem is not only that the newly created combos are off position, but they are not always created when the add combo button is pressed.
Please "scrollbar-Master" :oops: show me the way .....

Edited by nikosliapis, 16 March 2012 - 02:03 PM.

Coding can be fun when you do it your own.

#14 Melba23

Melba23

    Yes, me!

  • Moderators
  • 15,398 posts

Posted 20 March 2012 - 12:32 PM

nikosliapis,

I think this is as good as you can get. As you can see you need a fair few things to cater for the arrival of the scrollbar in the GUI as the coordinates of subsequent controls need to be adjusted: :bye:
AutoIt         
#include <GUIConstantsEx.au3> #include <WindowsConstants.au3> #include <GUIScrollBars.au3> #include <ScrollBarConstants.au3> #include "GUIScrollbars_Size.au3" #include <WinAPI.au3> Global  $aLabel[1] $hGUI = GUICreate("Main", 500, 500) $cButton_1 = GUICtrlCreateButton("Cancel", 272, 400, 80, 25) $cButton_2 = GUICtrlCreateButton("Add label", 136, 400, 80, 25) $hGUI_Child = GUICreate("Child", 480, 350, 10, 10, $WS_CHILD, $WS_EX_CLIENTEDGE, $hGUI) $aLabel[0] = GUICtrlCreateLabel("Label 0", 100, 25, 145, 25) GUISetState(@SW_SHOW, $hGUI_Child) GUISetState(@SW_SHOW, $hGUI) $fScroll = False $i = 0 $iX = 100 While 1     Switch GUIGetMsg()         Case $GUI_EVENT_CLOSE, $cButton_1             Exit         Case $cButton_2             GUISwitch($hGUI_Child)             $i += 1             ReDim $aLabel[$i + 1]             ; Calculate y coord for new label             $iY = 25 + (25 * $i)             ; Scroll to top             _GUIScrollBars_SetScrollInfoPos($hGUI_Child, $SB_VERT, 0)             ; Create label             $aLabel[$i] = GUICtrlCreateLabel("Label " & $i, $iX, $iY, 145, 25)             ; Do we need scrollbars?             If $iY > 315 Then                 ; Calculate size required                 $aRet = _GUIScrollbars_Size(0, $iY + 25, 0, 350)                 ; If it is the initial creation                 If $fScroll = False Then                     GUIRegisterMsg($WM_VSCROLL, "_Scrollbars_WM_VSCROLL")                     _GUIScrollBars_Init($hGUI_Child)                     _GUIScrollBars_ShowScrollBar($hGUI_Child, $SB_VERT, True)                     _GUIScrollBars_ShowScrollBar($hGUI_Child, $SB_HORZ, False)                     _GUIScrollBars_SetScrollInfoPage($hGUI_Child, $SB_VERT, $aRet[2])                     _GUIScrollBars_SetScrollInfoMax($hGUI_Child, $SB_VERT, $aRet[3])                     ; Adjust x coord for appearance of scrollbar                     $iScroll_Width = _WinAPI_GetSystemMetrics(2) ; SM_CXVSCROLL                     $iX = 100 * (480 - $iScroll_Width) / 480                     ; Set flag                     $fScroll = True                 Else                     _GUIScrollBars_SetScrollInfoPage($hGUI_Child, $SB_VERT, $aRet[2])                     _GUIScrollBars_SetScrollInfoMax($hGUI_Child, $SB_VERT, $aRet[3])                 EndIf             EndIf             ; Recheck max size and rescroll to bottom             If $fScroll Then                 $aRet = _GUIScrollbars_Size(0, $iY + 25, 0, 330)                 _GUIScrollBars_SetScrollInfoPos($hGUI_Child, $SB_VERT, $aRet[3])             EndIf     EndSwitch WEnd Func _Scrollbars_WM_VSCROLL($hWnd, $Msg, $wParam, $lParam)     #forceref $Msg, $wParam, $lParam     Local $nScrollCode = BitAND($wParam, 0x0000FFFF)     Local $iIndex = -1, $yChar, $yPos     Local $Min, $Max, $Page, $Pos, $TrackPos     For $x = 0 To UBound($aSB_WindowInfo) - 1         If $aSB_WindowInfo[$x][0] = $hWnd Then             $iIndex = $x             $yChar = $aSB_WindowInfo[$iIndex][3]             ExitLoop         EndIf     Next     If $iIndex = -1 Then Return 0     Local $tSCROLLINFO = _GUIScrollBars_GetScrollInfoEx($hWnd, $SB_VERT)     $Min = DllStructGetData($tSCROLLINFO, "nMin")     $Max = DllStructGetData($tSCROLLINFO, "nMax")     $Page = DllStructGetData($tSCROLLINFO, "nPage")     $yPos = DllStructGetData($tSCROLLINFO, "nPos")     $Pos = $yPos     $TrackPos = DllStructGetData($tSCROLLINFO, "nTrackPos")     Switch $nScrollCode         Case $SB_TOP             DllStructSetData($tSCROLLINFO, "nPos", $Min)         Case $SB_BOTTOM             DllStructSetData($tSCROLLINFO, "nPos", $Max)         Case $SB_LINEUP             DllStructSetData($tSCROLLINFO, "nPos", $Pos - 1)         Case $SB_LINEDOWN             DllStructSetData($tSCROLLINFO, "nPos", $Pos + 1)         Case $SB_PAGEUP             DllStructSetData($tSCROLLINFO, "nPos", $Pos - $Page)         Case $SB_PAGEDOWN             DllStructSetData($tSCROLLINFO, "nPos", $Pos + $Page)         Case $SB_THUMBTRACK             DllStructSetData($tSCROLLINFO, "nPos", $TrackPos)     EndSwitch     DllStructSetData($tSCROLLINFO, "fMask", $SIF_POS)     _GUIScrollBars_SetScrollInfo($hWnd, $SB_VERT, $tSCROLLINFO)     _GUIScrollBars_GetScrollInfo($hWnd, $SB_VERT, $tSCROLLINFO)     $Pos = DllStructGetData($tSCROLLINFO, "nPos")     If ($Pos <> $yPos) Then         _GUIScrollBars_ScrollWindow($hWnd, 0, $yChar * ($yPos - $Pos))         $yPos = $Pos     EndIf     Return $GUI_RUNDEFMSG EndFunc   ;==>_Scrollbars_WM_VSCROLL

Any more requests? :oops:

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





0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users