Page 1 sur 1

Fenêtre avec une forme bizarre basée sur une image

Publié : ven. 02/juin/2006 17:50
par Le Soldat Inconnu
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.

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
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 :)