Seite 1 von 2

eigenes WinCallBack was ist hier falsch?

Verfasst: 29.10.2004 21:03
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

Verfasst: 30.10.2004 07:19
von nicolaus
kann mir da keine nen tip geben was ich falsch mache?

Verfasst: 30.10.2004 08:51
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?

Verfasst: 30.10.2004 13:28
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.

Verfasst: 30.10.2004 15:07
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.

Verfasst: 30.10.2004 15:51
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

Verfasst: 30.10.2004 18:08
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())

Verfasst: 31.10.2004 04:03
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.

Verfasst: 31.10.2004 13:17
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)?

Verfasst: 31.10.2004 14:46
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.