eigenes WinCallBack was ist hier falsch?

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
nicolaus
Moderator
Beiträge: 1175
Registriert: 11.09.2004 13:09
Kontaktdaten:

eigenes WinCallBack was ist hier falsch?

Beitrag von nicolaus »

Hi
Habe mir ein Wincallback gebastelt was nur für einen container gebraucht wird. Das geht soweit auch ganz gut doch habe ich ein prob und zwar werden in dem callback nich alle messagenr. behandelt!

bei nem normalen callback von pb wird z.b auch die message #WM_CTLCOLORSTATIC verarbeitet doch in meinem callback nich.
Hier mal der testcode vieleicht könnt ihr mir ja helfen.

Code: Alles auswählen

Global wnd_long.l

Procedure.l TestCallBack(WindowID, message, wParam, lParam) 
  Result.l = CallWindowProc_(wnd_long, WindowID, message, wParam, lParam) 
  Debug "Message: " +Str(message)
  AddGadgetItem(3,-1, "Messagenummer: " + Str(message))
  SendMessage_(GadgetID(3), #EM_LINESCROLL, 0, 1)
  ProcedureReturn Result 
EndProcedure 
OpenWindow(0, 0, 0, 200, 400,  #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_TitleBar | #PB_Window_ScreenCentered  , "Callbacktest")
CreateGadgetList(WindowID())
hedt = EditorGadget(3,0,110,200,290)
SendMessage_(GadgetID(3), #EM_SETTARGETDEVICE , 0, 0)
hcnd = ContainerGadget(0,0,0,200,100,#PB_Container_Double)
hbtn = ButtonGadget(1,10,10,180,40,"test")
CloseGadgetList()
hContainerGadget = GadgetID(0)
wnd_long = GetWindowLong_(hContainerGadget, #GWL_WNDPROC) 
If wnd_long = 0 
  wnd_long = GetClassLong_(hContainerGadget, #GCL_WNDPROC)
EndIf  
SetWindowLong_(hContainerGadget, #GWL_WNDPROC, @TestCallBack())

Repeat:Until WaitWindowEvent() = #PB_EventCloseWindow
Dabke euch schon mal
Benutzeravatar
nicolaus
Moderator
Beiträge: 1175
Registriert: 11.09.2004 13:09
Kontaktdaten:

Beitrag von nicolaus »

kann mir da keine nen tip geben was ich falsch mache?
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Beitrag von Danilo »

nicolaus hat geschrieben:kann mir da keine nen tip geben was ich falsch mache?
Sag doch erstmal was Du machen möchtest. ;)

Für was willst Du denn genau welche Nachrichten abfangen
oder abarbeiten?
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Benutzeravatar
nicolaus
Moderator
Beiträge: 1175
Registriert: 11.09.2004 13:09
Kontaktdaten:

Beitrag von nicolaus »

Ich will zum beispiel die Message #WM_CTLCOLORSTATIC abfangen und wenn sie die maus über einem Button befindet soll dann ein Text in einem Textgadget (also Statischen objekt) gefärbt werden und wenn die maus weg is vom button solol wieder die alte farbe gesetzt werden. Das is mal eins der dinge die ich da verwenden will.
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Beitrag von Danilo »

nicolaus hat geschrieben:Ich will zum beispiel die Message #WM_CTLCOLORSTATIC abfangen
Du hast kein STATIC Control (Static, CheckBox, Radio, GroupBox),
kein disabled/read-only Text Control, und auch keine disabled ComboBox.

Wie willst Du da die Message bekommen?

Außerdem hatten wir das doch vor ein paar Tagen schonmal von Dir.
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Benutzeravatar
nicolaus
Moderator
Beiträge: 1175
Registriert: 11.09.2004 13:09
Kontaktdaten:

Beitrag von nicolaus »

ok in dem beispiel was ich oben habe ist kein static-control drin das hatte ich auch nur zum testen geschrieben um zu sehen welche messahes ich bekomme. wenn du da in den container noch nen textgadget baust (was ja staticcontrol ist) hast du die message dafür trozdem nich (habe das ja in meinem prog) und das das was wir vor paar tagen hatte geht schon aber halt nur in einem wincallback das ich direkt von PB benutze aber nich in dem selbstgebauetn von mir und genau das verstehe ich nich warum ich da nich alle messages bekomme in dem von mir gebastelten
Benutzeravatar
Lars
Beiträge: 347
Registriert: 31.08.2004 23:53
Wohnort: Shanghai
Kontaktdaten:

Beitrag von Lars »

Weil die Messages dann nicht mehr an's Hauptfenster gehen, sondern an
den Container. Du musst also den Callback des Containers ersetzen.

Code: Alles auswählen

Global OrigContainerCallback.l

Procedure.l ContainerCallback(hwnd.l, msg.l, wParam.l, lParam.l)
  ;whatever
  
  ProcedureReturn CallWindowProc_(OrigContainerCallback, hwnd, msg, wParam, lParam)
EndProcedure

OrigContainerCallback = SetWindowLong_(GadgetID(container), #GWL_WNDPROC, @ContainerCallback())
Lars
The only problem with troubleshooting is, that sometimes the trouble shoots back.
P4 2,6Ghz, 512MB RAM, GeForce 6200, WinXP Pro SP2, PB V3.94
Benutzeravatar
nicolaus
Moderator
Beiträge: 1175
Registriert: 11.09.2004 13:09
Kontaktdaten:

Beitrag von nicolaus »

@Lars

in der nachfolgenden zeile deines beispiels stimmt doch was nich oder?

Code: Alles auswählen

OrigContainerCallback = SetWindowLong_(GadgetID(container), #GWL_WNDPROC, @ContainerCallback())
das soll doch sicher so gemeint sein:

Code: Alles auswählen

OrigContainerCallback = GetWindowLong_(GadgetID(container), #GWL_WNDPROC, @ContainerCallback())
oder?

und wenn du dir nun mein beispiel anschaust siehst du das ich genau das selbe mache nur das die variable die du OrigContainerCallback nennst bei mir wnd_long heist.
Benutzeravatar
Lars
Beiträge: 347
Registriert: 31.08.2004 23:53
Wohnort: Shanghai
Kontaktdaten:

Beitrag von Lars »

Nein, du kannst dir das GetWindowLong_() sparen, da SetWindowLong_()
bereits den alten Wert zurückgibt.

Dass du in deinem Beispiel die selbe Methode verwendest stimmt schon,
allerdings sehe ich da kein TextGadget, wieso wunderst du dich dann,
dass du die erwarteten Messages nicht bekommst (was Danilo ja auch
schon geschrieben hat)?
Lars
The only problem with troubleshooting is, that sometimes the trouble shoots back.
P4 2,6Ghz, 512MB RAM, GeForce 6200, WinXP Pro SP2, PB V3.94
Benutzeravatar
nicolaus
Moderator
Beiträge: 1175
Registriert: 11.09.2004 13:09
Kontaktdaten:

Beitrag von nicolaus »

Hatte zwar oben schon mal geschrieben das das nur ein beispiel ist und ich in dem prog wo ich das eingebaut habe schon textgadgets habe doch hier nun noch mal das geänderte beispiel mit staticontrol (textgadget):

Code: Alles auswählen

Global wnd_long.l 

Procedure.l TestCallBack(WindowID, message, wParam, lParam) 
  Result.l = CallWindowProc_(wnd_long, WindowID, message, wParam, lParam) 
  Debug "Message: " +Str(message) 
  AddGadgetItem(3,-1, "Messagenummer: " + Str(message)) 
  SendMessage_(GadgetID(3), #EM_LINESCROLL, 0, 1) 
  ProcedureReturn Result 
EndProcedure 
OpenWindow(0, 0, 0, 200, 400,  #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_TitleBar | #PB_Window_ScreenCentered  , "Callbacktest") 
CreateGadgetList(WindowID()) 
hedt = EditorGadget(3,0,110,200,290) 
SendMessage_(GadgetID(3), #EM_SETTARGETDEVICE , 0, 0) 
hcnd = ContainerGadget(0,0,0,200,100,#PB_Container_Double) 
hbtn = ButtonGadget(1,10,10,180,40,"test") 
htx  = TextGadget(4,10,60,180,18,"Staticcontrol")
CloseGadgetList() 
hContainerGadget = GadgetID(0) 
wnd_long = SetWindowLong_(hContainerGadget, #GWL_WNDPROC, @TestCallBack()) 

Repeat:Until WaitWindowEvent() = #PB_EventCloseWindow
Und auch hier bekommt man das event "#WM_CTLCOLORSTATIC" mit der messagenr. 312 nicht wenn man die maus in dem container bewegt.
Antworten