Seite 1 von 1

ListIconGadget: Scrollbar vorhanden ? und wie breit ?

Verfasst: 12.01.2009 00:14
von hjbremer
Wer schon immer mal wissen wollte ob das ListIcongadget eine Scrollbar hat oder nicht und noch wissen will wie breit diese ist kann dies mit ScrollBarInfo ermitteln.

Der Sinn: z.B. Hat man zuerst 10 Einträge gibt es noch keine Scrollbar. Werden es mehr taucht die Scrollbar auf und die letzte Spalte wird etwas verdeckt. Wer das Abfragen will, hier der Code mit Demo dafür.

Sollte eigentlich auch mit anderen Gadgets, die eine Scrollbar haben funktionieren, habs aber nicht getestet.

Wenn eine Scrollbar vorhanden ist, steht dies in sbi\rgstate[0] und die Breite steht in sbi\dxyLineButton. Wenn keine vorhanden ist, steht da meist irgendein Mist. weitere Infos siehe MSDN

Code: Alles auswählen

;nicht in PB 4.2 definiert
#OBJID_HSCROLL = $FFFFFFFA
#OBJID_VSCROLL = $FFFFFFFB
Structure SCROLLBARINFO 
  cbSize.i 
  rcScrollBar.RECT 
  dxyLineButton.i 
  xyThumbTop.i 
  xyThumbBottom.i 
  reserved.i 
  rgstate.i[6] 
EndStructure

Procedure   getScrollBarV(idnr)

;ermittelt ob ScrollBar vorhanden und die Breite
        
  sbi.SCROLLBARINFO
  sbi\cbSize = SizeOf(SCROLLBARINFO)
  GetScrollBarInfo_(idnr,#OBJID_VSCROLL,sbi)
  
  If sbi\rgstate[0]
    scrollbar = 0
    scrollbar_br = 0
  Else
    scrollbar = 1
    scrollbar_br = sbi\dxyLineButton  ;wenn > null = Höhe des Schiebereglers
  EndIf
ProcedureReturn scrollbar_br
EndProcedure

Procedure   getScrollBarH(idnr)

;ermittelt ob ScrollBar vorhanden und die Breite
        
  sbi.SCROLLBARINFO
  sbi\cbSize = SizeOf(SCROLLBARINFO)
  GetScrollBarInfo_(idnr,#OBJID_HSCROLL,sbi)

  If sbi\rgstate[0]
    scrollbar = 0
    scrollbar_br = 0
  Else
    scrollbar = 1
    scrollbar_br = sbi\dxyLineButton  ;wenn > null = Höhe des Schiebereglers
  EndIf

ProcedureReturn scrollbar_br
EndProcedure

;==============================

Enumeration
 #win1
 #but1
 #but2
 #but3
 #lvg1
EndEnumeration

hwnd = OpenWindow(#win1,0,0,640,480,"ListIcon Gadget",#PB_Window_SystemMenu|1) 
       CreateGadgetList(hwnd) 

       ButtonGadget(#but1,10,420,80,25,"Start")
       ButtonGadget(#but2,110,420,80,25,"mehr Zeilen")
       ButtonGadget(#but3,210,420,80,25,"mehr Spalten")
       
       idnr = ListIconGadget(#lvg1,10,12,300,400,"",0,#PB_ListIcon_GridLines) 
               AddGadgetColumn(#lvg1,0,"Spalte 0",150) 
               AddGadgetColumn(#lvg1,1,"Spalte 1",55) 
               ;AddGadgetColumn(#lvg1,2,"Spalte 2",155) 

       For i = 1 To 20 
          nr$ = LSet(Str(i),3," ") 
          txt$ = "Text in Zeile "+nr$+" in Spalte 1"+#LF$+"Spalte 2"+#LF$+"Spalte 3"
          AddGadgetItem(#lvg1, -1, txt$) 
       Next 

;=====================================================

Repeat

  event = WaitWindowEvent() 
  
  If Event = #PB_Event_Gadget Or Event = #PB_Event_Menu 
          
      welcherButton = EventGadget()  
      
      Select welcherButton
            Case #but1: 
                        Debug "=Vert============================"
                        Debug getScrollBarV(idnr)
                        Debug "=Horz============================"
                        Debug getScrollBarH(idnr)

            Case #but2: For i = 1 To 50 
                          nr$ = LSet(Str(i),3," ") 
                          txt$ = "Text in Zeile "+nr$+" in Spalte 1"+#LF$+"Spalte 2"+#LF$+"Spalte 3"
                          AddGadgetItem(#lvg1, -1, txt$) 
                        Next 

            Case #but3: AddGadgetColumn(#lvg1,2,"Spalte",155) 

      EndSelect
      
  EndIf

Until event = #PB_Event_CloseWindow 
End 


Verfasst: 12.01.2009 17:29
von Fluid Byte
Das geht auch etwas einfacher ... <)

Code: Alles auswählen

Debug GetSystemMetrics_(#SM_CXVSCROLL)
Debug GetWindowLong_(GadgetID(#lvg1),#GWL_STYLE) & #WS_HSCROLL
Debug GetWindowLong_(GadgetID(#lvg1),#GWL_STYLE) & #WS_VSCROLL

Verfasst: 03.03.2009 18:44
von Andesdaf
danke sowas habe ich mal gesucht.

Verfasst: 03.03.2009 19:09
von Kaeru Gaman
Fluid Byte hat geschrieben:Das geht auch etwas einfacher ... <)

Code: Alles auswählen

Debug GetSystemMetrics_(#SM_CXVSCROLL)
Debug GetWindowLong_(GadgetID(#lvg1),#GWL_STYLE) & #WS_HSCROLL
Debug GetWindowLong_(GadgetID(#lvg1),#GWL_STYLE) & #WS_VSCROLL
öhm... was davon ist die breite eines ggf. vorhandenen scrollbars?

Verfasst: 03.03.2009 19:16
von Andesdaf
bei Fluids Code fehlt noch ein

Code: Alles auswählen

Debug GetSystemMetrics_(#SM_CXHSCROLL)
für die Breite der horizontalen Scrollbar. #SM_CXVSCROLL ist für vertikale
Scrollbalken

Verfasst: 03.03.2009 19:35
von Fluid Byte
Kaeru Gaman hat geschrieben:öhm... was davon ist die breite eines ggf. vorhandenen scrollbars?
Did erste.
bei Fluids Code fehlt noch ein
Das ist eine 1:1 Umsetzung von hjbremer's Code also fehlt gar nichts. <)

Außerdem, vertikale und horizontale Breite sind identisch. :wink:

Verfasst: 20.03.2009 19:26
von Andesdaf
Fluid Byte hat geschrieben:Außerdem, vertikale und horizontale Breite sind identisch. :wink:
Ist natürlich logisch.