Doppelklick auf Textgadget herausfinden

Anfängerfragen zum Programmieren mit PureBasic.
bin_neu_hier
Beiträge: 105
Registriert: 06.03.2019 21:52

Doppelklick auf Textgadget herausfinden

Beitrag 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.
Bin mit 21 erstmals mit Computern in Kontakt gekommen und konnte mich daher in meiner Jugend ganz auf den Alkohol konzentrieren. Bin nun seit fast 40 Jahren programmiertechnisch konstant auf Anfänger-Level, konnte jedoch beim Thema Alkohol eine gewisse Virtuosität erreichen.
Irgendwas muss man ja gut können.
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Doppelklick auf Textgadget herausfinden

Beitrag 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
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
bin_neu_hier
Beiträge: 105
Registriert: 06.03.2019 21:52

Re: Doppelklick auf Textgadget herausfinden

Beitrag 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

Bin mit 21 erstmals mit Computern in Kontakt gekommen und konnte mich daher in meiner Jugend ganz auf den Alkohol konzentrieren. Bin nun seit fast 40 Jahren programmiertechnisch konstant auf Anfänger-Level, konnte jedoch beim Thema Alkohol eine gewisse Virtuosität erreichen.
Irgendwas muss man ja gut können.
Benutzeravatar
Bisonte
Beiträge: 2427
Registriert: 01.04.2007 20:18

Re: Doppelklick auf Textgadget herausfinden

Beitrag 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 ;)
PureBasic 6.04 LTS (Windows x86/x64) | Windows10 Pro x64 | Asus TUF X570 Gaming Plus | R9 5900X | 64GB RAM | GeForce RTX 3080 TI iChill X4 | HAF XF Evo | build by vannicom​​
bin_neu_hier
Beiträge: 105
Registriert: 06.03.2019 21:52

Toll gelöst! Doppelklick auf Textgadget herausfinden

Beitrag von bin_neu_hier »

Hallo RSBasic und Bisonte!

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

Hammermäßig!
Bin mit 21 erstmals mit Computern in Kontakt gekommen und konnte mich daher in meiner Jugend ganz auf den Alkohol konzentrieren. Bin nun seit fast 40 Jahren programmiertechnisch konstant auf Anfänger-Level, konnte jedoch beim Thema Alkohol eine gewisse Virtuosität erreichen.
Irgendwas muss man ja gut können.
Antworten