Fontfarbe eines Textgadget ändern

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
nicolaus
Moderator
Beiträge: 1175
Registriert: 11.09.2004 13:09
Kontaktdaten:

Fontfarbe eines Textgadget ändern

Beitrag 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
Benutzeravatar
Falko
Admin
Beiträge: 3535
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

Beitrag 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
Bild
Win11 Pro 64-Bit, PB_6.11b1
Benutzeravatar
nicolaus
Moderator
Beiträge: 1175
Registriert: 11.09.2004 13:09
Kontaktdaten:

Beitrag 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
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Beitrag 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)
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
sbehrens
Beiträge: 274
Registriert: 08.09.2004 18:41
Kontaktdaten:

Beitrag 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
enjoy life... while you can!
Benutzeravatar
Falko
Admin
Beiträge: 3535
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

Beitrag 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]
Zuletzt geändert von Falko am 23.10.2004 11:06, insgesamt 1-mal geändert.
Bild
Win11 Pro 64-Bit, PB_6.11b1
Benutzeravatar
Andre
PureBasic Team
Beiträge: 1767
Registriert: 11.09.2004 16:35
Computerausstattung: MacBook Core2Duo mit MacOS 10.6.8
Lenovo Y50 i7 mit Windows 10
Wohnort: Saxony / Deutscheinsiedel
Kontaktdaten:

Beitrag 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...
Bye,
...André
(PureBasicTeam::Docs - PureArea.net | Bestellen:: PureBasic | PureVisionXP)
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Beitrag 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.
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Benutzeravatar
Andre
PureBasic Team
Beiträge: 1767
Registriert: 11.09.2004 16:35
Computerausstattung: MacBook Core2Duo mit MacOS 10.6.8
Lenovo Y50 i7 mit Windows 10
Wohnort: Saxony / Deutscheinsiedel
Kontaktdaten:

Beitrag 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.
Bye,
...André
(PureBasicTeam::Docs - PureArea.net | Bestellen:: PureBasic | PureVisionXP)
Benutzeravatar
nicolaus
Moderator
Beiträge: 1175
Registriert: 11.09.2004 13:09
Kontaktdaten:

Beitrag 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
Antworten