Seite 2 von 4

Verfasst: 29.04.2008 09:01
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

Verfasst: 29.04.2008 09:35
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...

Verfasst: 29.04.2008 10:37
von STARGÅTE
gute lösung das mit einer ScrollArea zu machen, PS. bei mir fackert nix :allright:

Verfasst: 29.04.2008 13:21
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

Verfasst: 29.04.2008 20:44
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

Verfasst: 29.04.2008 21:00
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.

Verfasst: 29.04.2008 21:13
von RSBasic
Was ist mit...
#CB_SETITEMHEIGHT
#LB_SETITEMHEIGHT

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

\\Edit:
Sorry, nicht beachtet:
LB=ListBox
CB=ComboBox

Verfasst: 29.04.2008 21:20
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:

Verfasst: 29.04.2008 21:26
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:

Verfasst: 29.04.2008 23:39
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