Listview - Scrollen ohne Scrollbalken

  • Hey,

    ich möchte ein Listview erstellen ohne Scrollbalken, allerdings soll trotzdem gescrollt werden können um alle Items sichtbar zu machen.

    Hier ein Bsp. zum Spielen:

    Spoiler anzeigen
    [autoit]


    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <ListViewConstants.au3>
    #include <WindowsConstants.au3>

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

    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Form1", 633, 447, 193, 125)
    $ListView1 = GUICtrlCreateListView("Hallo|1", 56, 40, 433, 225,$LVS_NOSCROLL,BitOR($LVS_EX_FULLROWSELECT, $LVS_EX_DOUBLEBUFFER))
    $ListView2 = GUICtrlCreateListView("Hallo|2", 56, 40, 433, 225,$LVS_NOSCROLL,BitOR($LVS_EX_FULLROWSELECT, $LVS_EX_DOUBLEBUFFER))
    GUICtrlSetState(-1,$GUI_HIDE)
    $Button1 = GUICtrlCreateButton("Button1", 64, 288, 129, 49, 0)
    $Button2 = GUICtrlCreateButton("Button2", 264, 288, 185, 49, 0)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###
    for $i = 0 to 20
    GUICtrlCreateListViewItem("test|" & $i,$ListView1)
    next
    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    case $Button1
    GUICtrlSetState($ListView1, $GUI_HIDE)
    GUICtrlSetState($ListView2, $GUI_Show)
    GUICtrlCreateListViewItem("test|test",$ListView1)
    case $Button2
    GUICtrlSetState($ListView2, $GUI_HIDE)
    GUICtrlSetState($ListView1, $GUI_Show)
    GUICtrlCreateListViewItem("test|test",$ListView2)
    EndSwitch
    WEnd

    [/autoit]

    Einmal editiert, zuletzt von nuts (31. Dezember 2009 um 01:36)

  • Mit den Pfeiltasten. Wird ein Musikplayer, der mit Fernbedienung gesteuert werden kann.
    Dann hab ich ein Listview mit "coolem" Hintergrundbild und die "blöden" Scrollbalken nebendran. :rolleyes:

    edit \ Rausschieben aus der GUI ist mir bekannt.
    Ist optisch nicht so schön und etwas tricky aufgrund unterschiedlicher Auflösungen (wird eine Fullscreen-Anwendung).

    Einmal editiert, zuletzt von nuts (31. Dezember 2009 um 01:22)

    • Offizieller Beitrag

    Das einzige was mir dazu einfällt, ist die Lieviews in eine Child GUI zu packen. Diese einfach 17 Pixel Schmäler als das Listview machen und es paßt.

    Spoiler anzeigen
    [autoit]

    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <ListViewConstants.au3>
    #include <WindowsConstants.au3>

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

    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Form1", 633, 447, 193, 125)
    $Button1 = GUICtrlCreateButton("Button1", 64, 288, 129, 49, 0)
    $Button2 = GUICtrlCreateButton("Button2", 264, 288, 185, 49, 0)
    GUISetState(@SW_SHOW,$Form1)
    $Form2 = GUICreate("",416, 225,56, 40,BitOR($WS_CHILD, $WS_TABSTOP), -1, $Form1)
    $ListView1 = GUICtrlCreateListView("Hallo|1", 1,1, 433, 225,Default,BitOR($LVS_EX_FULLROWSELECT, $LVS_EX_DOUBLEBUFFER))
    $ListView2 = GUICtrlCreateListView("Hallo|2", 1,1, 433, 225,Default,BitOR($LVS_EX_FULLROWSELECT, $LVS_EX_DOUBLEBUFFER))
    GUICtrlSetState(-1,$GUI_HIDE)
    GUISetState(@SW_SHOW,$Form2)
    GUISwitch($Form1)
    #EndRegion ### END Koda GUI section ###
    for $i = 0 to 20
    GUICtrlCreateListViewItem("test|" & $i,$ListView1)
    next
    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    case $Button1
    GUICtrlSetState($ListView1, $GUI_HIDE)
    GUICtrlSetState($ListView2, $GUI_Show)
    GUICtrlCreateListViewItem("test|test",$ListView1)
    case $Button2
    GUICtrlSetState($ListView2, $GUI_HIDE)
    GUICtrlSetState($ListView1, $GUI_Show)
    GUICtrlCreateListViewItem("test|test",$ListView2)
    EndSwitch
    WEnd

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

    Wenn du die GUI auch noch Resizen willst, dann wird es eine heidenarbeit, Das Listview kann man mit GUICtrlSetResizing auf die Childgui festnageln. Die CHildGUI müßte aber nit de ParentGui mitwachsen.

  • Danke.
    Aufs Resize kann vermutlich verzichtet werden, da die GUI immer mit der max. Auflösung starten soll.

    Najo immerhin ne Lösung, was anderes ist mir auch nicht gelungen. Theoretisch müsste man doch das erste sichtbare Items setzen können? (nur wie? :D) Und dann die Scrollbefehle abfangen und reagieren. ?(

    • Offizieller Beitrag

    Ich hatte mal eine andere Lösung, finde nur das Skript nicht. Hier der Weg:
    (Dir geht es ja nur dadrum, die Scrollleiste nicht zu sehen)
    - neben dem LV ein Label erstellen
    - gleiche Höhe wie LV, Breite: Scrollbar +2px (über Systemmetrics abfragbar)
    - die Scrollleiste überlappend positionieren

  • Das ist das Problem :D
    Ok ich meinte es so: Man müsste definieren wo der Sichtbereich anfängt.
    Muss ja nicht zwingend das erste Item sein (laut diverser Quellen im Netz ?( ).
    Hier schaut mal: http://www.codeproject.com/KB/wtl/CustomListCtrl.aspx
    Verstehe es nur (noch?) nicht.
    Der Aufwand um auf Key UP/DOWN zu reagieren wäre vertretbar, da die Inputs sowieso alle über ein Eventghost-Plugin (WM_Command Message) ans Programm geschickt werden.

    • Offizieller Beitrag

    Hier hast du alle:

    Const COLOR_SCROLLBAR = 0 'The Scrollbar colour
    Const COLOR_BACKGROUND = 1 'Colour of the background with no wallpaper
    Const COLOR_ACTIVECAPTION = 2 'Caption of Active Window
    Const COLOR_INACTIVECAPTION = 3 'Caption of Inactive window
    Const COLOR_MENU = 4 'Menu
    Const COLOR_WINDOW = 5 'Windows background
    Const COLOR_WINDOWFRAME = 6 'Window frame
    Const COLOR_MENUTEXT = 7 'Window Text
    Const COLOR_WINDOWTEXT = 8 '3D dark shadow (Win95)
    Const COLOR_CAPTIONTEXT = 9 'Text in window caption
    Const COLOR_ACTIVEBORDER = 10 'Border of active window
    Const COLOR_INACTIVEBORDER = 11 'Border of inactive window
    Const COLOR_APPWORKSPACE = 12 'Background of MDI desktop
    Const COLOR_HIGHLIGHT = 13 'Selected item background
    Const COLOR_HIGHLIGHTTEXT = 14 'Selected menu item
    Const COLOR_BTNFACE = 15 'Button
    Const COLOR_BTNSHADOW = 16 '3D shading of button
    Const COLOR_GRAYTEXT = 17 'Grey text, of zero if dithering is used.
    Const COLOR_BTNTEXT = 18 'Button text
    Const COLOR_INACTIVECAPTIONTEXT = 19 'Text of inactive window
    Const COLOR_BTNHIGHLIGHT = 20 '3D highlight of button
    Const COLOR_2NDACTIVECAPTION = 27 'Win98 only: 2nd active window color
    Const COLOR_2NDINACTIVECAPTION = 28 'Win98 only: 2nd inactive window color

  • Mhm für:
    Const COLOR_HIGHLIGHT = 13 'Selected item background
    Const COLOR_HIGHLIGHTTEXT = 14 'Selected menu item
    funktionierts.

    Für:
    COLOR_SCROLLBAR = 0 'The Scrollbar colour
    nicht.

    Spoiler anzeigen
    [autoit]


    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <ListViewConstants.au3>
    #include <WindowsConstants.au3>
    #include <Misc.au3>
    #include <GuiListView.au3>

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

    global $dll = DllOpen("user32.dll")
    $style1 = Bitor($LVS_REPORT, $LVS_SINGLESEL, $LVS_SHOWSELALWAYS)
    $style2 = Bitor($LVS_REPORT, $LVS_SINGLESEL, $LVS_SHOWSELALWAYS,$LVS_NOSCROLL)

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

    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Form1", 633, 447, 193, 125)
    $ListView1 = GUICtrlCreateListView("Hallo|1", 120, 40, 433, 225, $style1)
    $hListView1= GUICtrlGetHandle($ListView1)
    $ListView2 = GUICtrlCreateListView("Hallo|2", 56, 40, 433, 225,$LVS_NOSCROLL,BitOR($LVS_EX_FULLROWSELECT, $LVS_EX_DOUBLEBUFFER))
    GUICtrlSetState(-1,$GUI_HIDE)
    $Button1 = GUICtrlCreateButton("Button1", 64, 288, 129, 49, 0)
    $Button2 = GUICtrlCreateButton("Button2", 264, 288, 185, 49, 0)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    Global $style = $COLOR_HIGHLIGHT
    Global $style2 = $COLOR_HIGHLIGHTTEXT
    Global $style3 = $COLOR_SCROLLBAR
    Global $aElem[3] = [$style, $style2, $style3]
    Global $aColor[3] = [0xD9D1CC, 0x000000,0xD9D1CC]
    Global $aBevore[3] = [_WinAPI_GetSysColor($style1),_WinAPI_GetSysColor($style2), _WinAPI_GetSysColor($style3)]
    _WinAPI_SetSysColors($aElem, $aColor)
    for $i = 0 to 20
    GUICtrlCreateListViewItem("test|" & $i,$ListView1)
    next
    While 1
    $nMsg = GUIGetMsg()
    If _IsPressed("28", $dll) Then
    _Setstyle()
    EndIf
    If _IsPressed("26", $dll) Then
    _Setstyle()
    EndIf
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    DllClose($dll)
    _WinAPI_SetSysColors($aElem, $aBevore)
    Exit
    case $Button1
    GUICtrlSetState($ListView1, $GUI_HIDE)
    GUICtrlSetState($ListView2, $GUI_Show)
    GUICtrlCreateListViewItem("test|test",$ListView1)
    case $Button2
    GUICtrlSetState($ListView2, $GUI_HIDE)
    GUICtrlSetState($ListView1, $GUI_Show)
    GUICtrlCreateListViewItem("test|test",$ListView2)
    EndSwitch
    WEnd

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

    Func _Setstyle()
    ;ConsoleWrite("lala" &@CRLF)
    ;_GUICtrlListView_EnsureVisible($hListView1,_GUICtrlListView_GetSelectedIndices($hListView1))
    endfunc

    [/autoit]

    Bekomme solangsam selbstzweifel ;(


  • COLOR_SCROLLBAR = 0 'The Scrollbar colour


    geht nur, wenn die Scrollbar im Klassik-Style ist. Sonst werden die Bilder aus dem Theme verwendet.

  • Hm logisch :thumbup:

    Damit lässt sich aber vielleicht auch arbeiten. Kann man die geladenen Bilder umbiegen? Oder müsste das ganze Theme fürs Prog. geändert werden?
    Hab mir mal die _GUICtrlListView_Create angsehen und dafür keinen Anhaltspunkt gefunden? Sind also Windows-interne Vorgänge?

    Einmal editiert, zuletzt von nuts (4. Januar 2010 um 15:34)