Imagegadget zum 4. mit Farbverlauf bei Schrift statt schwarz

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
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

Imagegadget zum 4. mit Farbverlauf bei Schrift statt schwarz

Beitrag von hjbremer »

Hier mal eine sinnvolle überflüssige Routine mit der man farbige Schrift mit Farbverlauf darstellen kann. Gab es bestimmt schon mal, aber sicher nicht so.

bitte beachten. Buttons und Images sollten per Enumeration als Konstanten definiert werden. Sonst gibt es wie so oft Probleme mit CreateImage().

Die Structure Farbverlaufwerte muß nicht an die Buttonfunktion übergeben werden. siehe Code.

Wer kann mir Billys Geheimnis verraten. Wie kommt man auf $AACC0020 für den ROP Code. Vor allem AA am Anfang. CC0020 ist #SRCCOPY. ROP4 Macro ist mir bekannt.

Code: Alles auswählen

Declare myFarbverlaufButton(pbnr,sp,ze,br,hh,txt$,*fvb=0)
Declare myFarbverlaufButtonState(nr)

Declare Api_Farbverlauf(dc,br,hh,farbe0,farbe1,flag=1)

Enumeration 
  #textur_img 
  #masken_img  
  #image1
  #but1
  #but2
  #but3
  #but4
  #but5
  #dummy1
  #dummy2
EndEnumeration

Structure Farbverlaufwerte
 fontid.l
 hgbitmap.l
 color1txt.l
 color2txt.l
 color1but.l
 color2but.l
 rahmenanz.l
EndStructure 

