Erweiterte Items [X]

Windowsspezifisches Forum , API ,..
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
Benutzeravatar
Morty
Beiträge: 268
Registriert: 22.10.2004 07:20
Wohnort: Erfurt
Kontaktdaten:

Beitrag von Morty »

Moin.

Ich würde es ganz einfach über Images lösen. Jedes Item ist ein Image, was vorher im Hintergrund generiert wird. Da kann man auch gerne gleich zwei machen (für den Klick/Auswahl Effekt). Diese Images kommen auf Imagegadgets in ein ScrollAreaGadget(). Fertig.
Geht super, weil ja auch Imagegadgets die Events von PureBasic empfangen. Und über einfache Routinen bekommt man zur Not aus raus, auf welchen Pixel in der Grafik geklickt wurde (für Buttons und so).

Morty
Benutzeravatar
Kiffi
Beiträge: 10715
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

@RSBasic:

mh, wieso nicht mit PB-Boardmitteln? Oder habe ich das was falsch verstanden?

So mal auf die Schnelle zusammengetackert:

Code: Alles auswählen

Enumeration
  #Window
  #ScrollAreaGadget
EndEnumeration

Structure s_Item
  ContainerGadget.l
  TextGadget.l
  ProgressBarGadget.l
EndStructure

NewList Item.s_Item()
  
