Seite 2 von 2

Verfasst: 31.10.2004 16:01
von Danilo
nicolaus hat geschrieben:Und auch hier bekommt man das event "#WM_CTLCOLORSTATIC" mit der messagenr. 312 nicht wenn man die maus in dem container bewegt.
Diese Nachricht kommt auch nicht wenn man die Maus über
ein Gadget bewegt, sondern wenn das Gadget (der Hintergrund)
neu gezeichnet werden muß.

Nimm mal das Fenster in Deinem Beispiel und schiebe es
aus dem Screen heraus, oder schiebe ein anderes Fenster
über das Static Control.
Dann muß das Control neu gezeichnet werden, und Du bekommst
auch diese Nachricht.

Hier nochmal verändert, so daß man es noch besser sieht:

Code: Alles auswählen

Global wnd_long.l

Global hBrush
hBrush = CreateSolidBrush_($A6CF42)

Procedure.l TestCallBack(WindowID, message, wParam, lParam)
  If message = #WM_CTLCOLORSTATIC
    msg$ = "Message: WM_CTLCOLORSTATIC"
    SetBkMode_(wParam,#TRANSPARENT)
    Result = hBrush
  Else
    msg$ = "Message: " + Str(message)
    Result = CallWindowProc_(wnd_long, WindowID, message, wParam, lParam)
  EndIf
  If IsGadget(3)
    AddGadgetItem(3,-1, msg$)
    SendMessage_(GadgetID(3), #EM_LINESCROLL, 0, 1)
  EndIf
  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)
    wnd_long = SetWindowLong_(hcnd, #GWL_WNDPROC, @TestCallBack())
    hbtn     = ButtonGadget(1,10,10,180,40,"test")
    htx      = TextGadget(4,10,60,180,18,"Staticcontrol")
  CloseGadgetList()

Repeat:Until WaitWindowEvent() = #PB_EventCloseWindow

DeleteObject_(hBrush)

Verfasst: 31.10.2004 16:15
von Andre
@Danilo: wenn Du den Debugger-Fehler beim Beenden zur Zeile

Code: Alles auswählen

AddGadgetItem(3,-1, msg$)
noch weg bekommst, wäre dies wieder ein recht guter Beispielcode für Message-Handling im CodeArchiv. 8)

Verfasst: 31.10.2004 16:32
von nicolaus
Ok dann habe ich callbacks wohl doch noch nich ganz verstanden denn wenn ich jetzt das zeug von PB für ein callback nehm und das fenster nicht verschiebe oder sonstwas dann geht das da aber auch so sprich ich bekomme das event auch ohne verschieben oder so. siehe das beispiel hier:

Code: Alles auswählen

Global wnd_long.l 
Global color_change.l
Global t.l
Global hBrush
t = 0 
hBrush = CreateSolidBrush_($A6CF42) 

Procedure.l TestCallBack(WindowID, message, wParam, lParam) 
  Result=#PB_ProcessPureBasicEvents 
  Select message
    Case #WM_CTLCOLORSTATIC 
      msg$ = "#WM_CTLCOLORSTATIC"
      AddGadgetItem(3,-1, msg$) 
      SendMessage_(GadgetID(3), #EM_LINESCROLL, 0, 1) 
      If lParam = GadgetID(4)                      
        SetBkMode_(wParam,#TRANSPARENT)
        If color_change = 1
          SetTextColor_(wParam,RGB(0,0,255)) 
          Result=hBrush 
        ElseIf color_change = 0
          SetTextColor_(wParam,RGB(220,220,220))     
          Result=hBrush
        EndIf 
      EndIf 
  EndSelect
  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() 
SetWindowCallback(@TestCallBack())
InvalidateRect_(GadgetID(4),0,1) 
UpdateWindow_(GadgetID(4)) 

Repeat
  Delay(1)
  If t > 40 
    If color_change = 0 
      color_change = 1
      InvalidateRect_(GadgetID(4),0,1) 
      UpdateWindow_(GadgetID(4))
    EndIf 
    t +1
    If t = 80
      t=0
    EndIf
  Else 
    If color_change = 1
      color_change = 0 
      InvalidateRect_(GadgetID(4),0,1) 
      UpdateWindow_(GadgetID(4)) 
    EndIf 
  EndIf 
  t+1 
Until WindowEvent() = #PB_EventCloseWindow 

DeleteObject_(hBrush)
Jetzt frag ich mich nur was ich hier falsch verstehe das es mit dem von PB geht und mit meinem selbsgebauten nich?

Verfasst: 31.10.2004 16:32
von Danilo
Andre hat geschrieben:@Danilo: wenn Du den Debugger-Fehler beim Beenden zur Zeile

Code: Alles auswählen

AddGadgetItem(3,-1, msg$)
noch weg bekommst, wäre dies wieder ein recht guter Beispielcode für Message-Handling im CodeArchiv. 8)
Hättest es ja auch selbst wegmachen können, ich hatte den
Debugger halt aus. Ist oben eingefügt.

Ich verstehe trotzdem nicht warum Du jeden popeligen
CodeSchnippsel ins CodeArchiv aufnimmst, auch wenn
er absolut nichts Neues zeigt.

Du hast doch echt schon genug Codes die das Einfärben von
allen möglichen Gadgets zeigen, auch das was hier von nicolaus
gemacht wird.

Du solltest mal objektiv schauen was nützlich und neu ist,
und nicht einfach blind alles ins CodeArchiv übernehmen,
auch wenn dafür schon mehrere Beispiele drin sind.

Hier ist ein Programmierforum wo nunmal, beim Versuch
zu helfen und Probleme zu klären, täglich viele Codes
ausgetauscht werden.
Einige dieser Codes sind nötig um hier das Problem zu
klären und aufzuzeigen. Fürs CodeArchiv sind die aber
nichts, denn ich denke das CodeArchiv sollte nicht jeden
CodeSchnipsel beinhalten der jemals in einem Forum
aufgetaucht ist, sondern gute Codes die Helfen können
und noch nicht im Archiv sind.

Ein Problem wie hier wird es auch in Zukunft noch öfters
geben... und dann hast Du bald 83 Codes die alle zeigen
wie man ein Static Control einfärben kann.
Das finde ich dann irgendwie überflüssig, sorry.

Verfasst: 31.10.2004 16:39
von Danilo
nicolaus hat geschrieben:Ok dann habe ich callbacks wohl doch noch nich ganz verstanden denn wenn ich jetzt das zeug von PB für ein callback nehm und das fenster nicht verschiebe oder sonstwas dann geht das da aber auch so sprich ich bekomme das event auch ohne verschieben oder so. siehe das beispiel hier:

Code: Alles auswählen

<...snip...>

SetWindowCallback(@TestCallBack())
InvalidateRect_(GadgetID(4),0,1) 
UpdateWindow_(GadgetID(4)) 

Repeat
  Delay(1)
  If t > 40 
    If color_change = 0 
      color_change = 1
      InvalidateRect_(GadgetID(4),0,1) 
      UpdateWindow_(GadgetID(4))
    EndIf 
    t +1
    If t = 80
      t=0
    EndIf
  Else 
    If color_change = 1
      color_change = 0 
      InvalidateRect_(GadgetID(4),0,1) 
      UpdateWindow_(GadgetID(4)) 
    EndIf 
  EndIf 
  t+1 
Until WindowEvent() = #PB_EventCloseWindow 

DeleteObject_(hBrush)
Jetzt frag ich mich nur was ich hier falsch verstehe das es mit dem von PB geht und mit meinem selbsgebauten nich?
Schau Dir doch mal an was Du hier machst, nicolaus.

Kannst Du in diesem Abschnitt nicht die 3 Stellen sehen an
denen Du das Gadget 4 neu zeichnest?

Ich sagte doch bereits das diese Nachricht kommt wenn das
Gadget neu gezeichnet wird, und genau das machst Du hier... :roll:

Verfasst: 31.10.2004 16:45
von Andre
@Danilo: keine Frage, hast im wesentlichen schon Recht mit Deiner Aussage. Werde dies auch mit bedenken. Das heißt dann auch, dass mal ältere Codes gegen neue/bessere ausgetauscht werden, also sicher nicht 83 Codes zum gleichen Thema drin stehen werden.... 8)

Wenn ich also etwas bzgl. Aufnahme ins CodeArchiv sage, heißt dies nicht, dass ich etwas ungefiltert aufnehme. Erstmal wird "lose" gesammelt und vor einem Release erfolgt das Einsortieren und damit auch der Abgleich mit vorhandenen Codes.

Das ist kein neues Vorhaben von mir, sondern wurde bereits in der Vergangenheit so gehandhabt. Wenn es auch in manchen Fällen etwas strikter durchgezogen gehört... :wink:

Verfasst: 04.11.2004 17:07
von nicolaus
@Danilo
jetzt habe ich noch mal ne frage zu callbacks und zwar habe ich in dem nachfolgenden beispiel 2 container. Der 2 container "liegt" in dem ersten container also is er auch in der gadgetlist des ersten containers und nun habe ich noch controlls die in dem 2 container "liegen" und diese sollen nun in einem callback bei bestimmten messages verändert werden.
Nun meine frage wenn ich bei dem callback das handle des ersten containers (also des hauptcontainers) angebe passiert nix doch wenn ich das handle des 2 containers angebe gehts obwohl er ja zum ersten gehört.
Änder einfach in dem code unten mal das hcnd auf hcnd1 bei SetWindowLong().

Code: Alles auswählen

Global wnd_long.l 
Global tb_power.l
Global hBrush 
hBrush = CreateSolidBrush_($A6CF42) 

Procedure.l TestCallBack(WindowID, message, wParam, lParam) 
  If message = #WM_CTLCOLORSTATIC 
    msg$ = "Message: WM_CTLCOLORSTATIC" 
    If lParam = GadgetID(4)
      SetBkMode_(wParam,#TRANSPARENT)
      If tb_power = 1
        SetTextColor_(wParam,RGB(0,0,255)) 
        Result=hBrush 
      ElseIf tb_power = 0
        SetTextColor_(wParam,RGB(220,220,220))     
        Result=hBrush 
      EndIf  
    EndIf 
    
  Else 
    msg$ = "Message: " + Str(message) 
    Result = CallWindowProc_(wnd_long, WindowID, message, wParam, lParam) 
  EndIf 
  If IsGadget(3) 
    AddGadgetItem(3,-1, msg$) 
    SendMessage_(GadgetID(3), #EM_LINESCROLL, 0, 1) 
  EndIf 
  ProcedureReturn Result 
EndProcedure 
Procedure IsMouseOverGadget(gadget)
  GetWindowRect_(GadgetID(gadget),GadgetRect.RECT) 
  GetCursorPos_(mouse.POINT) 
  If mouse\x>=GadgetRect\Left And mouse\x<=GadgetRect\right And mouse\y>=GadgetRect\Top And mouse\y<=GadgetRect\bottom 
    ProcedureReturn #True 
  Else 
    ProcedureReturn #False 
  EndIf 
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) 
hcnd1 = ContainerGadget(5,0,0,199,99)
wnd_long = SetWindowLong_(hcnd, #GWL_WNDPROC, @TestCallBack()) 
hbtn     = ButtonGadget(1,10,10,180,40,"test") 
htx      = TextGadget(4,10,60,180,18,"Staticcontrol")
CloseGadgetList() 
CloseGadgetList() 

Repeat
    If IsMouseOverGadget(1)
      tb_power = 1
      InvalidateRect_(GadgetID(4),0,1)
      UpdateWindow_(GadgetID(4))
    Else
      tb_power = 0
      InvalidateRect_(GadgetID(4),0,1)
      UpdateWindow_(GadgetID(4))
    EndIf
Until WaitWindowEvent() = #PB_EventCloseWindow 

DeleteObject_(hBrush)
Bin jetzt ein wenig verwirt denn wenn ich in dem hauptcontainer nen weiteren habe warum greift das callback dann nicht auch auf den 2 container? Muß ich da jetzt für jeden container ein callback erstellen?

Danke schon mal.