Scrollen in der Gui, aber nur ein bestimmter bereich

  • hallo zusammen,

    ich habe eine Gui die mit Werten gefüllt wird.
    Nun wollte ich den mittleren bereich gerne zum scrollen machen, weiß aber gerade echt nicht wie ich da vorgehen soll.

    Im Beispiel habe ich ein Groupfeld erstellt, so groß soll quasi der Bereich sein zum scrollen. alles andere nicht.
    Der Inhalt wird dann variable gefüllt.

    Danke vorab!

    [autoit]

    $gui = GUICreate("Forum ", 633, 447, 190, 220)
    $acalabeltop = GUICtrlCreateLabel("Forum" , 240, 8,200)
    GUICtrlSetFont($acalabeltop, 18, "" , "","Copperplate Gothic Bold")
    GUISetBkColor(0xFFFFFF)
    $weiter = GUICtrlCreateButton("Weiter", 448, 410, 100, 25)
    $abbrechen = GUICtrlCreateButton("Beenden", 264, 410, 100, 25)
    $zurueck = GUICtrlCreateButton("Zurück", 72, 410, 100, 25)
    GUICtrlCreateGroup("Bereich zum scrollen", 16, 73, 601, 286)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    GUICtrlSetFont(-1, 10, 400, 4, "MS Sans Serif")
    GUICtrlCreateLabel("Telefonnummer:", 200, 376, 80, 17)
    $telefon = GUICtrlCreateInput("", 304, 374, 121, 21)
    ;~ $Pic1 = GUICtrlCreatePic($inifilepath & "logo.jpg", 485, 0,"","", "")
    GUISetState(@SW_SHOW)

    [/autoit][autoit][/autoit][autoit]

    While 1
    ;~ danke
    WEnd

    [/autoit]
  • an deiner stelle würde ich ein control verwenden mit dem man gut arbeiten kann.

    listview oder listbox controls sin da wohl die geeignetsten.

    außer dir schwebt anderes vor?

  • ja leider schwebt mir da was ganz anderes vor.


    Im mittleren Teil werden quasi Werte aus INI Dateien gelesen und Label/Radios/EDIT Boxen etc erstellt.

    Das ganze ist variable und hat mehrere ebenen, das heißt wählt der Benutzer ein Radio XY aus geht es weiter zu XY Ebene usw.

    Das heißt mit Listview wird das nicht gehen, oder?

  • naja es geht einigermaßen.
    treeview mit styles z.b.

    Spoiler anzeigen
    [autoit]

    #include <GuiConstantsEx.au3>
    #include <TreeViewConstants.au3>

    [/autoit] [autoit][/autoit] [autoit]

    GuiCreate("GUI", 150, 150)

    [/autoit] [autoit][/autoit] [autoit]

    $treeTwo = GuiCtrlCreateTreeView(10, 10, 130, 130, $TVS_CHECKBOXES)
    GuiCtrlCreateTreeViewItem("TreeView", $treeTwo)
    GuiCtrlCreateTreeViewItem("With", $treeTwo)
    GuiCtrlCreateTreeViewItem("tvs_checkboxes", $treeTwo)
    GuiCtrlCreateTreeViewItem("Style", $treeTwo)
    GuiSetState()

    [/autoit] [autoit][/autoit] [autoit]

    While GuiGetMsg() <> $GUI_EVENT_CLOSE
    WEnd

    [/autoit]
  • einfachste Möglichkeit:
    erstelle ein Child GUI mit dem Style $WS_POPUP und ExStyle $WS_EX_MDICHILD und wähle dein Haupt GUI als Parent.
    Das Child wird nun in den Bereich gesetzt in dem gescrollt werden soll, und die Controls erstellst du dann auf dem Child GUI.

    //EDIT:
    So mein ich das:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <ScrollBarConstants.au3>
    #include <GuiScrollBars.au3>
    #include <WindowsConstants.au3>
    $gui = GUICreate("Forum ", 633, 447, 190, 220)
    $acalabeltop = GUICtrlCreateLabel("Forum", 240, 8, 200)
    GUICtrlSetFont($acalabeltop, 18, "", "", "Copperplate Gothic Bold")
    GUISetBkColor(0xFFFFFF)
    $weiter = GUICtrlCreateButton("Weiter", 448, 410, 100, 25)
    $abbrechen = GUICtrlCreateButton("Beenden", 264, 410, 100, 25)
    $zurueck = GUICtrlCreateButton("Zurück", 72, 410, 100, 25)
    GUICtrlCreateGroup("Bereich zum scrollen", 16, 73, 601, 286)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    GUICtrlSetFont(-1, 10, 400, 4, "MS Sans Serif")
    GUICtrlCreateLabel("Telefonnummer:", 200, 376, 80, 17)
    $telefon = GUICtrlCreateInput("", 304, 374, 121, 21)
    ;~ $Pic1 = GUICtrlCreatePic($inifilepath & "logo.jpg", 485, 0,"","", "")
    GUISetState(@SW_SHOW,$gui)

    [/autoit] [autoit][/autoit] [autoit]

    $hChild = GUICreate("Scrollbereich",581,263,26,88,$WS_POPUP,$WS_EX_MDICHILD,$gui)
    _GUIScrollBars_Init($hChild)
    _GUIScrollBars_ShowScrollBar($hChild, $SB_HORZ,False) ; horizontale Scrollbar verstecken
    GUICtrlCreateButton("test",100,100,100,20)
    GUISetState(@SW_SHOW,$hChild)
    GUIRegisterMsg($WM_VSCROLL, "WM_VSCROLL")

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    While 1
    ;~ danke
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    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

    [/autoit] [autoit][/autoit] [autoit]

    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

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ; 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")

    [/autoit] [autoit][/autoit] [autoit]

    Switch $nScrollCode
    Case $SB_TOP ; user clicked the HOME keyboard key
    DllStructSetData($tSCROLLINFO, "nPos", $Min)

    [/autoit] [autoit][/autoit] [autoit]

    Case $SB_BOTTOM ; user clicked the END keyboard key
    DllStructSetData($tSCROLLINFO, "nPos", $Max)

    [/autoit] [autoit][/autoit] [autoit]

    Case $SB_LINEUP ; user clicked the top arrow
    DllStructSetData($tSCROLLINFO, "nPos", $Pos - 1)

    [/autoit] [autoit][/autoit] [autoit]

    Case $SB_LINEDOWN ; user clicked the bottom arrow
    DllStructSetData($tSCROLLINFO, "nPos", $Pos + 1)

    [/autoit] [autoit][/autoit] [autoit]

    Case $SB_PAGEUP ; user clicked the scroll bar shaft above the scroll box
    DllStructSetData($tSCROLLINFO, "nPos", $Pos - $Page)

    [/autoit] [autoit][/autoit] [autoit]

    Case $SB_PAGEDOWN ; user clicked the scroll bar shaft below the scroll box
    DllStructSetData($tSCROLLINFO, "nPos", $Pos + $Page)

    [/autoit] [autoit][/autoit] [autoit]

    Case $SB_THUMBTRACK ; user dragged the scroll box
    DllStructSetData($tSCROLLINFO, "nPos", $TrackPos)
    EndSwitch

    [/autoit] [autoit][/autoit] [autoit]

    ;~ // Set the position and then retrieve it. Due to adjustments
    ;~ // by Windows it may not be the same as the value set.

    [/autoit] [autoit][/autoit] [autoit]

    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")

    [/autoit] [autoit][/autoit] [autoit]

    If ($Pos <> $yPos) Then
    _GUIScrollBars_ScrollWindow($hWnd, 0, $yChar * ($yPos - $Pos))
    $yPos = $Pos
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    Return $GUI_RUNDEFMSG

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc ;==>WM_VSCROLL

    [/autoit]
  • Wollte das Thema nochmals ansprechen da ich eine Frage dazu habe.

    Der innere Bereich wird bei deinen Beispiel schön dargestellt.
    Aber warum ist der innere Bereich so groß?

    Wie kann ich die größe des inneren Bereiches anpassen? Der bleibt immer gleich :\

  • Grab den Thread mal aus. Denke da hat sich nicht viel getan.

    Nur eine kurze Frage. Wie bekomme ich den inneren Bereich auch dazu horizontal zu scrollen??

  • Hab ich und klappt auch bis auf einen Punkt.

    [autoit]

    _GUIScrollBars_Init($hChild,2500,2500)

    [/autoit]

    Der erste Wert besagt ja die größe der horizontalen Scrollbar und der zweite die Größe der vertikalen Scrollbar. Da ich einfach mal ein Bild rein gepackt hatte in Originalegröße (2465x1700) fiel mir auf, dass das horizontale Scrollen ohne Probs geht aber das vertikale nicht. Da scroll ich was runter und dann kommt dann einfach kein Bild mehr.
    Außerdem ist der Scrollbalken der vertikalen Bar extrem klein.

    Wie hängen die Werte eigentlich im Bezug zu Pixel zusammen. Da ich horizontal auf 2500 stellen muß damit ich 1700px scrollen kann.

    Mal das Beispiel das ich im Mom verwende:

    Spoiler anzeigen
    [autoit]


    #include <GUIConstantsEx.au3>
    #include <GuiScrollBars.au3>
    #include <ScrollBarConstants.au3>
    #include <StructureConstants.au3>
    #include <WindowsConstants.au3>
    $gui = GUICreate("Forum ", 633, 447, 190, 220)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    GUISetState(@SW_SHOW, $gui)

    [/autoit] [autoit][/autoit] [autoit]

    $hChild = GUICreate("Scrollbereich", 581, 263, 26, 88, $WS_POPUP, $WS_EX_MDICHILD, $gui)

    [/autoit] [autoit][/autoit] [autoit]

    GUISwitch($hChild)
    GUICtrlCreatePic(@ScriptDir & "\Karte.jpg", 0, 0, 2465, 1700)
    GUISetState(@SW_SHOW, $hChild)

    [/autoit] [autoit][/autoit] [autoit]

    GUIRegisterMsg($WM_SIZE, "WM_SIZE")
    GUIRegisterMsg($WM_VSCROLL, "WM_VSCROLL")
    GUIRegisterMsg($WM_HSCROLL, "WM_HSCROLL")

    [/autoit] [autoit][/autoit] [autoit]

    _GUIScrollBars_Init($hChild, 2500, 2500)

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    $msg = GUIGetMsg()

    [/autoit] [autoit][/autoit] [autoit]

    Switch $msg
    Case $GUI_EVENT_CLOSE
    Exit
    EndSwitch
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func WM_HSCROLL($hWnd, $msg, $wParam, $lParam)
    #forceref $Msg, $lParam
    Local $nScrollCode = BitAND($wParam, 0x0000FFFF)

    [/autoit] [autoit][/autoit] [autoit]

    Local $index = -1, $xChar, $xPos
    Local $Min, $Max, $Page, $Pos, $TrackPos

    [/autoit] [autoit][/autoit] [autoit]

    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

    [/autoit] [autoit][/autoit] [autoit]

    ; Ermittelt alle Informationen der horizontalen Scrollbar
    Local $tSCROLLINFO = _GUIScrollBars_GetScrollInfoEx($hWnd, $SB_HORZ)
    $Min = DllStructGetData($tSCROLLINFO, "nMin")
    $Max = DllStructGetData($tSCROLLINFO, "nMax")
    $Page = DllStructGetData($tSCROLLINFO, "nPage")
    $xPos = DllStructGetData($tSCROLLINFO, "nPos")
    $TrackPos = DllStructGetData($tSCROLLINFO, "nTrackPos")
    ; Speichert die x-Position für einen späteren Vergleich
    $Pos = $xPos
    #forceref $Min, $Max
    ; Auswertung der vom System gemeldeten Scroll-Nachricht
    Switch $nScrollCode
    Case $SB_LINELEFT ; Der Anwender klickte auf den linken Pfeil
    DllStructSetData($tSCROLLINFO, "nPos", $Pos - 1)

    [/autoit] [autoit][/autoit] [autoit]

    Case $SB_LINERIGHT ; Der Anwender klickte auf den rechten Pfeil
    DllStructSetData($tSCROLLINFO, "nPos", $Pos + 1)

    [/autoit] [autoit][/autoit] [autoit]

    Case $SB_PAGELEFT ; Der Anwender klickte links neben dem Scrollbalken
    DllStructSetData($tSCROLLINFO, "nPos", $Pos - $Page)

    [/autoit] [autoit][/autoit] [autoit]

    Case $SB_PAGERIGHT ; Der Anwender klickte rechts neben dem Scrollbalken
    DllStructSetData($tSCROLLINFO, "nPos", $Pos + $Page)

    [/autoit] [autoit][/autoit] [autoit]

    Case $SB_THUMBTRACK ; Der Anwender zog den Scrollbalken
    DllStructSetData($tSCROLLINFO, "nPos", $TrackPos)
    EndSwitch

    [/autoit] [autoit][/autoit] [autoit]

    ;~ // Setzt die neue Position und ermittelt sie danach erneut.
    ;~ // Abhängig von den Windows-Einstellungen kann es sein, dass die gelesenen Werte nicht die gleichen sind, wie die vorher gesetzten.

    [/autoit] [autoit][/autoit] [autoit]

    DllStructSetData($tSCROLLINFO, "fMask", $SIF_POS)
    _GUIScrollBars_SetScrollInfo($hWnd, $SB_HORZ, $tSCROLLINFO)
    _GUIScrollBars_GetScrollInfo($hWnd, $SB_HORZ, $tSCROLLINFO)
    ; // Falls sich die x-Position der Scrollbar geändert hat, den Fensterbereich verschieben und aktualisieren
    $Pos = DllStructGetData($tSCROLLINFO, "nPos")
    If ($Pos <> $xPos) Then _GUIScrollBars_ScrollWindow($hWnd, $xChar * ($xPos - $Pos), 0)
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_HSCROLL

    [/autoit] [autoit][/autoit] [autoit]

    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

    [/autoit] [autoit][/autoit] [autoit]

    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

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ; 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")

    [/autoit] [autoit][/autoit] [autoit]

    Switch $nScrollCode
    Case $SB_TOP ; user clicked the HOME keyboard key
    DllStructSetData($tSCROLLINFO, "nPos", $Min)

    [/autoit] [autoit][/autoit] [autoit]

    Case $SB_BOTTOM ; user clicked the END keyboard key
    DllStructSetData($tSCROLLINFO, "nPos", $Max)

    [/autoit] [autoit][/autoit] [autoit]

    Case $SB_LINEUP ; user clicked the top arrow
    DllStructSetData($tSCROLLINFO, "nPos", $Pos - 1)

    [/autoit] [autoit][/autoit] [autoit]

    Case $SB_LINEDOWN ; user clicked the bottom arrow
    DllStructSetData($tSCROLLINFO, "nPos", $Pos + 1)

    [/autoit] [autoit][/autoit] [autoit]

    Case $SB_PAGEUP ; user clicked the scroll bar shaft above the scroll box
    DllStructSetData($tSCROLLINFO, "nPos", $Pos - $Page)

    [/autoit] [autoit][/autoit] [autoit]

    Case $SB_PAGEDOWN ; user clicked the scroll bar shaft below the scroll box
    DllStructSetData($tSCROLLINFO, "nPos", $Pos + $Page)

    [/autoit] [autoit][/autoit] [autoit]

    Case $SB_THUMBTRACK ; user dragged the scroll box
    DllStructSetData($tSCROLLINFO, "nPos", $TrackPos)
    EndSwitch

    [/autoit] [autoit][/autoit] [autoit]

    ;~ // Set the position and then retrieve it. Due to adjustments
    ;~ // by Windows it may not be the same as the value set.

    [/autoit] [autoit][/autoit] [autoit]

    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")

    [/autoit] [autoit][/autoit] [autoit]

    If ($Pos <> $yPos) Then
    _GUIScrollBars_ScrollWindow($hWnd, 0, $yChar * ($yPos - $Pos))
    $yPos = $Pos
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    Return $GUI_RUNDEFMSG

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc ;==>WM_VSCROLL

    [/autoit] [autoit][/autoit] [autoit]

    Func WM_SIZE($hWnd, $msg, $wParam, $lParam)
    #forceref $Msg, $wParam
    Local $index = -1, $yChar, $xChar, $xClientMax, $xClient, $yClient, $ivMax
    For $x = 0 To UBound($aSB_WindowInfo) - 1
    If $aSB_WindowInfo[$x][0] = $hWnd Then
    $index = $x
    $xClientMax = $aSB_WindowInfo[$index][1]
    $xChar = $aSB_WindowInfo[$index][2]
    $yChar = $aSB_WindowInfo[$index][3]
    $ivMax = $aSB_WindowInfo[$index][7]
    ExitLoop
    EndIf
    Next
    If $index = -1 Then Return 0

    [/autoit] [autoit][/autoit] [autoit]

    Local $tSCROLLINFO = DllStructCreate($tagSCROLLINFO)

    [/autoit] [autoit][/autoit] [autoit]

    ; Ermittelt die Abmessungen der Arbeitsfläche.
    $xClient = BitAND($lParam, 0x0000FFFF)
    $yClient = BitShift($lParam, 16)
    $aSB_WindowInfo[$index][4] = $xClient
    $aSB_WindowInfo[$index][5] = $yClient

    [/autoit] [autoit][/autoit] [autoit]

    ; Setzt den vertikalen Scrollbereich und die Seitengröße
    DllStructSetData($tSCROLLINFO, "fMask", BitOR($SIF_RANGE, $SIF_PAGE))
    DllStructSetData($tSCROLLINFO, "nMin", 0)
    DllStructSetData($tSCROLLINFO, "nMax", $ivMax)
    DllStructSetData($tSCROLLINFO, "nPage", $yClient / $yChar)
    _GUIScrollBars_SetScrollInfo($hWnd, $SB_VERT, $tSCROLLINFO)

    [/autoit] [autoit][/autoit] [autoit]

    ; Setzt den horizontalen Scrollbereich und die Seitengröße
    DllStructSetData($tSCROLLINFO, "fMask", BitOR($SIF_RANGE, $SIF_PAGE))
    DllStructSetData($tSCROLLINFO, "nMin", 0)
    DllStructSetData($tSCROLLINFO, "nMax", 2 + $xClientMax / $xChar)
    DllStructSetData($tSCROLLINFO, "nPage", $xClient / $xChar)
    _GUIScrollBars_SetScrollInfo($hWnd, $SB_HORZ, $tSCROLLINFO)

    [/autoit] [autoit][/autoit] [autoit]

    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_SIZE

    [/autoit]