Seite 1 von 1

Farbverlauf ganz simpel per WindowApi GradientFill

Verfasst: 22.02.2008 16:45
von hjbremer
Meine bisherigen Farbverlauf Routinen waren ja ganz nett, aber irgendwie naja...

Abhilfe schafft Billys Api Gewurschtel.

der Api Befehl GradientFill einmal ganz simpel. Wenn man allerdings die Beschreibung auf MSDN liest und das mit meinem saumäßigen Englisch, da wird einem ja ... naja

Code: Alles auswählen

;von HJBREMER 22.02.2008
;PB 4.1 Windows XP

;Farbverlauf ganz simpel via API

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

;falls ältere PB Version als 4.1 ev. GradientFill_ nicht definiert
;Import "msimg32.lib" 
;  Achtung: kein Unterstrich
;  GradientFill(*DC, *tVertex, VertexAnz.l, *gRect, RectAnz.l, flag.l) 
;EndImport 

Enumeration  
#win0
#img1
#img2
#img3
#butimg1
#butimg2
#butimg3
EndEnumeration

windowstyles = #PB_Window_SystemMenu|1 ;die 1 = zentriert

hwnd=OpenWindow(#win0, 0, 0, 480,400, "",windowstyles) 

     CreateGadgetList(hwnd) 

     br=100
     hh=80
     
     ID=myImage(#img1,br,hh,$FFF2FF,$32B7FF)                         
     ImageGadget(#butimg1,5,5,br,hh,ID)

     ID=myImage(#img2,br,hh,#Gray,#Blue,0)                         
     ImageGadget(#butimg2,5,105,br,hh,ID)

     ID=myImage(#img3,br,hh,#Magenta,#Red)                         
     ImageGadget(#butimg3,110,5,br,hh,ID)

Repeat 
   event=WaitWindowEvent() 
   
    If Event = #PB_Event_Gadget Or EventID = #PB_Event_Menu 
          
            welcherButton=EventGadget()            
            
            Select welcherButton                      
            
                  Case #butimg1: Debug "1" 
                  Case #butimg2: Debug "2" 
                  Case #butimg3: Debug "3" 

            EndSelect
            
    EndIf
      
Until event = #PB_Event_CloseWindow 

End 

Procedure myImage(pbnr,br,hh,fv,fb,flag=1)

imgID = CreateImage(pbnr,br,hh)
   dc = StartDrawing(ImageOutput(pbnr))
              
         Api_Farbverlauf(dc,br,hh,fV,fB,flag)
    
         SetRect_(r.RECT,0,0,br,hh)            ;left,top,right,bottom              
         DrawEdge_(dc,r,#EDGE_BUMP,#BF_RECT)
         
        StopDrawing()

ProcedureReturn imgID

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

Verfasst: 23.02.2008 21:23
von Fluid Byte
Hast du auch ne Frage oder soll das für CTT sein?