Here's a technique that lets you draw anything alphablended to a transparent canvasgadget. A lot of the code is boilerplate, so it really isn't too much work to customize it for a specific purpose. It only works on windows, so if you aren't on windows I just did a lot of work for nothing
Code: Select all
Prototype AlphaBlend(hdcDest,DestX,DestY,DestW,DestH,hdcSrc,SrcX,SrcY,SrcW,SrcH,BLENDFUNCTION)
msimg32 = OpenLibrary(#PB_Any, "msimg32.dll")
Global AlphaBlend_.AlphaBlend = GetFunction(msimg32, "AlphaBlend")
Global hBkgndBrush
Global MyCanvasOutput = CreateImage(#PB_Any, 120,40,32,#PB_Image_Transparent)
Procedure PreMultiply(image)
StartDrawing(ImageOutput(image))
DrawingMode(#PB_2DDrawing_AllChannels)
For j=0 To ImageHeight(image)-1
For i=0 To ImageWidth(image)-1
color = Point(i,j)
Plot(i,j, RGBA(Red(color) & $FF * Alpha(color) & $FF / $FF,
Green(color) & $FF * Alpha(color) & $FF / $FF,
Blue(color) & $FF * Alpha(color) & $FF / $FF,
Alpha(color)))
Next
Next
StopDrawing()
EndProcedure
Procedure canvasproc(hwnd, msg, wparam, lparam)
oldproc = GetProp_(hwnd, "oldproc")
Select msg
Case #WM_NCDESTROY
RemoveProp_(hwnd, "oldproc")
Case #WM_ERASEBKGND
hdc = wparam
GrabImage(0,1,GadgetX(0),GadgetY(0),GadgetWidth(0),GadgetHeight(0))
hBrush = CreatePatternBrush_(ImageID(1))
hPen = GetStockObject_(#NULL_PEN)
SelectObject_(hdc, hBrush )
SelectObject_(hdc, hPen)
Rectangle_(hdc,0,0,121,41)
DeleteObject_(hBrush)
ProcedureReturn #True
Case #WM_PAINT
BeginPaint_(hwnd, ps.PAINTSTRUCT)
hdcDest = ps\hdc
hdcSrc = StartDrawing(ImageOutput(MyCanvasOutput))
result=AlphaBlend_(hdcDest,0,0,ImageWidth(MyCanvasOutput),ImageHeight(MyCanvasOutput),hdcSrc,0,0,ImageWidth(MyCanvasOutput),ImageHeight(MyCanvasOutput),$1FF0000)
StopDrawing()
EndPaint_(hwnd, hdcDest)
ProcedureReturn #False
EndSelect
ProcedureReturn CallWindowProc_(oldproc, hwnd, msg, wparam, lparam)
EndProcedure
OpenWindow(0,0,0,320,240,"",#PB_Window_ScreenCentered|#PB_Window_SystemMenu)
CreateImage(0, 320,240)
StartDrawing(ImageOutput(0))
DrawingMode(#PB_2DDrawing_Gradient)
GradientColor(0.0, #Blue)
GradientColor(1.0, #White)
LinearGradient(0,0,0,240)
Box(0,0,320,240)
StopDrawing()
hBkgndBrush = CreatePatternBrush_(ImageID(0))
SetClassLong_(WindowID(0), #GCL_HBRBACKGROUND, hBkgndBrush)
InvalidateRect_(WindowID(0),0,1)
CanvasGadget(0,100,100,120,40)
SetProp_(GadgetID(0), "oldproc", SetWindowLongPtr_(GadgetID(0), #GWL_WNDPROC, @canvasproc()))
StartDrawing(ImageOutput(MyCanvasOutput))
DrawingMode(#PB_2DDrawing_AllChannels|#PB_2DDrawing_Outlined)
Box(3,3,106,30,RGBA(255,0,0,255))
DrawingMode(#PB_2DDrawing_AlphaBlend|#PB_2DDrawing_Transparent)
DrawText(8,9,"Veni, Vidi, Vici.", RGBA(255,0,0,255))
StopDrawing()
PreMultiply(MyCanvasOutput)
Repeat:Until WaitWindowEvent() = #PB_Event_CloseWindow
If IsLibrary(msimg32)
CloseLibrary(msimg32)
EndIf