ListIconGadget: Scrollbar vorhanden ? und wie breit ?

Windowsspezifisches Forum , API ,..
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

ListIconGadget: Scrollbar vorhanden ? und wie breit ?

Beitrag 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 

Purebasic 5.70 x86 5.72 X 64 - Windows 10

Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Beitrag 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
Windows 10 Pro, 64-Bit / Outtakes | Derek
Andesdaf
Moderator
Beiträge: 2673
Registriert: 15.06.2008 18:22
Wohnort: Dresden

Beitrag von Andesdaf »

danke sowas habe ich mal gesucht.
Win11 x64 | PB 6.20
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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?
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Andesdaf
Moderator
Beiträge: 2673
Registriert: 15.06.2008 18:22
Wohnort: Dresden

Beitrag 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
Win11 x64 | PB 6.20
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Beitrag 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:
Windows 10 Pro, 64-Bit / Outtakes | Derek
Andesdaf
Moderator
Beiträge: 2673
Registriert: 15.06.2008 18:22
Wohnort: Dresden

Beitrag von Andesdaf »

Fluid Byte hat geschrieben:Außerdem, vertikale und horizontale Breite sind identisch. :wink:
Ist natürlich logisch.
Win11 x64 | PB 6.20
Antworten