Seite 1 von 1

Stringgadget Subclassing Frage zur Messageverarbeitung

Verfasst: 04.09.2013 21:09
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 


Re: Stringgadget Subclassing Frage zur Messageverarbeitung

Verfasst: 04.09.2013 21:45
von edel
"ProcedureReturn 0" waere richtig.

Re: Stringgadget Subclassing Frage zur Messageverarbeitung

Verfasst: 04.09.2013 22:08
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 ?

Re: Stringgadget Subclassing Frage zur Messageverarbeitung

Verfasst: 04.09.2013 22:33
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 ?

:?

Re: Stringgadget Subclassing Frage zur Messageverarbeitung

Verfasst: 05.09.2013 07:25
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 ?

Re: Stringgadget Subclassing Frage zur Messageverarbeitung

Verfasst: 05.09.2013 11:35
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.