Seite 1 von 1
Fontfarbe eines Textgadget ändern
Verfasst: 22.10.2004 11:22
von nicolaus
ich versucher gerade wärend der laufzeit eines programmes bei einem bestimmten event die fontfarbe eines textgadgets zu ändern doch geht das irgendwie nich.
ich versuche das so:
Code: Alles auswählen
TB_Static_Color = CreateSolidBrush_(RGB(140,140,140))
Procedure WinCallback(hWnd,Msg,wParam,lParam)
Result=#PB_ProcessPureBasicEvents
Select Msg
Case #WM_CTLCOLORSTATIC
If lParam = GadgetID(#tx_tb_power)
SetBkMode_(wParam,#TRANSPARENT)
If tb_power = 1
SetTextColor_(wParam,RGB(0,0,150))
Result=TB_Static_Color
ElseIf tb_power = 0
SetTextColor_(wParam,RGB(0,150,0))
Result=TB_Static_Color
EndIf
EndIf ;}
EndSelect
ProcedureReturn Result
EndProcedure
wenn tb_power = 1 ist soll halt die fontfarbe geändert werden und wenn tb_power = 0 ist wieder auf die alte farbe geändert werden doch funktioniert das so nicht. Was mache ich hier denn falsch?
danke euch schon mal
Verfasst: 22.10.2004 17:05
von Falko
Hast du noch ein bisschen mehr Source zu dieser Callbackprocedure? Kleines Beispiel, wie deine Repeatschleife im Windows etc. aussehen sollte?
Gruß Falko
Verfasst: 22.10.2004 18:25
von nicolaus
ok hier mal ein komplettes beispiel. es soll wenn die maus über einem button ist die fontfarbe des textgadgets geändert werde (was in dem beispiel hier aber nich geht).
Code: Alles auswählen
Enumeration
#container
#btn_test
#tx_test
EndEnumeration
Enumeration
#wnd_main
EndEnumeration
Global tb_power.l
Global TB_Static_Color.l
Global stc_bk_color.l
TB_Static_Color = CreateSolidBrush_(RGB(140,140,140))
stc_bk_color = CreateSolidBrush_(RGB(255,255,213))
Procedure WinCallback(hWnd,Msg,wParam,lParam)
Result=#PB_ProcessPureBasicEvents
Select Msg
Case #WM_CTLCOLORSTATIC
If lParam = GadgetID(#tx_test)
SetBkMode_(wParam,#TRANSPARENT)
If tb_power = 1
SetTextColor_(wParam,RGB(0,0,150))
Result=TB_Static_Color
ElseIf tb_power = 0
SetTextColor_(wParam,RGB(0,200,0))
Result=TB_Static_Color
EndIf
EndIf ;}
EndSelect
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
Procedure Open_wnd_main()
tb_img_btn_customer = LoadImage(#PB_Any,"gfx\power.bmp")
If OpenWindow(#wnd_main,0,0,100,(GetSystemMetrics_(#SM_CYMAXIMIZED)/2),#PB_Window_SystemMenu,"",WindowID(#wnd_main))
CreateGadgetList(WindowID(#wnd_main))
tool_con = ContainerGadget(#container,0,0,WindowWidth(),WindowHeight(),#PB_Container_Single)
ButtonGadget(#btn_test,WindowWidth() / 2 - 16,10,32,32,"test")
TextGadget(#tx_test,WindowWidth() / 2 - 12,45,30,15,"test")
SetWinBackgroundColor(tool_con,RGB($8C,$8C,$8C))
EndIf
EndProcedure
Open_wnd_main()
SetWindowCallback(@WinCallback())
Repeat
If IsMouseOverGadget(#btn_test) = #True
tb_power = 1
ElseIf IsMouseOverGadget(#btn_test) = #False
tb_power = 0
EndIf
Event = WaitWindowEvent()
Until Event = #PB_Event_CloseWindow
End
Verfasst: 22.10.2004 19:46
von Danilo
nicolaus hat geschrieben:Code: Alles auswählen
Procedure Open_wnd_main()
tb_img_btn_customer = LoadImage(#PB_Any,"gfx\power.bmp")
If OpenWindow(#wnd_main,0,0,100,(GetSystemMetrics_(#SM_CYMAXIMIZED)/2),#PB_Window_SystemMenu,"",WindowID(#wnd_main))
CreateGadgetList(WindowID(#wnd_main))
tool_con = ContainerGadget(#container,0,0,WindowWidth(),WindowHeight(),#PB_Container_Single)
ButtonGadget(#btn_test,WindowWidth() / 2 - 16,10,32,32,"test")
TextGadget(#tx_test,WindowWidth() / 2 - 12,45,30,15,"test")
SetWinBackgroundColor(tool_con,RGB($8C,$8C,$8C))
EndIf
EndProcedure
Der letzte Parameter bei OpenWindow ist hier nicht richtig.
Das Fenster gibt es zu diesem Zeitpunkt noch nicht. Aber
es bringt auch nichts das eigene Fenster dem eigenen Fenster
zuzuordnen, wenn Du weißt was ich meine.
Dein eigentliches Problem: Du setzt hier zwar die Variable
um die Farbe zu ändern, aber Du mußt das Gadget auch neu
zeichnen lassen, damit es die neue Farbe benutzt.
Ändere einfach die Hauptschleife:
Code: Alles auswählen
Repeat
If IsMouseOverGadget(#btn_test)
If tb_power=0
tb_power = 1
InvalidateRect_(GadgetID(#tx_test),0,1)
UpdateWindow_(GadgetID(#tx_test))
EndIf
Else
If tb_power=1
tb_power = 0
InvalidateRect_(GadgetID(#tx_test),0,1)
UpdateWindow_(GadgetID(#tx_test))
EndIf
EndIf
Event = WaitWindowEvent()
Until Event = #PB_Event_CloseWindow
End
Und am Ende des Programmes nicht vergessen die 2 Pinsel
zu löschen:
Code: Alles auswählen
DeleteObject_(TB_Static_Color)
DeleteObject_(stc_bk_color)
Verfasst: 22.10.2004 21:45
von sbehrens
Hier ist es glaube ich sinnvoller den Rückgabewert der Gadgetfunktion zu benutzen oder? Bei So vielen
Ist es mit einer Variable schneller, ist das korrekt?
mfG
Basti
Verfasst: 22.10.2004 22:47
von Falko
Am besten das WaitWindowEvent() am Anfang. Habe Danilos Tip in dein Prog geändert. Geht doch Prima, so.
Code: Alles auswählen
Enumeration
#container
#btn_test
#tx_test
EndEnumeration
Enumeration
#wnd_main
EndEnumeration
Global tb_power.l
Global TB_Static_Color.l
Global stc_bk_color.l
TB_Static_Color = CreateSolidBrush_(RGB(140,140,140))
stc_bk_color = CreateSolidBrush_(RGB(255,255,213))
Procedure WinCallback(hWnd,Msg,wParam,lParam)
Result=#PB_ProcessPureBasicEvents
Select Msg
Case #WM_CTLCOLORSTATIC
If lParam = GadgetID(#tx_test)
SetBkMode_(wParam,#TRANSPARENT)
If tb_power = 1
SetTextColor_(wParam,RGB(0,0,150))
Result=TB_Static_Color
ElseIf tb_power = 0
SetTextColor_(wParam,RGB(0,200,0))
Result=TB_Static_Color
EndIf
EndIf ;}
EndSelect
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
Procedure Open_wnd_main()
tb_img_btn_customer = LoadImage(#PB_Any,"gfx\power.bmp")
If OpenWindow(#wnd_main,0,0,100,(GetSystemMetrics_(#SM_CYMAXIMIZED)/2),#PB_Window_SystemMenu,"",WindowID())
CreateGadgetList(WindowID(#wnd_main))
tool_con = ContainerGadget(#container,0,0,WindowWidth(),WindowHeight(),#PB_Container_Single)
ButtonGadget(#btn_test,WindowWidth() / 2 - 16,10,32,32,"test")
TextGadget(#tx_test,WindowWidth() / 2 - 12,65,30,15,"test")
SetWinBackgroundColor(tool_con,RGB($8C,$8C,$8C))
EndIf
EndProcedure
Open_wnd_main()
SetWindowCallback(@WinCallback())
Repeat
Event = WaitWindowEvent()
If IsMouseOverGadget(#btn_test)
If tb_power=0
tb_power = 1
InvalidateRect_(GadgetID(#tx_test),0,1)
UpdateWindow_(GadgetID(#tx_test))
EndIf
Else
If tb_power=1
tb_power = 0
InvalidateRect_(GadgetID(#tx_test),0,1)
UpdateWindow_(GadgetID(#tx_test))
EndIf
EndIf
Until Event = #PB_Event_CloseWindow
DeleteObject_(TB_Static_Color)
DeleteObject_(stc_bk_color)
End
[Edit] Habe das TextGadget noch etwas tiefer gesetzt

[/Edit]
Verfasst: 23.10.2004 03:53
von Andre
@Falko: das zusammengestellte Beispiel läuft zwar sehr gut, aber die Genauigkeit der Mausabfrage stimmt noch nicht ganz. Bei mir jedenfalls scheint nicht die Mausspitze die Textfarbe zu beeinflussen, sondern wenn ich mich mit dem ganzen Mauspfeil über das Textgadget bewege. Also so in etwa, als wäre der "Hot Spot" in der Mitte des Mauspfeils...
Verfasst: 23.10.2004 07:39
von Danilo
Andre hat geschrieben:Bei mir jedenfalls scheint nicht die Mausspitze die Textfarbe zu
beeinflussen, sondern wenn ich mich mit dem ganzen Mauspfeil
über das Textgadget bewege.
Also so in etwa, als wäre der "Hot Spot" in der Mitte des Mauspfeils...
Zufälligerweise ist auch der Button zur Auswahl da, d.h. wenn
Du den Mauspfeil über den Button bewegst ändert sich das
TextGadget. Siehe Source.
Verfasst: 23.10.2004 16:34
von Andre
Danilo hat geschrieben:
Zufälligerweise ist auch der Button zur Auswahl da, d.h. wenn
Du den Mauspfeil über den Button bewegst ändert sich das
TextGadget. Siehe Source.
Alles klar, es war wohl um die Zeit zu spät....
Beim Bewegen des Mauspfeils über das ButtonGadget ändert sich das TextGadget. Ich hatte nur den Sinn anders verstanden gehabt und angenommen, dass sich wie z.B. bei einem Link die Farbe des Textgadget ändert, wenn die Maus darüber steht.
Verfasst: 23.10.2004 17:32
von nicolaus
Ich danke euch erst mal allen die mir geholfen haben und nun wo ich die lösung sehe frag ich mich warum ich da nich selber drauf gekommen bin wo ich doch lang genug überlegt habe was ich falsch mache
@Danilo
Der letzte Parameter bei OpenWindow ist hier nicht richtig.
Das Fenster gibt es zu diesem Zeitpunkt noch nicht. Aber
es bringt auch nichts das eigene Fenster dem eigenen Fenster
zuzuordnen, wenn Du weißt was ich meine.
Sorry wegen dem letzten parameter hatte das aus dem projrct raus kopiert und nur ein beispiel daraus gemacht und so vergessen den parameter raus zu nehmen
MfG Nico