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