Turkey77 Posted July 22, 2009 Share Posted July 22, 2009 (edited) Hi, Is there a way to use OnEventMode with scrollbars? I am only finding examples for Msg Mode. Thank you. expandcollapse popup#include <GUIConstantsEx.au3> #include <WindowsConstants.au3> #include <Guiscrollbars.au3> #include <Array.au3> #include <GuiButton.au3> Opt('GUIOnEventMode', 1) ; Forces OnEvent mode $hGUI = GUICreate("Scroll Testing",200,200,-1,-1,BitOR($GUI_SS_DEFAULT_GUI,$WS_VSCROLL)) GUISetOnEvent($GUI_EVENT_CLOSE, "close_program") Dim $aButtons[100][2] $y = 10 for $x = 1 to 99 $aButtons[$x][0] = GUICtrlCreateButton("Button "&$x, 10, $y,75,20);creates buttons and adds controlID to the array $aButtons[$x][1] = "Button "&$x;adds button label to the array ;;;;;;;;;;not needed for this example GUICtrlSetOnEvent($aButtons[$x][0],"Clicker") $y += 30 Next GUISetState() _GUIScrollBars_Init($hGUI) While 1 Sleep(1000) WEnd Func Clicker() Local $buttonTxt $buttonTxt = _GUICtrlButton_GetText(@GUI_CtrlId) MsgBox(0,"Button Clicked","You clicked "&$buttonTxt) EndFunc Func close_program() GUIDelete() Exit EndFunc Edited July 22, 2009 by Turkey77 Link to comment Share on other sites More sharing options...
wraithdu Posted July 22, 2009 Share Posted July 22, 2009 You're missing all the code that actually makes this work. Look at the _GUIScrollBars_Init() example. Message mode versus OnEventMode is meaningless in the example. Link to comment Share on other sites More sharing options...
Turkey77 Posted July 22, 2009 Author Share Posted July 22, 2009 Thank you for the quick reply. After reading over _GUIScrollBars_Init() again, it appears that I can make it work by including the GUIcreate within a function. Any suggestions are appreciated since I'm still learning the GUI! expandcollapse popup#include <GUIConstantsEx.au3> #include <WindowsConstants.au3> #include <Guiscrollbars.au3> #include <Array.au3> #include <GuiButton.au3> #include <ScrollBarConstants.au3> Opt('GUIOnEventMode', 1) ; Forces OnEvent mode ;~ Opt("MustDeclareVars", 1) _Main() Func _Main() $hGUI = GUICreate("Scroll Testing",200,200,-1,-1,BitOR($GUI_SS_DEFAULT_GUI,$WS_VSCROLL)) GUISetOnEvent($GUI_EVENT_CLOSE, "close_program") Dim $aButtons[100][2] $y = 10 for $x = 1 to 99 $aButtons[$x][0] = GUICtrlCreateButton("Button "&$x, 10, $y,75,20);creates buttons and adds controlID to the array $aButtons[$x][1] = "Button "&$x;adds button label to the array GUICtrlSetOnEvent($aButtons[$x][0],"Clicker") $y += 30 Next ;~ GUISwitch($hGUI) ;~ GUIRegisterMsg($WM_SIZE, "WM_SIZE") GUIRegisterMsg($WM_VSCROLL, "WM_VSCROLL") GUIRegisterMsg($WM_HSCROLL, "WM_HSCROLL") _GUIScrollBars_SetScrollRange($hGUI, $SB_VERT, 0, Ubound($aButtons,1)*2) _GUIScrollBars_Init($hGUI) GUISetState() While 1 $GUIMsg = GUIGetMsg() Switch $GUIMsg Case $GUI_EVENT_CLOSE ExitLoop EndSwitch WEnd Exit EndFunc Func Clicker() Local $buttonTxt $buttonTxt = _GUICtrlButton_GetText(@GUI_CtrlId) MsgBox(0,"Button Clicked","You clicked "&$buttonTxt) EndFunc Func close_program() GUIDelete() Exit EndFunc Func WM_HSCROLL($hWnd, $Msg, $wParam, $lParam) #forceref $Msg, $lParam Local $nScrollCode = BitAND($wParam, 0x0000FFFF) Local $index = -1, $xChar, $xPos Local $Min, $Max, $Page, $Pos, $TrackPos For $x = 0 To UBound($aSB_WindowInfo) - 1 If $aSB_WindowInfo[$x][0] = $hWnd Then $index = $x $xChar = $aSB_WindowInfo[$index][2] ExitLoop EndIf Next If $index = -1 Then Return 0 ;~ ; Get all the horizontal scroll bar information Local $tSCROLLINFO = _GUIScrollBars_GetScrollInfoEx($hWnd, $SB_HORZ) $Min = DllStructGetData($tSCROLLINFO, "nMin") $Max = DllStructGetData($tSCROLLINFO, "nMax") $Page = DllStructGetData($tSCROLLINFO, "nPage") ; Save the position for comparison later on $xPos = DllStructGetData($tSCROLLINFO, "nPos") $Pos = $xPos $TrackPos = DllStructGetData($tSCROLLINFO, "nTrackPos") #forceref $Min, $Max Switch $nScrollCode Case $SB_LINELEFT ; user clicked left arrow DllStructSetData($tSCROLLINFO, "nPos", $Pos - 1) Case $SB_LINERIGHT ; user clicked right arrow DllStructSetData($tSCROLLINFO, "nPos", $Pos + 1) Case $SB_PAGELEFT ; user clicked the scroll bar shaft left of the scroll box DllStructSetData($tSCROLLINFO, "nPos", $Pos - $Page) Case $SB_PAGERIGHT ; user clicked the scroll bar shaft right of the scroll box DllStructSetData($tSCROLLINFO, "nPos", $Pos + $Page) Case $SB_THUMBTRACK ; user dragged the scroll box DllStructSetData($tSCROLLINFO, "nPos", $TrackPos) EndSwitch ;~ // Set the position and then retrieve it. Due to adjustments ;~ // by Windows it may not be the same as the value set. DllStructSetData($tSCROLLINFO, "fMask", $SIF_POS) _GUIScrollBars_SetScrollInfo($hWnd, $SB_HORZ, $tSCROLLINFO) _GUIScrollBars_GetScrollInfo($hWnd, $SB_HORZ, $tSCROLLINFO) ;// If the position has changed, scroll the window and update it $Pos = DllStructGetData($tSCROLLINFO, "nPos") If ($Pos <> $xPos) Then _GUIScrollBars_ScrollWindow($hWnd, $xChar * ($xPos - $Pos), 0) Return $GUI_RUNDEFMSG EndFunc ;==>WM_HSCROLL Func WM_VSCROLL($hWnd, $Msg, $wParam, $lParam) #forceref $Msg, $wParam, $lParam Local $nScrollCode = BitAND($wParam, 0x0000FFFF) Local $index = -1, $yChar, $yPos Local $Min, $Max, $Page, $Pos, $TrackPos For $x = 0 To UBound($aSB_WindowInfo) - 1 If $aSB_WindowInfo[$x][0] = $hWnd Then $index = $x $yChar = $aSB_WindowInfo[$index][3] ExitLoop EndIf Next If $index = -1 Then Return 0 ; Get all the vertial scroll bar information Local $tSCROLLINFO = _GUIScrollBars_GetScrollInfoEx($hWnd, $SB_VERT) $Min = DllStructGetData($tSCROLLINFO, "nMin") $Max = DllStructGetData($tSCROLLINFO, "nMax") $Page = DllStructGetData($tSCROLLINFO, "nPage") ; Save the position for comparison later on $yPos = DllStructGetData($tSCROLLINFO, "nPos") $Pos = $yPos $TrackPos = DllStructGetData($tSCROLLINFO, "nTrackPos") Switch $nScrollCode Case $SB_TOP ; user clicked the HOME keyboard key DllStructSetData($tSCROLLINFO, "nPos", $Min) Case $SB_BOTTOM ; user clicked the END keyboard key DllStructSetData($tSCROLLINFO, "nPos", $Max) Case $SB_LINEUP ; user clicked the top arrow DllStructSetData($tSCROLLINFO, "nPos", $Pos - 1) Case $SB_LINEDOWN ; user clicked the bottom arrow DllStructSetData($tSCROLLINFO, "nPos", $Pos + 1) Case $SB_PAGEUP ; user clicked the scroll bar shaft above the scroll box DllStructSetData($tSCROLLINFO, "nPos", $Pos - $Page) Case $SB_PAGEDOWN ; user clicked the scroll bar shaft below the scroll box DllStructSetData($tSCROLLINFO, "nPos", $Pos + $Page) Case $SB_THUMBTRACK ; user dragged the scroll box DllStructSetData($tSCROLLINFO, "nPos", $TrackPos) EndSwitch ;~ // Set the position and then retrieve it. Due to adjustments ;~ // by Windows it may not be the same as the value set. DllStructSetData($tSCROLLINFO, "fMask", $SIF_POS) _GUIScrollBars_SetScrollInfo($hWnd, $SB_VERT, $tSCROLLINFO) _GUIScrollBars_GetScrollInfo($hWnd, $SB_VERT, $tSCROLLINFO) ;// If the position has changed, scroll the window and update it $Pos = DllStructGetData($tSCROLLINFO, "nPos") If ($Pos <> $yPos) Then _GUIScrollBars_ScrollWindow($hWnd, 0, $yChar * ($yPos - $Pos)) $yPos = $Pos EndIf Return $GUI_RUNDEFMSG EndFunc ;==>WM_VSCROLL Link to comment Share on other sites More sharing options...
wraithdu Posted July 23, 2009 Share Posted July 23, 2009 You should not combine OnEventMode and Message Mode like that. It's unnecessary and *will* cause you headaches. Learn the difference between the two and it's not hard to convert the example. You were actually pretty close. Also see the small change in your Clicker() function. expandcollapse popup#include <GUIConstantsEx.au3> #include <WindowsConstants.au3> #include <Guiscrollbars.au3> #include <Array.au3> #include <ScrollBarConstants.au3> Opt('GUIOnEventMode', 1) ; Forces OnEvent mode ;~ Opt("MustDeclareVars", 1) $hGUI = GUICreate("Scroll Testing",200,200,-1,-1,BitOR($GUI_SS_DEFAULT_GUI,$WS_VSCROLL)) GUISetOnEvent($GUI_EVENT_CLOSE, "close_program") Global $aButtons[100][2] $y = 10 for $x = 1 to 99 $aButtons[$x][0] = GUICtrlCreateButton("Button "&$x, 10, $y,75,20);creates buttons and adds controlID to the array $aButtons[$x][1] = "Button "&$x;adds button label to the array GUICtrlSetOnEvent($aButtons[$x][0],"Clicker") $y += 30 Next ;~ GUISwitch($hGUI) ;~ GUIRegisterMsg($WM_SIZE, "WM_SIZE") GUIRegisterMsg($WM_VSCROLL, "WM_VSCROLL") GUIRegisterMsg($WM_HSCROLL, "WM_HSCROLL") _GUIScrollBars_SetScrollRange($hGUI, $SB_VERT, 0, Ubound($aButtons,1)*2) _GUIScrollBars_Init($hGUI) GUISetState() ; message loop for OnEventMode While 1 Sleep(1000) WEnd Func Clicker() ; use ControlGetText, no reason to call the UDF function when the built-in will suffice Local $buttonTxt $buttonTxt = ControlGetText($hGUI, "", @GUI_CtrlId) MsgBox(0,"Button Clicked","You clicked "&$buttonTxt) EndFunc Func close_program() GUIDelete() Exit EndFunc Func WM_HSCROLL($hWnd, $Msg, $wParam, $lParam) #forceref $Msg, $lParam Local $nScrollCode = BitAND($wParam, 0x0000FFFF) Local $index = -1, $xChar, $xPos Local $Min, $Max, $Page, $Pos, $TrackPos For $x = 0 To UBound($aSB_WindowInfo) - 1 If $aSB_WindowInfo[$x][0] = $hWnd Then $index = $x $xChar = $aSB_WindowInfo[$index][2] ExitLoop EndIf Next If $index = -1 Then Return 0 ;~ ; Get all the horizontal scroll bar information Local $tSCROLLINFO = _GUIScrollBars_GetScrollInfoEx($hWnd, $SB_HORZ) $Min = DllStructGetData($tSCROLLINFO, "nMin") $Max = DllStructGetData($tSCROLLINFO, "nMax") $Page = DllStructGetData($tSCROLLINFO, "nPage") ; Save the position for comparison later on $xPos = DllStructGetData($tSCROLLINFO, "nPos") $Pos = $xPos $TrackPos = DllStructGetData($tSCROLLINFO, "nTrackPos") #forceref $Min, $Max Switch $nScrollCode Case $SB_LINELEFT ; user clicked left arrow DllStructSetData($tSCROLLINFO, "nPos", $Pos - 1) Case $SB_LINERIGHT ; user clicked right arrow DllStructSetData($tSCROLLINFO, "nPos", $Pos + 1) Case $SB_PAGELEFT ; user clicked the scroll bar shaft left of the scroll box DllStructSetData($tSCROLLINFO, "nPos", $Pos - $Page) Case $SB_PAGERIGHT ; user clicked the scroll bar shaft right of the scroll box DllStructSetData($tSCROLLINFO, "nPos", $Pos + $Page) Case $SB_THUMBTRACK ; user dragged the scroll box DllStructSetData($tSCROLLINFO, "nPos", $TrackPos) EndSwitch ;~ // Set the position and then retrieve it. Due to adjustments ;~ // by Windows it may not be the same as the value set. DllStructSetData($tSCROLLINFO, "fMask", $SIF_POS) _GUIScrollBars_SetScrollInfo($hWnd, $SB_HORZ, $tSCROLLINFO) _GUIScrollBars_GetScrollInfo($hWnd, $SB_HORZ, $tSCROLLINFO) ;// If the position has changed, scroll the window and update it $Pos = DllStructGetData($tSCROLLINFO, "nPos") If ($Pos <> $xPos) Then _GUIScrollBars_ScrollWindow($hWnd, $xChar * ($xPos - $Pos), 0) Return $GUI_RUNDEFMSG EndFunc ;==>WM_HSCROLL Func WM_VSCROLL($hWnd, $Msg, $wParam, $lParam) #forceref $Msg, $wParam, $lParam Local $nScrollCode = BitAND($wParam, 0x0000FFFF) Local $index = -1, $yChar, $yPos Local $Min, $Max, $Page, $Pos, $TrackPos For $x = 0 To UBound($aSB_WindowInfo) - 1 If $aSB_WindowInfo[$x][0] = $hWnd Then $index = $x $yChar = $aSB_WindowInfo[$index][3] ExitLoop EndIf Next If $index = -1 Then Return 0 ; Get all the vertial scroll bar information Local $tSCROLLINFO = _GUIScrollBars_GetScrollInfoEx($hWnd, $SB_VERT) $Min = DllStructGetData($tSCROLLINFO, "nMin") $Max = DllStructGetData($tSCROLLINFO, "nMax") $Page = DllStructGetData($tSCROLLINFO, "nPage") ; Save the position for comparison later on $yPos = DllStructGetData($tSCROLLINFO, "nPos") $Pos = $yPos $TrackPos = DllStructGetData($tSCROLLINFO, "nTrackPos") Switch $nScrollCode Case $SB_TOP ; user clicked the HOME keyboard key DllStructSetData($tSCROLLINFO, "nPos", $Min) Case $SB_BOTTOM ; user clicked the END keyboard key DllStructSetData($tSCROLLINFO, "nPos", $Max) Case $SB_LINEUP ; user clicked the top arrow DllStructSetData($tSCROLLINFO, "nPos", $Pos - 1) Case $SB_LINEDOWN ; user clicked the bottom arrow DllStructSetData($tSCROLLINFO, "nPos", $Pos + 1) Case $SB_PAGEUP ; user clicked the scroll bar shaft above the scroll box DllStructSetData($tSCROLLINFO, "nPos", $Pos - $Page) Case $SB_PAGEDOWN ; user clicked the scroll bar shaft below the scroll box DllStructSetData($tSCROLLINFO, "nPos", $Pos + $Page) Case $SB_THUMBTRACK ; user dragged the scroll box DllStructSetData($tSCROLLINFO, "nPos", $TrackPos) EndSwitch ;~ // Set the position and then retrieve it. Due to adjustments ;~ // by Windows it may not be the same as the value set. DllStructSetData($tSCROLLINFO, "fMask", $SIF_POS) _GUIScrollBars_SetScrollInfo($hWnd, $SB_VERT, $tSCROLLINFO) _GUIScrollBars_GetScrollInfo($hWnd, $SB_VERT, $tSCROLLINFO) ;// If the position has changed, scroll the window and update it $Pos = DllStructGetData($tSCROLLINFO, "nPos") If ($Pos <> $yPos) Then _GUIScrollBars_ScrollWindow($hWnd, 0, $yChar * ($yPos - $Pos)) $yPos = $Pos EndIf Return $GUI_RUNDEFMSG EndFunc ;==>WM_VSCROLL Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now