Seite 1 von 1

ListIconGadget: Header abfragen ohne Callback

Verfasst: 13.01.2009 22:26
von hjbremer
Hier eine weitere Spielerei. Wer keinen Callback hat oder will oder ..., aber trotzdem einen Mausklick auf den Header abfragen will.

z.B. für Sortieren oder was auch immer

Code: Alles auswählen

Enumeration
 
 #win1
 #but1
 #lvg1
 
EndEnumeration

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

       ButtonGadget(#but1,10,420,80,25,"Tue nix")
       
       idnr1 = ListIconGadget(#lvg1,10,12,300,400,"bla 0",150,#PB_ListIcon_GridLines|#PB_ListIcon_FullRowSelect) 
               AddGadgetColumn(#lvg1,1,"Spalte 1",150) 
               AddGadgetColumn(#lvg1,2,"Spalte 2",55) 
               AddGadgetColumn(#lvg1,3,"Spalte 3",255) 
       
       head1 = SendMessage_(idnr1, #LVM_GETHEADER, #Null, #Null) 
       
       For i = 1 To 62 
          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 = #WM_LBUTTONDOWN  ;513
     
      If GetCapture_() = head1

         GetCursorPos_(p.POINT) 
         MapWindowPoints_(0,head1,p,1)          
         HD_HitInfo.HD_HITTESTINFO 
         HD_Hitinfo\pt\x = p\x 
         HD_HitInfo\pt\y = p\y 
         SendMessage_(head1,#HDM_HITTEST,0,HD_HitInfo)        
         mouseclickhead1 = HD_hitinfo\iitem 
         Debug "Head1: Spalte " + Str(mouseclickhead1)
      
      EndIf
  
  ElseIf Event = #PB_Event_Gadget Or Event = #PB_Event_Menu 
     
      welcherButton = EventGadget()  
      
      Select welcherButton
            Case #but1: Debug "Button 1 gedrückt"
            
            Case #lvg1
                If EventType() = #PB_EventType_LeftClick                
                    GetCursorPos_(p.POINT) 
                    MapWindowPoints_(0,idnr1,p,1)              
                    HitInfo.LVHITTESTINFO 
                    Hitinfo\pt\x = p\x 
                    HitInfo\pt\y = p\y 
                    SendMessage_(idnr1,#LVM_SUBITEMHITTEST ,0,HitInfo) 
                    mouseclickrow = hitinfo\iitem 
                    mouseclickcol = hitinfo\isubitem                       
                EndIf
                        
      EndSelect
      
  EndIf

Until event = #PB_Event_CloseWindow 

End 

Verfasst: 16.01.2009 17:57
von Andesdaf
schön. wollte sowas schon lange mal benutzen, und nun kommt der Code.

Verfasst: 13.04.2009 17:59
von pickelrobert
Hallo,

funktioniert soweit ganz gut. Danke.

Mir ist aufgefallen, daß das Ereignis auch beim Ändern der Spaltenbreite auftritt. Kann man das ändern?

Ein weiterer Wunsch wäre, auch auf das Loslassen der Taste zu reagieren. Ein einfaches hinzufügen von:

Code: Alles auswählen

...
If event = #WM_LBUTTONDOWN and event = #WM_LBUTTONUP ;513/514
...
wird ignoriert.

Verfasst: 13.04.2009 18:44
von Josef Sniatecki
Ich würde anstatt 513 und 514 das Event Nr. 15 nehmen, da dieses Event
nur bei einem Durck eines Headers auftritt. Ich nutze immer folgenden Code, um sowas zu Überprüfen:

Code: Alles auswählen

OpenWindow(0,0,0,200,200,"Test",#PB_Window_SystemMenu)
  ListIconGadget(1,0,0,200,200,"Test 1",50)
  AddGadgetColumn(1,1,"Test 2",50)



Repeat
  Event=WaitWindowEvent()
  Gadget=EventGadget()
  
  Debug "Event: " + Str(Event)
  Debug "Gadget: " + Str(Gadget)
Until Event=#PB_Event_CloseWindow
EDIT: Oh... bemerke gerade, dass 15 auch beim resizen der
Headers aufgerufen wird...

Verfasst: 14.04.2009 16:40
von Andesdaf
pickelrobert hat geschrieben: Ein einfaches hinzufügen von:

Code: Alles auswählen

...
If event = #WM_LBUTTONDOWN and event = #WM_LBUTTONUP ;513/514
...
wird ignoriert.
Die WM_ befehle können meiner Meinung nach nur in einem Callback benutzt
werden.

Verfasst: 14.04.2009 20:48
von edel
Andesdaf hat geschrieben:
pickelrobert hat geschrieben: Ein einfaches hinzufügen von:

Code: Alles auswählen

...
If event = #WM_LBUTTONDOWN and event = #WM_LBUTTONUP ;513/514
...
wird ignoriert.
Die WM_ befehle können meiner Meinung nach nur in einem Callback benutzt
werden.
In diesem Fall wohl eher sollten. Wobei die Abfrage aber eh Quatsch ist,
entweder ist die Taste unten oder oben, aber nicht beides zusammen.
Josef Sniatecki hat geschrieben: EDIT: Oh... bemerke gerade, dass 15 auch beim resizen der
Headers aufgerufen wird...
Das Event nennt sich #wm_paint oder #pb-event_repaint. Solche
Spielereien sollte man nur in einem Callback machen, da weiss man
auch was kommt und was nicht.

Verfasst: 14.04.2009 21:05
von Batze
edel hat geschrieben:Das Event nennt sich #wm_paint oder #pb-event_repaint. Solche Spielereien sollte man nur in einem Callback machen, da weiss man
auch was kommt und was nicht.
Alle mit den MouseButtonevents hatte ich bisher nie Schwierigkeiten wenn sie direkt abgefragt wurden.

Verfasst: 15.04.2009 16:28
von Andesdaf
edel hat geschrieben:Wobei die Abfrage aber eh Quatsch ist,
entweder ist die Taste unten oder oben, aber nicht beides zusammen.
Stimmt. Or ist wohl gemeint.