Seite 1 von 1

Doppelklick auf Textgadget herausfinden

Verfasst: 20.07.2019 15:10
von bin_neu_hier
Hallo!

Ich habe auf meinem Window ca. 1200 kleine Textgadgets mit dem Flag #SS_NOTIFY (Jahreskalender). Wie kann ich herauskriegen, auf welchem Textgadget ein Doppelklick erfolgte?

Bin mit

Code: Alles auswählen

Repeat
  Select WaitWindowEvent()
    
    Select EventType()
        Case #PB_EventType_LeftDoubleClick
        Debug EventGadget()
    EndSelect

;und so weiter
schnell am Ende des Lateins angekommen.

Re: Doppelklick auf Textgadget herausfinden

Verfasst: 20.07.2019 15:15
von RSBasic

Code: Alles auswählen

EnableExplicit

Global TextGadgetCB

Procedure TextGadgetCB(hWnd, uMsg, wParam, lParam)
  Select uMsg
    Case #WM_LBUTTONDBLCLK
      Debug "Doppelklick"
  EndSelect
  
  ProcedureReturn CallWindowProc_(TextGadgetCB, hWnd, uMsg, wParam, lParam)
EndProcedure

If OpenWindow(0, 0, 0, 500, 400, "Window", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  TextGadget(1, 10, 10, 200, 20, "Hallo  bin_neu_hier, klicke hier doppelt.", #SS_NOTIFY)
  
  TextGadgetCB = SetWindowLongPtr_(GadgetID(1), #GWL_WNDPROC, @TextGadgetCB())
  
  Repeat
    Select WaitWindowEvent()
      Case #PB_Event_CloseWindow
        End
    EndSelect
  ForEver
EndIf

Re: Doppelklick auf Textgadget herausfinden

Verfasst: 20.07.2019 16:16
von bin_neu_hier
Hallo RSBasic,

erstmal vielen Dank dafür. Um das für mein Prog mit ~1200 Textgadgets anzupassen, muss ich das dann so erweitern?

Code: Alles auswählen

for i = 1 to 1200
TextGadgetCB = SetWindowLongPtr_(GadgetID(i), #GWL_WNDPROC, @TextGadgetCB())
next


Re: Doppelklick auf Textgadget herausfinden

Verfasst: 20.07.2019 16:46
von Bisonte
Das Beispiel von RSBasic ist für EIN Gadget ausgelegt.

Für mehr als eines ist eine kleine Anpassung nötig. Ausserdem würde ich das in eine Prozedur
packen, und damit dann das Textgadget erstellen.

Als Beispiel so :

Code: Alles auswählen

EnableExplicit

#PROP_OLDPROC  = "PROP:OLDPROC"
#PROP_PBGADGET = "PROP:PBGADGET"

Procedure TextGadgetCB(hWnd, uMsg, wParam, lParam)
  
  Protected TextGadgetCB = GetProp_(hWnd, #PROP_OLDPROC) ; Für den Originalen CB 
  Protected Gadget    ; Die PB Gadgetnummer
  
  ; Raus, wenn es keinen originalen Callback gibt (Irgendwas läuft dann falsch)
  If Not TextGadgetCB
    Debug "Callback wird missbraucht"
    ProcedureReturn #Null
  EndIf
      
  Select uMsg
      
    Case #WM_LBUTTONDBLCLK
      
      Gadget = GetProp_(hwnd, #PROP_PBGADGET)
      
      Debug "Doppelklick auf Gadget " + Str(Gadget)
      
  EndSelect
 
  ProcedureReturn CallWindowProc_(TextGadgetCB, hWnd, uMsg, wParam, lParam)
  
EndProcedure

Procedure.i _TextGadget(Gadget, x, y, w, h, Text$)
  
  Protected CB
  
  TextGadget(Gadget, x, y, w, h, Text$, #SS_NOTIFY)
  
  ; Callback setzen
  CB = SetWindowLongPtr_(GadgetID(Gadget), #GWL_WNDPROC, @TextGadgetCB())
  
  ; Damit keine Liste/Map oder sonstwas gebraucht wird, jedes Gadget seine eigenen Daten
  SetProp_(GadgetID(Gadget), #PROP_OLDPROC, CB)      ; Für den Originalen Callback des Gadgets
  SetProp_(GadgetID(Gadget), #PROP_PBGADGET, Gadget) ; Für die PB GadgetNummer
      
EndProcedure


If OpenWindow(0, 0, 0, 500, 400, "Window", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  _TextGadget(1, 10, 10, 200, 20, "1 - Hallo  bin_neu_hier, klicke hier doppelt.")
  _TextGadget(2, 10, 40, 200, 20, "2 - Hallo  bin_neu_hier, klicke hier doppelt.")
  _TextGadget(3, 10, 70, 200, 20, "3 - Hallo  bin_neu_hier, klicke hier doppelt.")
  
  Repeat
    Select WaitWindowEvent()
      Case #PB_Event_CloseWindow
        End
    EndSelect
  ForEver
EndIf 
So mal eben auf die Schnelle ;)

Toll gelöst! Doppelklick auf Textgadget herausfinden

Verfasst: 20.07.2019 17:58
von bin_neu_hier
Hallo RSBasic und Bisonte!

Ihr habt mal wieder bestens weitergeholfen. Ihr beide seid klasse!

Hammermäßig!