Voilà un code avec une image
Il faut faire varier la constante #alpha entre 0 et 255
C'est pas du plus rapide, ça demande à être optimisé, c'est bien ce que tu cherches à faire ?
L'image est ici pour le test, donc modifier le chemin dans le code en datasection
Code : Tout sélectionner
; Auteur : Denis
; Version de PB : 4.40
;
; Explication du programme :
; application de la transparence à un containergadget
EnableExplicit
UseJPEGImageDecoder()
Global CouleurContainer, CouleurFenetre, NouvelleCouleurContainer
Global RougeAfficher, VertAfficher, BleuAfficher
Global brush1, Event
#alpha = 128
Global NewMap ContainerGadgetTransparent.l()
Procedure ContainerGadgetCallBack(hwnd, uMsg, wParam, lParam)
Protected ps.PAINTSTRUCT
Protected hDC, imageDC
Protected hdcMem
Protected hBmpTampon
Protected SavedDC
Protected brush
Protected x, y
Protected GadgetX, GadgetY, X_max, Y_Max
If uMsg = #WM_PAINT
Select hwnd
Case GadgetID(1)
If IsImage(0)
hDC = BeginPaint_(hwnd, @ps.PAINTSTRUCT)
If hDC
hdcMem = CreateCompatibleDC_(hDC)
hBmpTampon = CreateCompatibleBitmap_(hDC, ps\rcPaint\right, ps\rcPaint\bottom)
If hBmpTampon
If hdcMem
SavedDC = SaveDC_(hDC)
SelectObject_(hdcMem, hBmpTampon)
CouleurContainer = GetGadgetColor(1, #PB_Gadget_BackColor)
If CouleurContainer = -1
;// la couleur d'origine de la fenêtre
CouleurContainer = GetSysColor_(#COLOR_WINDOW)
EndIf
;// le container se trouve à la position x=50 et y = 50 sur la fenêtre
imageDC = StartDrawing(ImageOutput(0))
If imageDC
;// on copie point par point la zone de imageDC qui est recouverte par
;// le container, en faisant le mélange des couleur pour transparence
;// l'opération est faite sur le dc temporaire pour éviter le scintillement
GadgetX = GadgetX(1)
GadgetY = GadgetY(1)
X_max = GadgetWidth(1) + gadgetX - 1
Y_max = GadgetHeight(1) + GadgetY - 1
For x = GadgetX To X_max
For y = gadgetY To Y_max
;// on retrouve la couleur du point courant de l'image ou le container est superposé
CouleurFenetre = GetPixel_(imageDC, x, y)
;// on mélange chaque composante pour chaque pixel
RougeAfficher = (Red(CouleurContainer) * #alpha / 255) + Red(CouleurFenetre) * (255 - #alpha) / 255
VertAfficher = (Green(CouleurContainer) * #alpha / 255) + Green(CouleurFenetre) * (255 - #alpha) / 255
BleuAfficher = (Blue(CouleurContainer) * #alpha / 255) + Blue(CouleurFenetre) * (255 - #alpha) / 255
NouvelleCouleurContainer = RGB(RougeAfficher, VertAfficher, BleuAfficher)
;// on copie le point sur le dc temporaire
SetPixel_(hdcMem, x-GadgetX, y-GadgetY, NouvelleCouleurContainer)
Next y
Next x
StopDrawing()
EndIf
;// on copie le hDC de la mémoire vers celui du container
BitBlt_(hDC, ps\rcPaint\left, ps\rcPaint\top, ps\rcPaint\right, ps\rcPaint\bottom, hdcMem, ps\rcPaint\left, ps\rcPaint\top, #SRCCOPY)
DeleteDC_(hdcMem)
EndIf
DeleteObject_(hBmpTampon)
EndIf
RestoreDC_(hDC, SavedDC)
EndPaint_(hWnd, ps)
ProcedureReturn 0
EndIf
EndIf
EndSelect
ProcedureReturn 0
EndIf
ProcedureReturn CallWindowProc_(ContainerGadgetTransparent(Str(hwnd)), hwnd, uMsg, wParam, lParam)
EndProcedure
Procedure SetContainerGadgetTransparent(Gadget)
ContainerGadgetTransparent(Str(GadgetID(Gadget))) = SetWindowLongPtr_(GadgetID(Gadget), #GWLP_WNDPROC, @ContainerGadgetCallBack())
EndProcedure
; Création de la fenêtre et de la GadgetList
If OpenWindow(0, 0, 0, 450, 335, "Test", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget) = 0
End
EndIf
If CatchImage(0, ?img)
brush1 = CreatePatternBrush_(ImageID(0))
If brush1
SetClassLong_(WindowID(0),#GCL_HBRBACKGROUND, brush1)
EndIf
Else
End
EndIf
ContainerGadget(1, 50, 50, 200, 200, #PB_Container_BorderLess)
ButtonGadget(5, 10, 10, 64, 32, "Test")
TextGadget(6, 50, 50, 64, 16, "Texte")
CloseGadgetList()
SetContainerGadgetTransparent(1)
Repeat
Event = WaitWindowEvent()
Select Event
Case #PB_Event_Menu
Select EventMenu() ; Menus
EndSelect
Case #PB_Event_Gadget
Select EventGadget() ; Gadgets
EndSelect
EndSelect
Until Event = #PB_Event_CloseWindow
If brush1
DeleteObject_(brush1)
EndIf
DataSection
Img:
IncludeBinary("K:\Images\new_image111.jpg")
EndDataSection