Horizontalen Scrollbalken in Listbox anzeigen



  • Ich habe eine Listbox die ich so definiere:

    hwndLstBoxTest = CreateWindow(TEXT("listbox"), TEXT("Hallo"), WS_CHILD | WS_VISIBLE | WS_BORDER | WS_HSCROLL | WS_TABSTOP | WS_VSCROLL, 190, 20, 900, 300, hwnd, (HMENU) i, ((LPCREATESTRUCT) lParam)->hInstance, NULL);
    

    Anschliessend möchte ich etwas an diese Listbox senden:

    //in Listbox schreiben
    lbResult=SendMessage(hwndLstBoxTest,(UINT) LB_ADDSTRING,NULL,(LPARAM)wbuf);
    
    //Scrollbalken Aktivieren
    EnableScrollBar(hwndLstBoxTest,(UINT)SB_BOTH,(UINT)ESB_ENABLE_BOTH);
    
    //Falls Nötig Scrollbalken für Listbox berechnen und länge an scrollbalken übergeben
    lbScroll=SendMessage(hwndLstBoxTest,(UINT) LB_GETHORIZONTALEXTENT,NULL,NULL);
    SendMessage(hwndLstBoxTest, (UINT) LB_SETHORIZONTALEXTENT, lbScroll, NULL);
    

    Jetzt bekomme ich allerdings keinen horizontalen Scrollbalken auch wenn der Text den ich an die Listbox sende länger ist als die Listbox selbst.

    Einen Vertikalen Scrollbalken gibt es allerdings sobald genügend Elemente in der Listbox sind.

    Was mach ich falsch?


  • Mod

    1. EnableScrollBar hat keine Wirkung hier. Die Rollbalken werden iontern verwaltet.
    2. Du musst LB_SETHORIZONTALEXTENT mit einem korrekten Wer tsetzen. Ansonsten kommt eben kein Rollbalken. Alerdings interessiert sich diese Funktion nicht dafür, was in den Zeilen drin steht.
    Wenn Du das möchstest solltest Du einen List View nutzen.



  • zu 1. Ah ok danke...

    zu 2. Dachte mit LB_GETHORIZONTALTEXTENT bekomme ich den richtigen Wert um dann die länge mit LB_SETHORIZONTALEXTENT zu setzen. Die Funktion hat sich auch nicht zu interessieren was drin steht nur die Länge ist wichtig.


  • Mod

    Nein! Die Länge musst Du selbst errechnen und angeben!



  • Und womit mache ich das am besten?

    Die Länge eines Strings erhalte ich ja z.B. mit strlen. Dann hab ich die Länge in Zeichen.

    Wenn ich das dann an die Listbox schicke werde ich wahrscheindlich eine Angabe in Pixel brauchen oder?


  • Mod

    Das sind wirklich Basics!
    - DC erzeugem
    - Font holen selektieren
    - GetTextExtent durchführen
    - Font deselekttieren
    - Weite setzen



  • Vermillion schrieb:

    Und womit mache ich das am besten?

    Die Länge eines Strings erhalte ich ja z.B. mit strlen. Dann hab ich die Länge in Zeichen.

    Wenn ich das dann an die Listbox schicke werde ich wahrscheindlich eine Angabe in Pixel brauchen oder?

    Hallo,

    du musst eigentlich nur einen Wert einsetzen der größer ist als der mom. sichtbare View der Listbox. Meint die Listbox, dass sie den String aufgrund der neuangegebenen Maße nicht darstellen kann, erzeugt sie danach automatisch die VScroll, sofern sie mit diesem Style auch erzeugt worden ist!


  • Mod

    CStern schrieb:

    du musst eigentlich nur einen Wert einsetzen der größer ist als der mom. sichtbare View der Listbox. Meint die Listbox, dass sie den String aufgrund der neuangegebenen Maße nicht darstellen kann, erzeugt sie danach automatisch die VScroll, sofern sie mit diesem Style auch erzeugt worden ist!

    Sorry! So verhält sich ein List Control, aber keine ListBox!



  • Martin Richter schrieb:

    CStern schrieb:

    du musst eigentlich nur einen Wert einsetzen der größer ist als der mom. sichtbare View der Listbox. Meint die Listbox, dass sie den String aufgrund der neuangegebenen Maße nicht darstellen kann, erzeugt sie danach automatisch die VScroll, sofern sie mit diesem Style auch erzeugt worden ist!

    Sorry! So verhält sich ein List Control, aber keine ListBox!

    Hallo richtig lesen!
    Solange die Listbox kein Item darstellen muss zu der der mom. eingestellte View ausreicht, stellt sie auch kein VSCROLL dar.

    Es ist wünschenswert, dass man das Feature aber trotzdem zur Verfügung stellt, aus optischen Gründen, oder was auch immer.

    Deshalb stellt man unter:

    LB_SETHORIZONTALEXTENT

    einen Wert ein, der viel Größer als der momentan verfügbare Clientrect des View ist.

    Was zum Teufel hat das mit einer ListView zu tun? 🙄


  • Mod

    @CStern: Korrekt! Habe ich überlesen. Das Grundproblem des OP ging aber um den HScroll, deshalb war ich irritiert...



  • Ja geht um den HScroll nicht um den VScroll hab grad gesehn dass der Topic Titel falsch ist....

    Martin Richter schrieb:

    Das sind wirklich Basics!
    - DC erzeugem
    - Font holen selektieren
    - GetTextExtent durchführen
    - Font deselekttieren
    - Weite setzen

    Ist auch mein erster Versuch mit C eine Benutzeroberfläche hinzubekommen.

    Das was du schreibst wäre die Lösung für ein C++ Projekt. Ich versuchs aber mit C (falls das möglich ist)


  • Mod

    Mein Vorschlag hat gar nichts mit C++ zu tun sondern bezieht sich pur auf Windows API!



  • Dein Vorschlag klingt soweit auch ganz gut. Nur finde ich blos C++ Beispiele und in auf msdn nach etwas suchen von dem man selber nicht genau weiss wie es geht ist schwierig...

    Könntest du deinen Vorschlag mit Befehlen oder weiteren Anhaltspunkten wo ich suchen kann untermauern? 🙂


Anmelden zum Antworten