OpenWindow(#Window, #PB_Ignore, #PB_Ignore, 300, 600, "")
CreateGadgetList(WindowID(#Window))
ScrollAreaGadget(#ScrollAreaGadget, 5, 5, WindowWidth(#Window) - 10, WindowHeight(#Window) - 10, WindowWidth(#Window) - 30, 0, 100, #PB_ScrollArea_Single)

ContainerGadgetHeight= 60

For i = 0 To 20

  AddElement(Item())

  Item()\ContainerGadget = ContainerGadget(#PB_Any, 0, NewY, 200, ContainerGadgetHeight, #PB_Container_Single)
  SetGadgetColor(Item()\ContainerGadget, #PB_Gadget_BackColor, #White)
  
  Item()\TextGadget = TextGadget(#PB_Any, 5, 5, 50, 20, "Item " + Str(i))
  SetGadgetColor(Item()\TextGadget, #PB_Gadget_BackColor, #White)

  Item()\ProgressBarGadget = ProgressBarGadget(#PB_Any, 5, 30, 150, 20, 0, 100, #PB_ProgressBar_Smooth)
  
  CloseGadgetList() ; ContainerGadget
  
  NewY + ContainerGadgetHeight
  
Next

CloseGadgetList() ; ScrollAreaGadget

SetGadgetAttribute(#ScrollAreaGadget, #PB_ScrollArea_InnerHeight, NewY)

Repeat
  
  ; nur zu Demozwecken ein wenig Action:

  WWE=WaitWindowEvent(10)

  SelectElement(Item(), Random(20))
  
  SetGadgetState(Item()\ProgressBarGadget, GetGadgetState(Item()\ProgressBarGadget) + 1)
  If GetGadgetState(Item()\ProgressBarGadget) = 100
    SetGadgetState(Item()\ProgressBarGadget, 0)
  EndIf
  
Until WWE = #PB_Event_CloseWindow
Grüße ... Kiffi

// Edit: Das Flackern sollte man auch einfach in den Griff bekommen...
a²+b²=mc²
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7032
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag von STARGÅTE »

gute lösung das mit einer ScrollArea zu machen, PS. bei mir fackert nix :allright:
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Beitrag von RSBasic »

@Morty
Mal schaun...

@Kiffi
Und das Resizen?

Wenn man 100-200 solche Gadgets erstellt, dann ruckelt es beim Resizen.
Ein einfaches Beispiel:

Code: Alles auswählen

If OpenWindow(0,0,0,1000,500,"No Name",#PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget|#PB_Window_SizeGadget|#PB_Window_ScreenCentered)
  If CreateGadgetList(WindowID(0))
    ScrollAreaGadget(1,10,10,WindowWidth(0)-20,WindowHeight(0)-20,WindowWidth(0)-41,15000,10,0)
      
      For a=100 To 3090 Step 10
        ContainerGadget(a,0,Hoehe,WindowWidth(0)-41,50,#PB_Container_Raised)
          ButtonGadget(a+4,WindowWidth(0)-210,5,32,32,"",0)
          ButtonGadget(a+5,WindowWidth(0)-170,5,32,32,"",0)
          ButtonGadget(a+6,WindowWidth(0)-130,5,32,32,"",0)
          ButtonGadget(a+7,WindowWidth(0)-90,5,32,32,"",0)
          
        CloseGadgetList()
        Hoehe+50
        b+1
      Next
      
    CloseGadgetList()
    ShowScrollBar_(GadgetID(1),#SB_VERT,#True)
    
  EndIf
Repeat
EventID=WaitWindowEvent()
If EventID=#PB_Event_SizeWindow
  SetGadgetAttribute(1,#PB_ScrollArea_InnerWidth,WindowWidth(0)-41)
  ResizeGadget(1,#PB_Ignore,#PB_Ignore,WindowWidth(0)-20,WindowHeight(0)-20)
  For c=100 To 3090 Step 10
    If IsGadget(c)
      ResizeGadget(c,#PB_Ignore,#PB_Ignore,WindowWidth(0)-41,#PB_Ignore)
      ResizeGadget(c+4,WindowWidth(0)-210,#PB_Ignore,#PB_Ignore,#PB_Ignore)
      ResizeGadget(c+5,WindowWidth(0)-170,#PB_Ignore,#PB_Ignore,#PB_Ignore)
      ResizeGadget(c+6,WindowWidth(0)-130,#PB_Ignore,#PB_Ignore,#PB_Ignore)
      ResizeGadget(c+7,WindowWidth(0)-90,#PB_Ignore,#PB_Ignore,#PB_Ignore)
    EndIf
  Next
EndIf
If EventID = #PB_Event_CloseWindow
  Quit=1
EndIf
Until Quit=1
EndIf
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
Falko
Admin
Beiträge: 3535
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

Beitrag von Falko »

Probier das mal bei dir so mal aus. Mein Rechner ist zu schnell dafür :wink:

Code: Alles auswählen

Repeat
EventID=WaitWindowEvent()
If EventID=#PB_Event_SizeWindow
  SetGadgetAttribute(1,#PB_ScrollArea_InnerWidth,WindowWidth(0)-41)
  ResizeGadget(1,#PB_Ignore,#PB_Ignore,WindowWidth(0)-20,WindowHeight(0)-20)
  If EventID=#PB_Event_SizeWindow
    For c=100 To 3090 Step 10
     If IsGadget(c)
       ResizeGadget(c,#PB_Ignore,#PB_Ignore,WindowWidth(0)-41,#PB_Ignore)
       ResizeGadget(c+4,WindowWidth(0)-210,#PB_Ignore,#PB_Ignore,#PB_Ignore)
       ResizeGadget(c+5,WindowWidth(0)-170,#PB_Ignore,#PB_Ignore,#PB_Ignore)
       ResizeGadget(c+6,WindowWidth(0)-130,#PB_Ignore,#PB_Ignore,#PB_Ignore)
       ResizeGadget(c+7,WindowWidth(0)-90,#PB_Ignore,#PB_Ignore,#PB_Ignore)
     EndIf
    Next
  EndIf
EndIf
If EventID = #PB_Event_CloseWindow
  Quit=1
EndIf
Until Quit=1
EndIf
Gruß Falko
Bild
Win11 Pro 64-Bit, PB_6.11b1
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Beitrag von RSBasic »

@Falko
Danke Falko :)

Aber das Problem besteht weiterhin.
Beim Resizen des Fensters flackert es.
Ich gebs auf.
Schade, dass man nicht so einfach Gadgets auf das Listview einbinden kann sowie die Alternative des ScrollAreaGadget.
:(

PS: Danke für eure Bemühungen.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Beitrag von RSBasic »

Was ist mit...
#CB_SETITEMHEIGHT
#LB_SETITEMHEIGHT

:?:
Kann man die fürs Listview benutzen?

\\Edit:
Sorry, nicht beachtet:
LB=ListBox
CB=ComboBox
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

RSBasic hat geschrieben:Was ist mit...
#CB_SETITEMHEIGHT
#LB_SETITEMHEIGHT

:?:
Kann man die fürs Listview benutzen?

\\Edit:
Sorry, nicht beachtet:
LB=ListBox
CB=ComboBox
ListView in PB = ListBox in API
ListIcon in PB = ListView in API :mrgreen:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Beitrag von RSBasic »

@Thomas
Ah okay :mrgreen:

Ich habs mal rasch ausprobiert...

Code: Alles auswählen

SendMessage_(GadgetID(1),#LB_SETITEMHEIGHT,50,0)
Aber ist wohl klar, dass das nicht funktioniert 8) :wink:
Ich guck mal auf der MSDN-Site...(vielleicht finde ich da was (was ich stark bezweifle)

\\Edit:
Failed :freak:
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
Falko
Admin
Beiträge: 3535
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

Beitrag von Falko »

Das funktioniert so wohl am besten :lol:
Sorry, ich musste mich mit dem WindowsCallback anfreunden :allright:

Code: Alles auswählen

Procedure MyWindowCallback(hWnd,uMsg,wParam,lParam)
If uMsg=#WM_EXITSIZEMOVE
   ResizeGadget(1,#PB_Ignore,#PB_Ignore,WindowWidth(0)-20,WindowHeight(0)-20) 
   For c=100 To 3090 Step 10 
      ; If IsGadget(c) 
          ResizeGadget(c,#PB_Ignore,#PB_Ignore,WindowWidth(0)-41,#PB_Ignore) 
          ResizeGadget(c+4,WindowWidth(0)-210,#PB_Ignore,#PB_Ignore,#PB_Ignore) 
          ResizeGadget(c+5,WindowWidth(0)-170,#PB_Ignore,#PB_Ignore,#PB_Ignore) 
          ResizeGadget(c+6,WindowWidth(0)-130,#PB_Ignore,#PB_Ignore,#PB_Ignore) 
          ResizeGadget(c+7,WindowWidth(0)-90,#PB_Ignore,#PB_Ignore,#PB_Ignore) 
       ; EndIf 
    Next 
EndIf
   ProcedureReturn #PB_ProcessPureBasicEvents 
 EndProcedure
    

If OpenWindow(0,0,0,1000,500,"No Name",#PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget|#PB_Window_SizeGadget|#PB_Window_ScreenCentered) 
  If CreateGadgetList(WindowID(0)) 
    ScrollAreaGadget(1,10,10,WindowWidth(0)-20,WindowHeight(0)-20,WindowWidth(0)-41,15000,10,0) 
      
      For a=100 To 3090 Step 10 
        ContainerGadget(a,0,Hoehe,WindowWidth(0)-41,50,#PB_Container_Raised) 
          ButtonGadget(a+4,WindowWidth(0)-210,5,32,32,"",0) 
          ButtonGadget(a+5,WindowWidth(0)-170,5,32,32,"",0) 
          ButtonGadget(a+6,WindowWidth(0)-130,5,32,32,"",0) 
          ButtonGadget(a+7,WindowWidth(0)-90,5,32,32,"",0) 
          
        CloseGadgetList() 
        Hoehe+50 
        b+1 
      Next 
      
    CloseGadgetList() 
    ShowScrollBar_(GadgetID(1),#SB_VERT,#True) 
    SetGadgetAttribute(1,#PB_ScrollArea_InnerWidth,WindowWidth(0)-41) 
  EndIf 
SetWindowCallback(@MyWindowCallback())
Repeat 
Until WaitWindowEvent() = #PB_Event_CloseWindow 
EndIf
Für das Maximieren und Minimieren müsstest du dich mit der uMessage-Konstante #WM_SIZE und den wParametern:

#SIZE_MAXHIDE Message is sent to all pop-up windows when some other window is maximized.
#SIZE_MAXIMIZED Window has been maximized.
#SIZE_MAXSHOW Message is sent to all pop-up windows when some other window has been restored to its former size.
#SIZE_MINIMIZED Window has been minimized.
#SIZE_RESTORE

auseinander setzen.
Gruß, Falko
Bild
Win11 Pro 64-Bit, PB_6.11b1
Antworten