ListIconGadget: Header abfragen ohne Callback

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: Header abfragen ohne Callback

Beitrag 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 
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
Andesdaf
Moderator
Beiträge: 2673
Registriert: 15.06.2008 18:22
Wohnort: Dresden

Beitrag von Andesdaf »

schön. wollte sowas schon lange mal benutzen, und nun kommt der Code.
Win11 x64 | PB 6.20
pickelrobert
Beiträge: 207
Registriert: 09.12.2004 22:09

Beitrag 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.
Benutzeravatar
Josef Sniatecki
Beiträge: 657
Registriert: 02.06.2008 21:29
Kontaktdaten:

Beitrag 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...
PB 4.61 | Windows Vista - 32Bit
Homepage

"Wahrlich es ist nicht das Wissen, sondern das Lernen, nicht das Besitzen sondern das Erwerben, nicht das Dasein, sondern das Hinkommen, was den grössten Genuss gewährt." - Carl Friedrich Gauß
Andesdaf
Moderator
Beiträge: 2673
Registriert: 15.06.2008 18:22
Wohnort: Dresden

Beitrag 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.
Win11 x64 | PB 6.20
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag 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.
Benutzeravatar
Batze
Beiträge: 1492
Registriert: 03.06.2005 21:58
Wohnort: Berlin
Kontaktdaten:

Beitrag 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.
Hier sind meine Codes (aber die Seite geht gerade nicht):
http://www.basicpure.de.vu
Andesdaf
Moderator
Beiträge: 2673
Registriert: 15.06.2008 18:22
Wohnort: Dresden

Beitrag 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.
Win11 x64 | PB 6.20
Antworten