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