Gadgets ohne Callback färben

Für allgemeine Fragen zur Programmierung mit PureBasic.
SBond
Beiträge: 266
Registriert: 22.05.2013 20:35

Gadgets ohne Callback färben

Beitrag 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
41 6c 73 6f 20 77 65 6e 6e 20 64 75 20 73 6f 20 76 69 65 6c 20 4c 61 6e 67 65 77 65 69 6c 65 20 68 61 73 74 2c 20 64 61 6e 6e 20 6b 61 6e 6e 73 74 20 64 75 20 61 75 63 68 20 67 6c 65 69 63 68 20 7a 75 20 6d 69 72 20 6b 6f 6d 6d 65 6e 20 75 6e 64 20 61 62 77 61 73 63 68 65 6e 2e

:D
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Gadgets ohne Callback färben

Beitrag 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
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
SBond
Beiträge: 266
Registriert: 22.05.2013 20:35

Re: Gadgets ohne Callback färben

Beitrag 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
41 6c 73 6f 20 77 65 6e 6e 20 64 75 20 73 6f 20 76 69 65 6c 20 4c 61 6e 67 65 77 65 69 6c 65 20 68 61 73 74 2c 20 64 61 6e 6e 20 6b 61 6e 6e 73 74 20 64 75 20 61 75 63 68 20 67 6c 65 69 63 68 20 7a 75 20 6d 69 72 20 6b 6f 6d 6d 65 6e 20 75 6e 64 20 61 62 77 61 73 63 68 65 6e 2e

:D
SBond
Beiträge: 266
Registriert: 22.05.2013 20:35

Re: Gadgets ohne Callback färben

Beitrag 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
41 6c 73 6f 20 77 65 6e 6e 20 64 75 20 73 6f 20 76 69 65 6c 20 4c 61 6e 67 65 77 65 69 6c 65 20 68 61 73 74 2c 20 64 61 6e 6e 20 6b 61 6e 6e 73 74 20 64 75 20 61 75 63 68 20 67 6c 65 69 63 68 20 7a 75 20 6d 69 72 20 6b 6f 6d 6d 65 6e 20 75 6e 64 20 61 62 77 61 73 63 68 65 6e 2e

:D
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Gadgets ohne Callback färben

Beitrag von RSBasic »

Code: Alles auswählen

Callback = SetWindowLongPtr_(GadgetID(1), #GWL_WNDPROC, @Callback1())
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
SBond
Beiträge: 266
Registriert: 22.05.2013 20:35

Re: Gadgets ohne Callback färben

Beitrag von SBond »

ahh... ich verstehe.

vielen vielen Dank. Funktioniert wie immer Prima.
41 6c 73 6f 20 77 65 6e 6e 20 64 75 20 73 6f 20 76 69 65 6c 20 4c 61 6e 67 65 77 65 69 6c 65 20 68 61 73 74 2c 20 64 61 6e 6e 20 6b 61 6e 6e 73 74 20 64 75 20 61 75 63 68 20 67 6c 65 69 63 68 20 7a 75 20 6d 69 72 20 6b 6f 6d 6d 65 6e 20 75 6e 64 20 61 62 77 61 73 63 68 65 6e 2e

:D
Antworten