UseJPEGImageDecoder() 
imageID1 = LoadImage(#image1, "C:\WINDOWS\Web\Wallpaper\düne.jpg")
fontID1 = LoadFont(0, "Arial", 12,#PB_Font_Bold)
fontID2 = LoadFont(1, "Times", 20,#PB_Font_Bold)

hwnd= OpenWindow(0, 0, 0, 640, 480, "ImageGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) 
      CreateGadgetList(hwnd) 
        
      fv.Farbverlaufwerte
      fv\fontid=fontid1
      myFarbverlaufButton(#but1,10,20,210,40,"Hallo, Güßen Morgen",fv)
      myFarbverlaufButton(#but2,10,70,210,40,"Bitte drücken",fv)
      myFarbverlaufButton(#but3,10,120,210,40,"Guten Tag")
      myFarbverlaufButton(#but4,10,170,210,40,"ich habe von nix keine Ahnung und davon eine ganze Menge")

      fv\hgbitmap=imageid1
      fv\color1txt=#Red
      fv\color2txt=#Yellow
      fv\fontid=fontid2
      fv\rahmenanz=3
      myFarbverlaufButton(#but5,250,20,110,130,"immer noch keine Ahnung",fv)
      
      ;=======================================
  
Repeat 
   event=WaitWindowEvent() 
   
    If Event = #PB_Event_Gadget Or EventID = #PB_Event_Menu 
          
            welcherButton=EventGadget()            
            
            Select welcherButton                      
            
                  Case #but1
                    myFarbverlaufButtonState(welcherButton)
                  
                  Case #but2  
                    myFarbverlaufButtonState(welcherButton)
                  
                  Case #but3 
                    myFarbverlaufButtonState(welcherButton)
                  
                  Case #but4
                    myFarbverlaufButtonState(welcherButton)
                  
                  Case #but5
                    myFarbverlaufButtonState(welcherButton)
                  
            EndSelect
            
    EndIf
      
Until event = #PB_Event_CloseWindow 

End

Procedure myFarbverlaufButton(pbnr,sp,ze,br,hh,txt$,*fvb.FarbverlaufWerte)

;Vorgaben
fontid    = GetStockObject_(#ANSI_VAR_FONT)
hgbitmap  = 0
color1txt = #Green ;~#blue
color2txt = #Blue  ;~#green 
color1but = #White
color2but = #Gray
rahmenanz = 0      ;-1 = kein Rahmen

If *fvb ;Abfrage, falls nicht übergeben
 If *fvb\fontid:       fontid = *fvb\fontid:    EndIf
 If *fvb\hgbitmap:   hgbitmap = *fvb\hgbitmap:  EndIf
 If *fvb\color1txt: color1txt = *fvb\color1txt: EndIf
 If *fvb\color2txt: color2txt = *fvb\color2txt: EndIf
 If *fvb\color1but: color1but = *fvb\color1but: EndIf
 If *fvb\color2but: color2but = *fvb\color2but: EndIf
 If *fvb\rahmenanz: rahmenanz = *fvb\rahmenanz: EndIf
EndIf

  ;=======================================

  ;Maske und Target(Ziel) müssen gleiche br + hh haben
  
  maskenID = CreateImage(#masken_img, br, hh,1) 
        dc = StartDrawing(ImageOutput(#masken_img)) 
                          
               ;Textfont
               SelectObject_(dc,fontID)            ;oder DrawingFont(fontid)
              
               ;Text
               SetBkMode_(dc,#TRANSPARENT)          ;oder DrawingMode()
               SetTextColor_(dc,#White)             ;#white = ganz wichtig               
               
               SetTextAlign_(dc,#TA_TOP)            ;ohne geht es nicht
               SetRect_(r.RECT,0,0,br,hh)           ;Basiswerte für rect; left,top,right,bottom
              
               ;berechne via Api die Größe von r.rect für den Text !!!
               DrawText_(dc,txt$,-1,r,#DT_CALCRECT|#DT_WORDBREAK)  
              
               ;zeichne Text
               DrawText_(dc,txt$,-1,r,#DT_CENTER|#DT_WORDBREAK)
           
             StopDrawing() 
  
  ;nur zur Demo wie Maske aussieht
  ;ImageGadget(#dummy1, 400, 10, 0, 0, maskenID) 
  
  ;=======================================
  
  ;Source(Quelle) braucht nur so groß sein wie der Text
  
  sourcebr = r\right    ;r wird bei Maske berechnet
  sourcehh = r\bottom

  sourceID = CreateImage(#textur_img, sourcebr, sourcehh) 
        dc = StartDrawing(ImageOutput(#textur_img)) 
               Api_Farbverlauf(dc,sourcebr,sourcehh,color1txt,color2txt)
               ;oder
               ;ein Image, Pattern etc
             StopDrawing()   
  
  ;nur zur Demo wie Source aussieht
  ;ImageGadget(#dummy2, 400, 310, 0, 0, sourceID) 
  
  ;=======================================
  
  ;Target(Ziel)
  
  maskbltflag=$AACC0020    ;Billys Geheimnis, http://support.microsoft.com/kb/89375/de
  
  txtsp=(br-r\right)/2     ;sp+ze um Text in die Mitte zu setzen
  txtze=(hh-r\bottom)/2
  
  target_img=pbnr
  
  targetID = CreateImage(target_img, br, hh) 
  targetDC = StartDrawing(ImageOutput(target_img)) 
              
               If hgbitmap
                 DrawImage(hgbitmap,0,0,br,hh)
               Else
                 Api_Farbverlauf(targetDC,br,hh,color1but,color2but)
               EndIf
  
               ;wir müssen eine Kopie anlegen, dieses dc dient als Source für MaskBlt
               dc = CreateCompatibleDC_(targetDC)   
               ;füllen Kopie mit Bild von source, also dem Farbverlauf oder was auch immer
               SelectObject_(dc, sourceID)          
               
               MaskBlt_(targetDC, txtsp, txtze, br, hh, dc, 0, 0, maskenID, 0, 0, maskbltflag) 
               
               ;Rahmen, nur damit es besser aussieht, j=Rahmenstärke 
               For j=0 To rahmenanz
                SetRect_(r.RECT,j,j,br-j,hh-j)    
                DrawEdge_(targetDC,r,#EDGE_BUMP,#BF_RECT)
               Next
                
               ;Kopie löschen 
               DeleteDC_(dc)  
             
             StopDrawing() 
  
  ImageGadget(pbnr, sp, ze, 0, 0, targetID) 

EndProcedure

Procedure myFarbverlaufButtonState(button)

Static Dim but(0)
Static buttonmax

    ;Feld anpassen
    If button > buttonmax
       buttonmax=button
       ReDim but(button)
    EndIf
    
    ;letztes Image wiederherstellen
    For j=0 To buttonmax
        If but(j)             
           SetGadgetState(j,but(j)) 
           but(j)=0         
        EndIf
    Next
    
    id=GetGadgetState(button)
    dc=GetWindowDC_(GadgetID(button))
    GetBoundsRect_(dc,r.rect,0)
    DrawEdge_(dc,r,#EDGE_SUNKEN	,#BF_RECT)
    SetRect_(r,2,2,r\right-2,r\bottom-2)
    DrawEdge_(dc,r,#EDGE_BUMP	,#BF_RECT)
    SetRect_(r,2,2,r\right-2,r\bottom-2)
    InvertRect_(dc,r) ;wers nicht invertiert will: ; vorsetzen
    DeleteDC_(dc)
    
    but(button)=id
              
EndProcedure

Procedure Api_Farbverlauf(dc,br,hh,farbe0,farbe1,flag=1)

 ;http://msdn2.microsoft.com/en-us/library/ms532338(VS.85).aspx
 
 ;flag=0 = #GRADIENT_FILL_RECT_H          
 ;flag=1 = #GRADIENT_FILL_RECT_V          
                             
  ;da RGB Farben 24 Bit Werte sind und 
  ;laut MSDN 16 Bit Werte gebraucht werden
  ;muß jeder Wert um 8 Bit verschoben werden, darum << 8  
  
  Dim t_vertex.TRIVERTEX(1) 
  
  ;t_vertex(0)\x + y ist eh immer null
  
  t_vertex(0)\Red   = Red(farbe0)  <<8
  t_vertex(0)\Green = Green(farbe0)<<8
  t_vertex(0)\Blue  = Blue(farbe0) <<8 
  t_vertex(1)\x     = br 
  t_vertex(1)\y     = hh 
  t_vertex(1)\Red   = Red(farbe1)  <<8 
  t_vertex(1)\Green = Green(farbe1)<<8 
  t_vertex(1)\Blue  = Blue(farbe1) <<8 

  g_rect.GRADIENT_RECT 
  g_rect\UpperLeft  = 0 
  g_rect\LowerRight = 1
  
  Gradientfill_(dc, @t_vertex(), 2, @g_rect, 1, flag) 

EndProcedure
PS: Die DummyKonstanten werden nur für die Demogadgets gebraucht, können also entfernt werden
Purebasic 5.70 x86 5.72 X 64 - Windows 10

Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer