Fenêtre avec une forme bizarre basée sur une image
Publié : ven. 02/juin/2006 17:58
Salut,
Un petit code pour donner n'importe quel forme à une fenêtre
On dessine une image de la taille de la fenêtre avec en mauve les zones qui seront transparentes.
cette image sera appliqué a la fenêtre.
J'ai une version plus rapide mais elle utilise mes libs, et j'ai pas encore eu le temps de les remettre sur mon site depuis la V4
Donc patience
Un petit code pour donner n'importe quel forme à une fenêtre
On dessine une image de la taille de la fenêtre avec en mauve les zones qui seront transparentes.
cette image sera appliqué a la fenêtre.
Code : Tout sélectionner
; Auteur : Le Soldat Inconnu
; Version de PB : 3.9
;
; Explication du programme :
; Pour dessiner une fenêtre avec une forme dépendant d'une image
Procedure SkinWin(Window, Image)
Protected x, y, Region_Temp, Region_Totale, Largeur, Hauteur
; On applique le skin à la fenêtre
Largeur = ImageWidth(Image) - 1
Hauteur = ImageHeight(Image) - 1
Region_Totale = CreateRectRgn_(0, 0, Largeur + 1, Hauteur + 1) ; on crée une region de la taille de la fenêtre
StartDrawing(ImageOutput(Image))
For X1 = 0 To Largeur
For Y1 = 0 To Hauteur
If Point(X1, Y1) = $FF00FF
Y2 = Y1
While X2 < Largeur And Point(X1, Y2 + 1) = $FF00FF
Y2 + 1
Wend
Region_Temp = CreateRectRgn_(X1, Y1, X1 + 1, Y2 + 1) ; On retire le point de la region
CombineRgn_(Region_Totale, Region_Totale, Region_Temp, #RGN_DIFF)
DeleteObject_(Region_Temp)
Y1 = Y2
EndIf
Next
Next
StopDrawing()
SetWindowRgn_(WindowID(Window), Region_Totale, 1) ; On applique la region
DeleteObject_(Region_Totale) ; On efface la region
EndProcedure
; Création de la fenêtre et de la GadgetList
If OpenWindow(0, 0, 0, 300, 300, "Skin", #PB_Window_BorderLess | #PB_Window_ScreenCentered) = 0 Or CreateGadgetList(WindowID(0)) = 0
End
EndIf
; La fenêtre doit obligatoirement être avec le style #PB_Window_BorderLess
SetWindowColor(0, RGB(255, 0, 0))
; On crée une image qui va servir de skin (elle doit avoir la taille de la fenêtre)
CreateImage(0, 300, 300)
StartDrawing(ImageOutput(0))
; La couleur mauve $FF00FF ou RGB(255, 0, 255) représente la partie transparente de la fenêtre
Box(250, 0, 50, 30, $FF00FF)
Circle(200, 200, 50, $FF00FF)
Circle(250, 230, 50, $FF00FF)
Ellipse(50, 120, 40, 20, $FF00FF)
LineXY(50, 50, 250, 100, $FF00FF)
StopDrawing()
Temps = ElapsedMilliseconds()
; ExtCreateRegion : a voir
SkinWin(0, 0)
Temps = ElapsedMilliseconds() - Temps
; On place un bouton pour quitter
ButtonGadget(0, 0, 0, 100, 25, "Quitter")
; On affichage le temps nécesssaire pour créer le masque
TextGadget(#PB_Any, 0, 25, 100, 15, Str(Temps) + " ms")
Repeat
Event = WaitWindowEvent()
If Event = #WM_LBUTTONDOWN
SendMessage_(WindowID(0), #WM_NCLBUTTONDOWN, #HTCAPTION, 0)
EndIf
If Event = #PB_Event_Gadget
Select EventGadget() ; boutons, zone de texte, ...
Case 0 ; On quitte le programme
Event = #PB_Event_CloseWindow
EndSelect
EndIf
Until Event = #PB_Event_CloseWindow
End
Donc patience
