[Module] Text mit Farbverlauf als Hintergrund

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
Thorsten1867
Beiträge: 1359
Registriert: 04.02.2005 15:40
Computerausstattung: [Windows 10 x64] [PB V5.7x]
Wohnort: Kaufbeuren
Kontaktdaten:

[Module] Text mit Farbverlauf als Hintergrund

Beitrag von Thorsten1867 »

Nachdem sich "TextControlEx" von ProGUI hartnäckig geweigert hat, meinen Resize bzw. Move - Anweisungen nachzukommen, habe ich mir ein eigenes "Gadget" gebastelt, das als Texthintergrund einen Farbverlauf verwendet und v.a. auf mich hört (sprich: sich nachträglich verschieben lässt). :mrgreen:

Code: Alles auswählen

;/ === GradientTextModule.pbi [PB 5.6x] ===
;/ Text with gradient background  
;/ March 2014 by Thorsten1867

DeclareModule GradientText
  Declare SetBackColor(GadgetID.i, StartColor.i, EndColor.i)
  Declare SetTextColor(GadgetID.i, Color.i)
  Declare SetFont(GadgetID.i, Font.i)
  Declare SetText(GadgetID.i, Text.s)
  Declare Gadget(GadgetID.i, WinID.i, X.i, Y.i, Width.i, Height.i, Text.s, StartColor.i, EndColor.i, Flags.l=#False)
EndDeclareModule

Module GradientText
  
  EnableExplicit
  
  Structure GradientTextStructure
    Text.s
    TextColor.i
    StartColor.i
    EndColor.i
    Font.i
    Flags.l
    Width.i
    Height.i
  EndStructure
  Global NewMap GradTxt.GradientTextStructure()

  Procedure CreateGradientText(GadgetID.i, Width.i, Height.i, Text.s, TextColor.i, StartColor.i, EndColor.i, Font.i=#False, Flags.l=#False)
    Protected ImageID.i, TxtX.f, TxtY.f
    If StartDrawing(CanvasOutput(GadgetID))
        DrawingMode(#PB_2DDrawing_Gradient)
        BackColor(StartColor)
        FrontColor(EndColor)
        LinearGradient(0, 0, Width, Height) 
        Box(0, 0, Width, Height)
        If Flags & #PB_Text_Border
          DrawingMode(#PB_2DDrawing_Outlined)
          Box(0, 0, Width, Height, RGB(180,180,180))
        EndIf
        If Text
          DrawingMode(#PB_2DDrawing_Transparent)
          If Font : DrawingFont(Font) : EndIf
          If Flags & #PB_Text_Center ;{
            TxtX = (Width - TextWidth(Text))/2
          ElseIf Flags & #PB_Text_Right
            TxtX = Width - TextWidth(Text) - 3
          Else
            TxtX = 3
          EndIf
          TxtY = (Height - TextHeight(Text))/2 ;}
          DrawText(TxtX, TxtY, Text, TextColor)
        EndIf 
      StopDrawing()
    EndIf
  EndProcedure  


  Procedure SetBackColor(GadgetID.i, StartColor.i, EndColor.i)
    Protected GId.s = Str(GadgetID)
    CreateGradientText(GadgetID, GradTxt(GId)\Width, GradTxt(GId)\Height, GradTxt(GId)\Text, GradTxt(GId)\TextColor, StartColor, EndColor, GradTxt(GId)\Font, GradTxt(GId)\Flags)
    GradTxt(GId)\StartColor = StartColor
    GradTxt(GId)\EndColor   = EndColor
  EndProcedure

  Procedure SetTextColor(GadgetID.i, Color.i)
    Protected GId.s = Str(GadgetID)
    CreateGradientText(GadgetID, GradTxt(GId)\Width, GradTxt(GId)\Height, GradTxt(GId)\Text, Color, GradTxt(GId)\StartColor, GradTxt(GId)\EndColor, GradTxt(GId)\Font, GradTxt(GId)\Flags)
    GradTxt(GId)\TextColor = Color
  EndProcedure

  Procedure SetFont(GadgetID.i, Font.i)
    Protected GId.s = Str(GadgetID)
    CreateGradientText(GadgetID, GradTxt(GId)\Width, GradTxt(GId)\Height, GradTxt(GId)\Text, GradTxt(GId)\TextColor, GradTxt(GId)\StartColor, GradTxt(GId)\EndColor, Font, GradTxt(GId)\Flags)
    GradTxt(GId)\Font = Font
  EndProcedure

  Procedure SetText(GadgetID.i, Text.s)
    Protected GId.s = Str(GadgetID)
    CreateGradientText(GadgetID, GradTxt(GId)\Width, GradTxt(GId)\Height, Text, GradTxt(GId)\TextColor, GradTxt(GId)\StartColor, GradTxt(GId)\EndColor, GradTxt(GId)\Font, GradTxt(GId)\Flags)
    GradTxt(GId)\Text = Text
  EndProcedure

  Procedure Free(GadgetID.i)
    DeleteMapElement(GradTxt(), Str(GadgetID)) 
  EndProcedure

  Procedure Gadget(GadgetID.i, WinID.i, X.i, Y.i, Width.i, Height.i, Text.s, StartColor.i, EndColor.i, Flags.l=#False)
    Define Result.i, GadgetList.i, GId.s = Str(GadgetID)
    
    If IsWindow(WinID)
      
      GadgetList = UseGadgetList(WindowID(WinID))
      
      Result = CanvasGadget(GadgetID, X, Y, Width, Height)
      If Result
        If GadgetID = #PB_Any : GadgetID = Result : EndIf
        CreateGradientText(GadgetID, Width, Height, Text, RGB($0,$0,$0), StartColor, EndColor, GetGadgetFont(#PB_Default), Flags)
        GradTxt(GId)\Text       = Text
        GradTxt(GId)\TextColor  = RGB($0,$0,$0)
        GradTxt(GId)\StartColor = StartColor
        GradTxt(GId)\EndColor   = EndColor
        GradTxt(GId)\Font       = GetGadgetFont(#PB_Default)
        GradTxt(GId)\Flags      = Flags
        GradTxt(GId)\Width      = Width
        GradTxt(GId)\Height     = Height
      EndIf
      
      UseGadgetList(GadgetList)
      
    EndIf
    
    ProcedureReturn GadgetID
  EndProcedure 
  
EndModule

CompilerIf #PB_Compiler_IsMainFile
  #Text = 1
  #Font = 1
  LoadFont(#Font, "Arial", 10, #PB_Font_Bold)
  If OpenWindow(0, 0, 0, 180, 60, "Example", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
      
      GradientText::Gadget(#Text, 0, 5, 5, 170, 20, "Gradient Background", RGB(10,59,118), RGB(153,180,209), #PB_Text_Center)
      GradientText::SetFont(#Text, FontID(#Font))
      GradientText::SetTextColor(#Text, RGB($FF,$FF,$FF))
      MessageRequester("Test GradientText", "Change Background", #MB_OK)
      GradientText::SetBackColor(#Text, RGB($0,$62,$0), RGB($0,$E8,$0))
      
    Repeat
      Event = WaitWindowEvent()
    Until Event = #PB_Event_CloseWindow
  EndIf
CompilerEndIf
Zuletzt geändert von Thorsten1867 am 06.01.2018 20:24, insgesamt 6-mal geändert.
Download of PureBasic - Module
Download of PureBasic - Programmes

[Windows 11 x64] [PB V6]

Bild
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Text mit Farbverlauf als Hintergrund (Module)

Beitrag von ts-soft »

:allright:

Sehr nützlich!

Hättest Du EnableExplicit genutzt (im Modul), wäre Dir aufgefallen, das in Zeile 89 TextColor genutzt wird,
welches nicht deklariert ist und somit immer den Wert 0 haben wird. Solange schwarzer Text angesagt ist,
wird das ja nichts ausmachen, aber ...

Gruß
Thomas
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Thorsten1867
Beiträge: 1359
Registriert: 04.02.2005 15:40
Computerausstattung: [Windows 10 x64] [PB V5.7x]
Wohnort: Kaufbeuren
Kontaktdaten:

Re: Text mit Farbverlauf als Hintergrund (Module)

Beitrag von Thorsten1867 »

ts-soft hat geschrieben:Hättest Du EnableExplicit genutzt (im Modul), wäre Dir aufgefallen, das in Zeile 89 TextColor genutzt wird,
welches nicht deklariert ist und somit immer den Wert 0 haben wird. Solange schwarzer Text angesagt ist,
wird das ja nichts ausmachen, aber ...
Einmal vergessen und schon rächt es sich .... :wink:

PS: @ts-soft
Der Versuch daraus ein "echtes" Gadget zu basteln ist leider bisher gescheitert. Irgendwie hat der Handle, der neben der ID übergeben werden muss, immer einen Speicherfehler provoziert.
Irgendwie bin ich wohl noch nicht ganz bei den Geheimnissen des Registieren eines Gadgets durchgestiegen. :(
Download of PureBasic - Module
Download of PureBasic - Programmes

[Windows 11 x64] [PB V6]

Bild
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Text mit Farbverlauf als Hintergrund (Module)

Beitrag von ts-soft »

Das mit den echten Gadgets ist sowieso nicht mehr so interessant. Höchstens für UserLibs, aber die
will ja auch keiner, solange keine Sourcen bei sind, zumindest ich nicht. Als Modul braucht man keine
"echte" Gadgets <)
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Antworten