Wie Gadgetnummer per WindowCallback ermitteln?

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Rudi
Beiträge: 143
Registriert: 22.04.2010 18:28
Wohnort: #PB_Any

Wie Gadgetnummer per WindowCallback ermitteln?

Beitrag von Rudi »

Folgender Code gibt mir alle Infos von wParam zurück.
Möchte aber nur die Gadgetnummern der dynamisch erstellten Textgadgets beim Anklicken haben.

Code: Alles auswählen

Procedure WinCallback(hWnd, uMsg, wParam, lParam)
Debug wParam

  ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure

Procedure OpenWindow_Window_0()
  If OpenWindow(0, 300, 300, 400, 100, "Window_0")
  SetWindowCallback(@WinCallback())
  EndIf
EndProcedure

OpenWindow_Window_0()
For i=1 To 10
TextGadget(i,20*i,20,20,20,Str(i),#SS_NOTIFY)
Next

Repeat
  Select WaitWindowEvent()
    Case #PB_Event_Gadget
    Case #PB_Event_CloseWindow
      Select EventWindow()
        Case 0
          CloseWindow(0)
          Break
      EndSelect
  EndSelect
ForEver
Win7 (x64)PB 5.4x (x86)5,7 Windows-LeistungsindexSuche
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Wie Gadgetnummer per WindowCallback ermitteln?

Beitrag von ts-soft »

Code: Alles auswählen

GetProp_(hwnd, "PB_ID")
oder

Code: Alles auswählen

GetDlgCtrlID_(hWnd)
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Rudi
Beiträge: 143
Registriert: 22.04.2010 18:28
Wohnort: #PB_Any

Re: Wie Gadgetnummer per WindowCallback ermitteln?

Beitrag von Rudi »

Danke! Scheint aber nicht die richtige Lösung zu sein. Die Gadget-ID kommt nur beim Klick auf eines der Textgadgets und dann nur über wParam. Ich denke da muß über entsprechende Konstanten gefiltert werden, wie hier, aus der BP-Hilfe:

Code: Alles auswählen

  Procedure WinCallback(hWnd, uMsg, wParam, lParam) 
    ; Windows füllt die Parameter automatisch, welche wir im Callback verwenden...
    
    If uMsg = #WM_SIZE 
      Select wParam 
        Case #SIZE_MINIMIZED 
          Debug "Fenster wurde minimiert"
        Case #SIZE_RESTORED 
          Debug "Fenster wurde wiederhergestellt"
        Case #SIZE_MAXIMIZED 
          Debug "Fenster wurde maximiert"
      EndSelect 
    EndIf 
  
    ProcedureReturn #PB_ProcessPureBasicEvents 
  EndProcedure 
Win7 (x64)PB 5.4x (x86)5,7 Windows-LeistungsindexSuche
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Wie Gadgetnummer per WindowCallback ermitteln?

Beitrag von ts-soft »

Wenn das Händel in wParam ist, dann sollstest Du hWnd auch durch wParam ersetzen!
Bei #PB_Any ist die ID ein Pointer, also eine sehr hohe Nummer :wink:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Rudi
Beiträge: 143
Registriert: 22.04.2010 18:28
Wohnort: #PB_Any

Re: Wie Gadgetnummer per WindowCallback ermitteln?

Beitrag von Rudi »

Mit Debug GetDlgCtrlID_(wParam) kommt die Gadgetnummer jetzt schon beim Überfahren mit der Maus. Also gut!
Wollte aber, dass erst bei Mausklick was passiert.
Der hier geht nicht:

Code: Alles auswählen

If uMsg = #WM_LBUTTONDOWN
  Debug GetDlgCtrlID_(wParam)
EndIf 
Win7 (x64)PB 5.4x (x86)5,7 Windows-LeistungsindexSuche
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Wie Gadgetnummer per WindowCallback ermitteln?

Beitrag von Kiffi »

Rudi hat geschrieben:Wollte aber, dass erst bei Mausklick was passiert.
probier mal das hier:

Code: Alles auswählen

  If uMsg = #WM_COMMAND
    Select (wParam >> 16) & $FFFF ; Message
      Case #BN_CLICKED            ;  -> Button Clicked
        Debug "Click" 
    EndSelect 
  EndIf 
(grade eben aus anderen Postings zusammengestöpselt)

Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Re: Wie Gadgetnummer per WindowCallback ermitteln?

Beitrag von edel »

Wenn du Informationen zu einer Windowsmessage brauchst, suchst du sie am besten hier :
http://social.msdn.microsoft.com/Search/en-US?query=

Dort steht dann was genau wParam und lParam ist und was nicht.

Zu deinem Problem :

Code: Alles auswählen

Macro _LOWORD(a) 		: (a & $FFFF)       : EndMacro
Macro _HIWORD(a) 		: (a >> 16 & $FFFF) : EndMacro 

Procedure WinCallback(hWnd, uMsg, wParam, lParam)
  
  If uMsg = #WM_COMMAND
    
    If _HIWORD(wParam) = #STN_CLICKED
      
      Debug _LOWORD(wParam) 
      
    EndIf

  EndIf
  
  ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure
Benutzeravatar
Rudi
Beiträge: 143
Registriert: 22.04.2010 18:28
Wohnort: #PB_Any

Re: Wie Gadgetnummer per WindowCallback ermitteln?

Beitrag von Rudi »

Besten Dank an ts-soft, Kiffi und edel!
Der Code von edel funktioniert ganz edel. Muss mich da aber erst noch rein denken, um ihn zu verstehen. Der Abend ist nun gerettet...
Hier noch einmal der Code insgesamt:

Code: Alles auswählen

Macro _LOWORD(a) : (a & $FFFF)       : EndMacro
Macro _HIWORD(a) : (a >> 16 & $FFFF) : EndMacro

Procedure WinCallback(hWnd, uMsg, wParam, lParam)
 
  If uMsg = #WM_COMMAND
    If _HIWORD(wParam) = #STN_CLICKED
      Debug _LOWORD(wParam)
    EndIf
  EndIf
 
  ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure

Procedure OpenWindow_Window_0()
  If OpenWindow(0, 300, 300, 400, 100, "Window_0")
  SetWindowCallback(@WinCallback())
  EndIf
EndProcedure

OpenWindow_Window_0()
For i=1 To 10
TextGadget(i,20*i,20,20,20,Str(i),#SS_NOTIFY)
Next

Repeat
  Select WaitWindowEvent()
    Case #PB_Event_Gadget
    Case #PB_Event_CloseWindow
      Select EventWindow()
        Case 0
          CloseWindow(0)
          Break
      EndSelect
  EndSelect
ForEver
Win7 (x64)PB 5.4x (x86)5,7 Windows-LeistungsindexSuche
Antworten