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? :roll:

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

Code: Alles auswählen

GadgetID(#tx_test)
Hier ist es glaube ich sinnvoller den Rückgabewert der Gadgetfunktion zu benutzen oder? Bei So vielen

Code: Alles auswählen

GadgetID()
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 :wink: [/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 :freak:

@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 :wink:

MfG Nico