Code: Select all
;Gdiplus 3D Frames
;by einander
;PB 4.20 beta 2 - march 20008
Frame procedure are in the last 40 lines;
;Previous lines are common to many Gdip functions.
;Most of the prototypes (and associated Macros) are unused here,
;but are useful to call more Gdip functions.
;Try angles bigger than sides to see uncommon shapes.
;--------------------------------------
;Start of Include GdipBlackBoxes
Global _Img,_ImGad,_DRAWING,_GDIP,_GRAPH ,_Quit
#GDIP=1
Structure GdipStart
GdiPlusVersion.l
DebugEventCallback.l
SuppressBackgroundThread.l
SuppressExternalCodecs.l
EndStructure
Structure RectF : X.f : Y.f : Wi.f : He.f : EndStructure
;Gdip Prototypes and Macros for each parameter combination; add more if needed
;Pn Code means: 1, 2, 3... number of consecutive integers; (Representing values, pointers, colours...)
;F = one float; FFF = 3 consecutive floats
;U = one p-Unicode
Prototype GdiplusStartup(*a,*b,c=0)
Macro GName : GetFunction(#GDIP,Name) : EndMacro ;- Gname
Prototype P1(A) : Macro M1(Name,A) : GF.P1=GName:GF(A) :EndMacro
Prototype P2(A,b) : Macro M2(Name,A,b) : GF.P2=GName:GF(A,b) :EndMacro
Prototype P3(A,b,c) : Macro M3(Name,A,b,c) : GF.P3=GName:GF(A,b,c) :EndMacro
Prototype P4(A,b,c,d) : Macro M4(Name,A,b,c,d) : GF.P4=GName:GF(A,b,c,d) :EndMacro
Prototype P5(A,b,c,d,E) : Macro M5(Name,A,b,c,d,E) : GF.P5=GName:GF(A,b,c,d,E) :EndMacro
Prototype P6(A,b,c,d,E,F) : Macro M6(Name,A,b,c,d,E,F) : GF.P6=GName:GF(A,b,c,d,E,F) :EndMacro
Prototype P7(A,b,c,d,E,F,G) : Macro M7(Name,A,b,c,d,E,F,G) : GF.P7=GName:GF(A,b,c,d,E,F,G) :EndMacro
Prototype P8(A,b,c,d,E,F,G,H) : Macro M8(Name,A,b,c,d,E,F,G,H) : GF.P8=GName:GF(A,b,c,d,E,F,G,H) :EndMacro
Prototype P9(A,b,c,d,E,F,G,H,i) : Macro M9(Name,A,b,c,d,E,F,G,H,i) : GF.P9=GName:GF(A,b,c,d,E,F,G,H,i) :EndMacro
Prototype P10(A,b,c,d,E,F,G,H,i,j) : Macro M10(Name,A,b,c,d,E,F,G,H,i,j) : GF.P10=GName:GF(A,b,c,d,E,F,G,H,i,j) :EndMacro
Prototype P1F1(A,b.f,c) :Macro M1F1(Name,A,b,c) : GF.P1f1=GName:GF(A,b,c) :EndMacro
Prototype P1FF(A,b.f,c.f) :Macro M1FF(Name,A,b,c) : GF.P1ff=GName:GF(A,b,c) :EndMacro
Prototype P1FF1(A,b.f,c.f,d) : Macro M1FF1(Name,A,b,c,d) : GF.P1ff1=GName:GF(A,b,c,d) :EndMacro
Prototype P1FFFFFF(A,b.f,c.f,d.f,E.f,F.f,G.f) : Macro M1FFFFFF(Name,A,b,c,d,E,F,G) : GF.P1ffffff=GName:GF(A,b,c,d,E,F,G) :EndMacro
Prototype P1F2(A,b.f,c,d) :Macro M1F2(Name,A,b,c,d) : GF.P1f2=GName:GF(A,b,c,d) :EndMacro
Prototype P1F3(A,b.f,c,d,E) :Macro M1F3(Name,A,b,c,d,E) : GF.P1f3=GName:GF(A,b,c,d,E) :EndMacro
Prototype P2F(A,b,c.f) :Macro M2F(Name,A,b,c) : GF.P2F=GName:GF(A,b,c) :EndMacro
Prototype P2FFFF(A,b,c.f,d.f,E.f,F.f) :Macro M2FFFF(Name,A,b,c,d,E,F) : GF.P2FFFF=GName:GF(A,b,c,d,E,F) :EndMacro
Prototype P2FFFFFF(A,b,c.f,d.f,E.f,F.f,G.f,H.f) :Macro M2FFFFFF(Name,A,b,c,d,E,F,G,H) : GF.P2FFFFFF=GName:GF(A,b,c,d,E,F,G,H) :EndMacro
Prototype P2FFFFFFFF4(A,b,c.f,d.f,E.f,F.f,G.f,H.f,i.f,j.f,K,L,M,n) :Macro M2FFFFFFFF4(Name,A,b,c,d,E,F,G,H,i,j,K,L,M,n) : GF.P2FFFFFFFF4=GName:GF(A,b,c,d,E,F,G,H,i,j,K,L,M,n) :EndMacro
Prototype P3F(A,b,c,d.f) :Macro M3F(Name,A,b,c,d) :GF.P3F=GName:GF(A,b,c,d) :EndMacro
Prototype P5FF(A,b,c,d,E,F.f,G.f) :Macro M5FF(Name,A,b,c,d,E,F,G) : GF.P5FF=GName:GF(A,b,c,d,E,F,G) :EndMacro
Prototype P6FF(A,b,c,d,E,F,G.f,H.f) :Macro M6FF(Name,A,b,c,d,E,F,G,H) : GF.P6FF=GName:GF(A,b,c,d,E,F,G,H) :EndMacro
Prototype PU1(A.p-Unicode,b) :Macro MU1(Name,A,b) : GF.Pu1=GName:GF(A,b) :EndMacro
Prototype PU2(A.p-Unicode,b,c) :Macro MU2(Name,A,b,c) : GF.PU2=GName:GF(A,b,c) :EndMacro
Prototype P1U5(A,b.p-Unicode,c,d,E,F,G) :Macro M1U5(Name,A,b,c,d,E,F,G) : GF.P1U5=GName:GF(A,b,c,d,E,F,G) :EndMacro
Prototype P1U7(A,b.p-Unicode,c,d,E,F,G,H,i):Macro M1U7(Name,A,b,c,d,E,F,G,H,i) : GF.P1U7=GName:GF(A,b,c,d,E,F,G,H,i) :EndMacro
Macro GdipDelPen : M1("GdipDeletePen",GpPen) :EndMacro
Macro GdipDelBrush : M1("GdipDeleteBrush",GpBrush):EndMacro
Macro GdipDelPath : M1("GdipDeletePath",GpPath) :EndMacro
Macro GdipDelRegion : M1("GdipDeleteRegion",GpRgn) :EndMacro
Macro RRGB :Random(#White):EndMacro ;- RRGB - get Random color
Macro DrawIMG(IMG) ;- DrawIMG(IMG)
If _DRAWING:StopDrawing():EndIf
_DRAWING=StartDrawing(ImageOutput(IMG))
EndMacro
Macro STOPDRAW ;- StopDraw
If _DRAWING:StopDrawing():_DRAWING=0:EndIf
EndMacro
Macro WaitKey
Repeat
Select WaitWindowEvent()
Case #WM_KEYDOWN : Break
Case #WM_CLOSE
_Quit=#True:Break
EndSelect
ForEver
EndMacro
Procedure ClsImg(IMG,RGB=0) ;-ClsImg(IMG,RGB=0)
DrawIMG(IMG)
Box(0,0,ImageWidth(IMG),ImageHeight(IMG),RGB)
EndProcedure
Procedure.f MinF(A.f,b.f)
If A<b:ProcedureReturn A:EndIf
ProcedureReturn b
EndProcedure
Macro GdipClose ;- GdipClose
If _GDIP
M1("GdipDeleteGraphics",_GRAPH)
M1("GdiplusShutdown",_GDIP)
CloseLibrary(#GDIP)
_GDIP=0
EndIf
EndMacro
Macro GdipInit(Mode=2) ;- GdipInit(Mode) ; Mode 1=Fast,2 =HiRes
GdipClose
If OpenLibrary(#GDIP,"GDIPlus.DLL")
Gdip.GdipStart\GdiPlusVersion=1
Gdip\DebugEventCallback = 0
Gdip\SuppressBackgroundThread = 0
Gdip\SuppressExternalCodecs = 0
GF.GdiplusStartup = GetFunction(#GDIP, "GdiplusStartup") : GF(@_GDIP,@Gdip)
M2("GdipCreateFromHDC",_DRAWING,@_GRAPH)
If Mode=2 : M2("GdipSetSmoothingMode",_GRAPH,Mode) : EndIf
Else
MessageRequester("Error !","GDIPlus.DLL Not found",0)
EndIf
EndMacro
Macro IsGDIP : If _GDIP=0 : GdipInit(2) : EndIf : EndMacro
Macro ARGB(RGB=0,Alpha=255) ;- ARGB((RGB=0,Transp=255)
RGB2ARGB(RGB,Alpha)
EndMacro
Macro RGB2ARGB(RGB,Alpha) ;- RGB2ARGB(RGB,Alpha) - convert RGB to Alpha RGB
Blue(RGB)|Green(RGB)<<8|Red(RGB)<<16|Alpha<<24
EndMacro
Macro GPen(ARGB,LineWidth,StartCap=2,EndCap=2) ;- GPen(ARGB,LineWidth,StartCap=2,EndCap=2)
M1F2("GdipCreatePen1",ARGB,LineWidth,2,@GpPen)
M2("GdipSetPenStartCap",GpPen,StartCap)
M2("GdipSetPenEndCap",GpPen,EndCap)
EndMacro
Procedure RoundedAux(X.f,Y.f,Wi.f,He.f,EllipX.f=0.0,EllipY.f=-1)
; Roundedaux - Private - RET GpPath for RoundFrame, RoundBox, RoundRect
If EllipX=<1:EllipX=1:EndIf ; EllipX, EllipY= Wi, he of ellipse used to draw rounded corners
If EllipY=<1:EllipY=EllipX:EndIf
M2("GdipCreatePath",1, @GpPath)
M1FFFFFF("GdipAddPathArc",GpPath,X,Y,EllipX,EllipY,180.0,90.0) ;left top
M1FFFFFF("GdipAddPathArc",GpPath,X+Wi-EllipX,Y,EllipX,EllipY,270.0,90.0) ;right top
M1FFFFFF("GdipAddPathArc",GpPath,X+Wi-EllipX,Y+He-EllipY,EllipX,EllipY,0.0,90.0) ;right bottom
M1FFFFFF("GdipAddPathArc",GpPath,X,Y+He-EllipY,EllipX,EllipY,90.0,90.0) ;left bottom
M1("GdipClosePathFigure",GpPath)
ProcedureReturn GpPath
EndProcedure
Procedure GdipShadowFrame(X.f,Y.f,Wi.f,He.f,Rim.f,ARGB1,ARGB2,EllipX.f=0,EllipY.f=-1)
IsGDIP
If EllipY=-1:EllipY=EllipX:EndIf
GPen(ARGB1,Rim)
SetRect_(rc.RectF,0,0,Wi,He)
M6("GdipCreateLineBrushFromRect",rc, ARGB1,ARGB2, 2 ,3 , @GpBrush)
GpPath=RoundedAux(X,Y,Wi,He,EllipX,EllipY)
M2("GdipSetPenBrushFill",GpPen,GpBrush)
M3("GdipDrawPath",_GRAPH, GpPen, GpPath)
GdipDelPen:GdipDelBrush:GdipDelPath
EndProcedure
; End of Include GdipBlackBoxes
;------------------------------
Procedure Gdip3DShadowFrame(X,Y,Wi,He,Rim,ARGB,EllipX=0,EllipY=-1)
If EllipX=0 :EllipX=Wi:EndIf
If EllipY=-1: EllipY=He : EndIf
R2.f=Rim/2:R4.f=Rim/4
Shadow=ARGB(0,100)
GdipShadowFrame(X,Y,Wi,He,Rim,Shadow,ARGB,EllipX,EllipY)
GdipShadowFrame(X+R4,Y+R4,Wi-R2,He-R2,Rim,ARGB,Shadow,EllipX-R2,EllipY-R2)
StatusBarText(0,0,"Width :"+Str(Wi)+"--- Height : "+Str(He)+"--- Rim : "+Str(Rim)+"--- EllipX : "+Str(EllipX)+"--- EllipY : "+Str(EllipY)+"--- ARGB= $"+Hex(ARGB) )
EndProcedure
;Test it <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
hwnd=OpenWindow(0, 100, 100,700,500 ,"<SPC> to change frame", #WS_OVERLAPPEDWINDOW | #WS_MAXIMIZE)
CreateGadgetList(hwnd)
Wi=WindowWidth(0):He=WindowHeight(0)
CreateStatusBar(0, hwnd)
AddStatusBarField(Wi)
_ImGad=ImageGadget(-1,0,0,0,0,0)
_Img=CreateImage(-1,Wi,He-20,32)
Xcenter=Wi/2:Ycenter=He/2
Repeat
If GetAsyncKeyState_(#VK_ESCAPE):Break:EndIf
Ev=WaitWindowEvent()
DrawIMG(_Img)
ClsImg(_Img,0)
iWi.f=Random(600)+20
iHe.f=Random(500)+20
Rim.f=MinF(iWi,iHe)/Random(20)+4
AngleX=Random(iWi)
AngleY=Random(iHe)
Gdip3DShadowFrame(Xcenter-iWi/2,Ycenter-iHe/2,iWi,iHe,Rim,ARGB(RRGB,Random(100)+155),AngleX,AngleY)
STOPDRAW
SetGadgetState(_ImGad,ImageID(_Img))
Delay(200)
WaitKey
Until Ev=#WM_CLOSE Or _Quit
GdipClose
End