Stringgadget Subclassing Frage zur Messageverarbeitung

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

Stringgadget Subclassing Frage zur Messageverarbeitung

Beitrag von hjbremer »

Einen schönen guten Abend,

Beim Subclassing wird mit Procedurereturn ja die vorherige "Original" Windowprozedur am Ende wieder aufgerufen.

ich möchte nach meinem Callback die weitere Verarbeitung einer Message unterbinden.

im Beispiel mache ich das bei #VK_UP indem ich die Message lösche.
bei #VK_DOWN mache ich das mit ProcedureReturn 0

Frage: Welche Methode ist besser, richtiger, sinnvoller ???

Code: Alles auswählen

Enumeration
   #mainwindow
   #stringgadget1
   #stringgadget2
EndEnumeration


EnableExplicit

Procedure SubclassingCallback(hwnd, msg, wParam, lParam)
   ;hwnd ist hier gleich der ID vom StringGadget
   
   Protected ptr = GetWindowLongPtr_(hwnd, #GWL_USERDATA)
   
   If msg = #WM_KEYDOWN
      Select wparam
         Case #VK_UP
            ;tue irgendwas 
            ;
            ;nun soll die Message von der Original-Windowprozedur
            ;nicht mehr verarbeitet werden
            ;Möglichkeit 1
            msg = 0
            
         Case #VK_DOWN
            ;tue irgendwas 
            ;
            ;nun soll die Message von der Original-Windowprozedur
            ;nicht mehr verarbeitet werden
            ;Möglichkeit 2
            ProcedureReturn 0
            
      EndSelect      
   EndIf
   
   ProcedureReturn CallWindowProc_(ptr, hwnd, msg, wParam, lParam) 
EndProcedure

Define event, ptr

OpenWindow(#mainwindow, 0, 0, 250, 150, "Main",  #PB_Window_ScreenCentered |#PB_Window_SystemMenu)

StringGadget(#stringgadget1, 10, 30, 180, 22, "Pfeil oben/unten") 

StringGadget(#stringgadget2, 10, 80, 180, 22, "Pfeil oben/unten hier verboten") 
ptr = GetWindowLongPtr_(GadgetID(#stringgadget2), #GWL_WNDPROC)
SetWindowLongPtr_(GadgetID(#stringgadget2), #GWL_WNDPROC, @SubclassingCallback())
SetWindowLongPtr_(GadgetID(#stringgadget2), #GWL_USERDATA, ptr)

Repeat      
   event = WaitWindowEvent() 
Until Event = #PB_Event_CloseWindow 

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
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Re: Stringgadget Subclassing Frage zur Messageverarbeitung

Beitrag von edel »

"ProcedureReturn 0" waere richtig.
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

Re: Stringgadget Subclassing Frage zur Messageverarbeitung

Beitrag von hjbremer »

Ja, benutze ich auch meistens, aber wird dadurch die Kette eventuell vorhandener anderer Callbacks für dieses Gadget nicht unterbrochen oder sehe ich das falsch ?
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
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Re: Stringgadget Subclassing Frage zur Messageverarbeitung

Beitrag von edel »

ich möchte nach meinem Callback die weitere Verarbeitung einer Message unterbinden.
Ja, benutze ich auch meistens, aber wird dadurch die Kette eventuell vorhandener anderer Callbacks für dieses Gadget nicht unterbrochen oder sehe ich das falsch ?

:?
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

Re: Stringgadget Subclassing Frage zur Messageverarbeitung

Beitrag von hjbremer »

ich meine

mit ProcedureReturn CallWindowProc_(ptr, hwnd, msg, wParam, lParam) werden die Parameter an die vorherige WndProc übergeben, dabei könnten diese diese doch verändert werden.

mit Procedurereturn 0 wird die Kette der WndProcs doch abgebrochen, und PBs Eventverarbeitung bekommt von der Message nichts mehr mit

oder ?
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
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Re: Stringgadget Subclassing Frage zur Messageverarbeitung

Beitrag von edel »

Ich versteh dich nicht. Wenn du die Weiterverarbeitung der Nachricht verhindern willst, rufst du nicht CallWindowProc auf. Selbst ein Msg=0 bringt nichts, es wird zwar die alte Proc aufgerufen, aber die Nachricht kann ja dann auch nicht mehr verarbeitet werden.
Antworten