Seite 1 von 1

Gadgets ohne Callback färben

Verfasst: 08.04.2014 19:14
von SBond
Hi Leute,

mit Hilfe von Callbacks, kann man z.B. die Farben von Gadgets ändern (siehe Beispiel). Kann man dies auch ohne Callbacks realisieren?
Gibt es eventuell einen WinAPI-Befehl oder lässt es sich über eine unabhängige Prozedur realisieren (z.B. SetBkColor(#Gadget, Color))?
----------------------

Folgender Fall: Ich habe ein Programm mit mehreren Modulen. Jedes Modul erzeugt in der GUI ein ContainerGadgets mit den darauf enthaltenen Gadgets. Die Hintergrundfarbe der Gadgets entspricht der Systemfarbe, auch wenn die Hintergrundfarbe des Containers geändert wurde. (siehe: http://www.purebasic.fr/german/viewtopi ... =3&t=27755).

Mit einer Callback-Prozedur würde es funktionieren, aber ich möchte nicht eine Callback-Prozedur erstellen, in denen ich alle zu ändernen Gadgets der Module eintrage. Mehrere Callback-Prozeduren gehen scheinbar auch nicht.

Weiß jemand, wie ich das vernünftig lösen könnte?

viele Grüße,
SBond


Code: Alles auswählen

Global Farbe = CreateSolidBrush_($FFF000)

Procedure Callback(hWnd, uMsg, wParam, lParam)
	Select uMsg
	Case #WM_CTLCOLORSTATIC
		If lparam = GadgetID(1)
			ProcedureReturn Farbe
		EndIf
	EndSelect
	ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure

OpenWindow(0, 0, 0, 200, 50, "", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
CheckBoxGadget(1, 10, 10, 150, 20, "CheckBox")
SetWindowCallback(@Callback())

Repeat: Until WaitWindowEvent() = #PB_Event_CloseWindow
DeleteObject_(Farbe)
End

Re: Gadgets ohne Callback färben

Verfasst: 08.04.2014 19:28
von RSBasic
Soweit ich weiß gibt es keine Eigenschaft fürs Ändern der Hintergrundfarbe eines Buttons. Ich kann mich aber auch irren.

Du kannst natürlich mehrere Callbacks hinzufügen, indem du per WinAPI ein Callback erstellst.
Nur ein Beispiel:

Code: Alles auswählen

Global Farbe = CreateSolidBrush_($FFF000)
Global oldCallback1
Global oldCallback2

Procedure Callback1(hWnd, uMsg, wParam, lParam)
  result = CallWindowProc_(oldCallback1, hWnd, uMsg, wParam, lParam)
  Select uMsg
    Case #WM_CTLCOLORSTATIC
      If lparam = GadgetID(1)
        Debug "a"
        ProcedureReturn Farbe
      EndIf
  EndSelect
  ProcedureReturn result
EndProcedure

Procedure Callback2(hWnd, uMsg, wParam, lParam)
  result = CallWindowProc_(oldCallback2, hWnd, uMsg, wParam, lParam)
  Select uMsg
    Case #WM_CTLCOLORSTATIC
      If lparam = GadgetID(1)
        Debug "b"
        ProcedureReturn Farbe
      EndIf
  EndSelect
  ProcedureReturn result
EndProcedure

OpenWindow(0, 0, 0, 200, 50, "", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
CheckBoxGadget(1, 10, 10, 150, 20, "CheckBox")
;SetWindowCallback(@Callback())
oldCallback1 = SetWindowLongPtr_(WindowID(0), #GWL_WNDPROC, @Callback1())
oldCallback2 = SetWindowLongPtr_(WindowID(0), #GWL_WNDPROC, @Callback2())

Repeat: Until WaitWindowEvent() = #PB_Event_CloseWindow
DeleteObject_(Farbe)
End

Re: Gadgets ohne Callback färben

Verfasst: 08.04.2014 20:10
von SBond
super. ich denke so ist es auch ok :)

vielen Dank.

PS: Dein Startbutton-Avatar irritiert mich immer wieder aufs neue. Man klickt drauf und nichts passiert. Immer diese Windows-Reflexe...
...aber ich versuche ja auch manchmal Fenster in einem Screenshot zu schließen. ...ich bin 27 und werde schon alt xD.


viele Grüße,
SBond

Re: Gadgets ohne Callback färben

Verfasst: 10.04.2014 20:58
von SBond
ich habe doch noch mal eine Frage...

wieso funktioniert die Färbung nicht in einem ContainerGadget oder PanelGadget? Habe ich etwas vergessen?


Code: Alles auswählen

Global Farbe = CreateSolidBrush_($FFF000)
Global Callback

Procedure Callback1(hWnd, uMsg, wParam, lParam)
  result = CallWindowProc_(Callback, hWnd, uMsg, wParam, lParam)
  Select uMsg
    Case #WM_CTLCOLORSTATIC
;       If lparam = GadgetID(1)
        ProcedureReturn Farbe
;       EndIf
  EndSelect
  ProcedureReturn result
EndProcedure


OpenWindow(0, 0, 0, 200, 100, "", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)

ContainerGadget(1,0,0,200,50)
	CheckBoxGadget(2, 10, 10, 150, 20, "CheckBox 1")
	SetGadgetColor(1,#PB_Gadget_BackColor, $FFF000)
	CloseGadgetList()
	
CheckBoxGadget(3, 10, 70, 150, 20, "CheckBox 1")

Callback = SetWindowLongPtr_(WindowID(0), #GWL_WNDPROC, @Callback1())


Repeat: Until WaitWindowEvent() = #PB_Event_CloseWindow
DeleteObject_(Farbe)
End

Re: Gadgets ohne Callback färben

Verfasst: 11.04.2014 10:29
von RSBasic

Code: Alles auswählen

Callback = SetWindowLongPtr_(GadgetID(1), #GWL_WNDPROC, @Callback1())

Re: Gadgets ohne Callback färben

Verfasst: 11.04.2014 15:20
von SBond
ahh... ich verstehe.

vielen vielen Dank. Funktioniert wie immer Prima.