Seite 1 von 2

ListViewGadget in der Breite scrollen

Verfasst: 28.10.2006 19:35
von Werner
Hallo PureBasic-Gemeinde,

ich schaffe es nicht (trotz Suche im Forum) einen horizontalen Scrollbalken für das ListViewGadget zu erstellen.
Ich wäre euch dankbar, wenn ihr untenstehendes Beispiel dahingehend modifizieren könntet.

Code: Alles auswählen

If OpenWindow(0, 0, 0, 270, 240, "ListViewGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) And CreateGadgetList(WindowID(0))
    ListViewGadget(0, 10, 10, 250, 120)
    For a = 1 To 12
      AddGadgetItem (0, -1, "Item " + Str(a) + " of the Listview........................................END")   ; definieren des Listview-Inhalts
    Next
    SetGadgetState(0, 9)    ; wir setzen (beginnend bei 0) den zehnten Eintrag als aktiven
    Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
  EndIf

Verfasst: 28.10.2006 20:51
von jear
Nimm ein ListIconGadget

Code: Alles auswählen

If OpenWindow(0, 0, 0, 270, 240, "ListIconGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) And CreateGadgetList(WindowID(0)) 
  ListIconGadget(0, 10, 10, 250, 120,"Spalte 1",300) 
  For a = 1 To 12 
    AddGadgetItem(0, -1, "Item " + Str(a) + " of the ListIconGadget........................................END")   ; definieren des Listview-Inhalts 
  Next 
  SetGadgetState(0, 9)    ; wir setzen (beginnend bei 0) den zehnten Eintrag als aktiven 
  Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow 
EndIf[quote][/quote]

Re: ListViewGadget in der Breite scrollen

Verfasst: 28.10.2006 21:39
von Kiffi
> ich schaffe es nicht (trotz Suche im Forum) einen horizontalen
> Scrollbalken für das ListViewGadget zu erstellen.

Code: Alles auswählen

#LB_SETHORIZONTAL = $194

Breite = 400

If OpenWindow(0, 0, 0, 270, 240, "ListViewGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) And CreateGadgetList(WindowID(0))
  ListViewGadget(0, 10, 10, 250, 120)
  For a = 1 To 12
    AddGadgetItem (0, -1, "Item " + Str(a) + " of the Listview........................................END")   ; definieren des Listview-Inhalts
  Next
  SetGadgetState(0, 9)    ; wir setzen (beginnend bei 0) den zehnten Eintrag als aktiven
  
  SendMessage_(GadgetID(0), #LB_SETHORIZONTAL, Breite, #Null)
  
  Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf 
man kann auch bestimmt irgendwie herausfinden, wie lang der längste
Eintrag der Listviews in Pixeln ist, um dann die korrekte Breite zu setzten.

Grüße ... Kiffi

Verfasst: 28.10.2006 21:55
von ts-soft
@Werner
Nimm Linux, dann gehts ohne Änderung :mrgreen:

ListViewGadget in der Breite scrollen

Verfasst: 28.10.2006 22:32
von Werner
Danke für eure Beiträge,
es funktioniert!
:-)

Grüße
Werner

PS:
@ts-soft
Ich habe auch immer ein schlechtes Gewissen, dass ich mit Windows arbeite.

Verfasst: 26.09.2007 20:19
von Kurzer
Hallo, habe gerade selbiges Problem und Kiffis Vorschlag über die API funktioniert gut.

Code: Alles auswählen

SendMessage_(GadgetID(0), #LB_SETHORIZONTAL, Breite, #Null)
  
Jetzt will ich mir aber auch die Breite eines ListView-Eintrags über API besorgen, um die obige Message mit einer passenden Breite füllen zu können.

Ich vermute, daß dies hier das richtige ist (aus der Win32 help):

Code: Alles auswählen

The ListView_GetColumnWidth macro retrieves the width of a column in report or list view. You can use this macro or explicitly send the LVM_GETCOLUMNWIDTH message.

int ListView_GetColumnWidth(
    HWND hwnd, 	
    int iCol	
   );	
 
Parameters
hwnd - Handle to the list view control.
iCol - Index of the column. This parameter is ignored in list view.

Return Values
Returns the column width if successful or zero otherwise.
Ich verstehe nur nicht ganz wie ich die Abfrage des Rückgabewertes über SendMessage_ realisieren kann.
Könnte mir da jemand unter die frisch deodorierten Arme greifen? :)

Markus

Edit: Ich steige jetzt um auf ein ListIconGadget. Das kann man ja optisch wie ein ListView aussehen lassen (ohne Spaltenköpfe) ohne mit deren Einschränkungen leben zu müssen.

Verfasst: 27.09.2007 06:49
von mk-soft
Zur erinnerung.

PB Listview -> Windows Listbox
PB Listicon -> Windoes Listview

Geht wohl nur mit PB ListIcon

Code: Alles auswählen

Procedure Listview_GetColumnwidth(Gadget, Column); Result = Pixel

  Protected result
  
  result = SendMessage_(GadgetID(Gadget), #LVM_GETCOLUMNWIDTH, Column, 0)
  
  ProcedureReturn result
  
EndProcedure
Beispiel für PB Listview mit horizontalen Balken.

Code: Alles auswählen



;- Konstanten
Enumeration ; Window ID
  #Window
EndEnumeration

Enumeration ; Menu ID
  #Menu
EndEnumeration

Enumeration ; MenuItem ID
  #Menu_Exit
EndEnumeration

Enumeration ; Statusbar ID
  #Statusbar
EndEnumeration

Enumeration ; Gadget ID
  #Listview
EndEnumeration

; ***************************************************************************************

Procedure UpdateWindow()

;{ Procedure für Grössenänderung
; Je nach Einstellung des Destop kann die Höhe von den Menu, Toolbar und Statusleise variieren.
; Somit ist die Arbeitshöhe für das StringGadget nicht nur abhängig von der Fensterhöhe,
; sondern auch von der Desktop Einstellung und muss daher berechnet werden.
; Edithöhe = Fensterhöhe - Menuhöhe - Toolbarhöhe - Statusbarhöhe
;}
  
  Protected mn, tb, sb, dx, dy
  
  mn = MenuHeight()
  tb = 0; ToolBarHeight(#Toolbar)
  sb = StatusBarHeight(StatusBar)
  dx = WindowWidth(#Window)
  dy = WindowHeight(#Window) - mn - tb - sb
  ResizeGadget(#Listview, 0, tb, dx, dy)
    
EndProcedure

; ***************************************************************************************

Procedure Listview_SetTabstops(Gadget, a=0, b=0, c=0, d=0, e=0, f=0, g=0, h=0, i=0, j=0, k=0); Result = BOOL

  Protected result, count, pos, *para.long
  Dim list.l(10)
  
  *para = @a
  count = 0
  pos   = 0
  While *para\l > 0 And count < 11
    pos + *para\l * 4
    list(count) = pos 
    *para + 4
    count + 1
  Wend
  
  result = SendMessage_(GadgetID(Gadget), #LB_SETTABSTOPS, count, @list(0))
  
  ProcedureReturn result
  
EndProcedure
  
; ***************************************************************************************

Procedure Listview_SetHorizontalextent(Gadget, Count); Result = VOID

  Protected result, width
  
  width = Count * 4
  SendMessage_(GadgetID(Gadget), #LB_SETHORIZONTALEXTENT, width, 0)
  
EndProcedure

; ***************************************************************************************

Procedure Listview_GetColumnwidth(Gadget, Column); Result = Pixel

  Protected result
  
  result = SendMessage_(GadgetID(Gadget), #LVM_GETCOLUMNWIDTH, Column, 0)
  
  ProcedureReturn result
  
EndProcedure

; ***************************************************************************************

;- Globale Variablen
Global exit = 0

;- Fenster
style = #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget
If OpenWindow(#Window, #PB_Ignore, #PB_Ignore, 400, 300, "Fenster", style)
  ; Menu
  If CreateMenu(#Menu, WindowID(#Window))
    MenuTitle("&Datei")
      MenuItem(#Menu_Exit, "Be&enden")
  EndIf
  ; Statusbar
  CreateStatusBar(#Statusbar, WindowID(#Window))
  ; Gadgets
  If CreateGadgetList(WindowID(#Window))
    ListViewGadget(#Listview, 0,0,0,0, #LBS_USETABSTOPS | #WS_HSCROLL	| #WS_VSCROLL	)
  EndIf
  
  ; Tabstops setzen
  Listview_SetTabstops(#Listview, 4, 20, 20, 10, 10)
  item.s = "100" + #TAB$ + "Hallo"  + #TAB$ + "Welt" + #TAB$ + ";)" + #TAB$ + "101"
  AddGadgetItem(#Listview, -1, item)
  ; Horizontale breite
  Listview_SetHorizontalextent(#Listview, 200)
  
  ;-- Hauptschleife
  Repeat
    event   = WaitWindowEvent()
    window  = EventWindow()
    menu    = EventMenu()
    type    = EventType()
    Select event
      Case #PB_Event_Menu                       ; ein Menü wurde ausgewählt
        Select menu
          Case #Menu_Exit
            Exit = 1
        EndSelect
      Case #PB_Event_Gadget                     ; ein Gadget wurde gedrückt
      Case #PB_Event_CloseWindow                ; das Schließgadget vom Fenster wurde gedrückt
        Exit = 1
      Case #PB_Event_Repaint                    ; der Fensterinhalt wurde zerstört und muss neu gezeichnet werden (nützlich für 2D Grafik-Operationen) 
      Case #PB_Event_SizeWindow                 ; das Fenster wurde in der Größe verändert
        UpdateWindow()
      Case #PB_Event_MoveWindow                 ; das Fenster wurde verschoben
      Case #PB_Event_ActivateWindow             ; das Fenster wurde aktiviert (hat den Fokus erhalten)
      Case #PB_Event_SysTray                    ; das SysTray wurde aktiviert
    
    EndSelect
    
  Until Exit
EndIf
FF :wink:

Verfasst: 27.09.2007 09:36
von Shardik
@mk-soft,

Danke schön für das schöne Beispiel. Leider funktioniert LVM_GETCOLUMNWIDTH nur mit ListIcon-Gadgets und nicht mit ListView-Gadgets aka ListBoxes. Es geht aber viel einfacher mit PureBASIC-Mitteln:
GadgetWidth(#ListView) liefert die aktuelle Breite des ListView-Gadgets.

@Kurzer,

hier ein Code-Beispiel, um einen Scroll-Balken ein- und auszuschalten und die tatsächliche Breite und die Breite innerhalb des Scroll-Bereichs eines ListView-Gadgets zu ermitteln:

Code: Alles auswählen

EnableExplicit

#ListViewScrollableWidth = 300
#WindowHeight = 160
#WindowWidth = 210

Enumeration 
  #ListView
  #Button
EndEnumeration

Define HorizontalScrollbarEnabled.L
Define i.L
Define ListViewWidth.L
Define WindowEvent.L

If OpenWindow(0, 0, 0, #WindowWidth, #WindowHeight, "ListView mit Scrollbalken", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) And CreateGadgetList(WindowID(0))
  ListViewGadget(#ListView, 10, 10, #WindowWidth - 20, #WindowHeight - 50, #WS_HSCROLL)
  ButtonGadget(#Button, 10, #WindowHeight - 30, #WindowWidth - 20, 20, "Horizontalen Scrollbalken einblenden")

  For i = 1 To 12
    AddGadgetItem (0, -1, "Eintrag " + Str(i) + " des Listview")   ; definieren des Listview-Inhalts
  Next

  Repeat
    WindowEvent = WaitWindowEvent()

    If WindowEvent = #PB_Event_Gadget
      If EventGadget() = #Button
        If HorizontalScrollbarEnabled
          SendMessage_(GadgetID(#ListView), #LB_SETHORIZONTALEXTENT, ListViewWidth, 0)
          SetGadgetText(#Button, "Horizontalen Scrollbalken einblenden")
          HorizontalScrollbarEnabled = #False
        Else
          SendMessage_(GadgetID(#ListView), #LB_SETHORIZONTALEXTENT, #ListViewScrollableWidth, 0)
          SetGadgetText(#Button, "Horizontalen Scrollbalken ausblenden")
          HorizontalScrollbarEnabled = #True
          Debug "ListView-Breite = " + Str(GadgetWidth(#ListView))
          Debug "ListView-Breite innerhalb des Scrollbalkens = " + Str(SendMessage_(GadgetID(0), #LB_GETHORIZONTALEXTENT, 0, 0))
        EndIf
      EndIf
    EndIf
  Until WindowEvent = #PB_Event_CloseWindow
EndIf
Und hier ein Beispiel, um die Breite des ListView-Gadgets an die Breite eines Eintrags anzupassen:

Code: Alles auswählen

EnableExplicit

#ListViewWidth = 300
#WindowHeight = 160
#WindowWidth = 210

Enumeration 
  #ListView
  #Button
EndEnumeration

Define EntryWidth.L
Define FontID.L
Define WindowEvent.L

If OpenWindow(0, 0, 0, #WindowWidth, #WindowHeight, "ListView", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) And CreateGadgetList(WindowID(0))
  ListViewGadget(#ListView, 10, 10, #WindowWidth - 20, #WindowHeight - 50)
  ButtonGadget(#Button, 10, #WindowHeight - 30, #WindowWidth - 20, 20, "ListView-Breite an Eintrag anpassen")

  AddGadgetItem (0, -1, "Test-Eintrag im Listview")

  If StartDrawing(WindowOutput(0)) 
    FontID = GetGadgetFont(0) 
    DrawingFont(FontID) 
    EntryWidth = TextWidth(GetGadgetItemText(#ListView, 0, 0)) + 10
    StopDrawing()
  EndIf

  Repeat
    WindowEvent = WaitWindowEvent()

    If WindowEvent = #PB_Event_Gadget
      If EventGadget() = #Button
        ResizeGadget(#ListView, 10, 10, EntryWidth, #WindowHeight - 50)
        DisableGadget(#Button, #True)
      EndIf
    EndIf
  Until WindowEvent = #PB_Event_CloseWindow
EndIf

Verfasst: 27.09.2007 11:23
von Kurzer
MK-Soft und Shardik,
vielen Dank für Eure Beispiele und die Mühe, die ihr Euch gemacht habt. :allright:

Code: Alles auswählen

result = SendMessage_(GadgetID(Gadget), #LVM_GETCOLUMNWIDTH, Column, 0) 
Daß man den Rückgabewert so zurückbekommt (Result = SendMessage...) dachte ich mir gestern Abend auch, aber ich habe immer nur 0 zurückbekommen. Das lag aber wohl daran, daß das ListView (Windows Listbox, wie ich jetzt gelernt habe :) ) diese Message nicht unterstützt.

Shardik, Dein letztes Beispiel (Anpassung der Breite des ListViews an den Inhalt) funktioniert gut, ist aber nicht das was ich genau meinte. Der Rahmen des Listviews sollte gleich bleiben, es sollte nur ein hor. Scrollbalken hinzukommen, wenn ein Eintrag über die Grenzen des ListViews hinausgeht und der innere Scrollbereich an dessen Breite angepasst werden.

Das scheint aber wirklich nur mit dem ListICON zu funktionieren.

Macht nix, ich habe meinen Code gestern auf ListIcon umgestellt, evtl. nutze ich später ja auch noch das Icon-feature dieses Gadgets.

Markus

Edit:
Zur erinnerung.
PB Listview -> Windows Listbox
PB Listicon -> Windoes Listview
Wieso eigentlich diese Bezeichnungs"verwirrung" in PB?

Verfasst: 27.09.2007 12:21
von Shardik
Kurzer hat geschrieben: Shardik, Dein letztes Beispiel (Anpassung der Breite des ListViews an den Inhalt) funktioniert gut, ist aber nicht das was ich genau meinte. Der Rahmen des Listviews sollte gleich bleiben, es sollte nur ein hor. Scrollbalken hinzukommen, wenn ein Eintrag über die Grenzen des ListViews hinausgeht und der innere Scrollbereich an dessen Breite angepasst werden.
Etwa so?

Code: Alles auswählen

EnableExplicit

#WindowHeight = 100
#WindowWidth = 210

Enumeration 
  #ListView
  #Button
EndEnumeration

Procedure GetTextWidth(Text.S)
  Protected FontID.L
  Protected TextWidth.L

  If StartDrawing(WindowOutput(0)) 
    FontID = GetGadgetFont(0) 
    DrawingFont(FontID) 
    TextWidth = TextWidth(Text) + 10
    StopDrawing()
  EndIf
  
  ProcedureReturn TextWidth
EndProcedure

Define EntryText.S
Define TextWidth.L
Define WindowEvent.L

If OpenWindow(0, 0, 0, #WindowWidth, #WindowHeight, "ListView", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) And CreateGadgetList(WindowID(0))
  ListViewGadget(#ListView, 10, 10, #WindowWidth - 20, #WindowHeight - 50, #WS_HSCROLL)
  ButtonGadget(#Button, 10, #WindowHeight - 30, #WindowWidth - 20, 20, "Langen Eintrag hinzufügen")

  AddGadgetItem (0, -1, "Kurzer Eintrag")

  Repeat
    WindowEvent = WaitWindowEvent()

    If WindowEvent = #PB_Event_Gadget
      If EventGadget() = #Button
        EntryText = "Dieser Eintrag paßt leider nicht komplett hinein..."
        AddGadgetItem(#ListView, -1, EntryText)
        DisableGadget(#Button, #True)
        TextWidth = GetTextWidth(EntryText)

        If TextWidth > GadgetWidth(#ListView)
          SendMessage_(GadgetID(#ListView), #LB_SETHORIZONTALEXTENT, TextWidth, 0)
        EndIf
      EndIf
    EndIf
  Until WindowEvent = #PB_Event_CloseWindow
EndIf
Wenn ja, dann hättest Du Dir das aber auch aus meinen beiden vorherigen Beispielen selbst zusammenstellen können :wink: