oui ca existe, c'est un truc de régions
je ne retrouves pas sur ce site la source, donc voici le code
tu verras tu peux faire des trucs sympas
1 form, 2 modules
dans un premier module
'//////////////////////////////////////////////////////////////
'// INTRODUCTION //
'//////////////////////////////////////////////////////////////
' Salut,
' Apparemment tu voudrais un peut d'aide pour faire des feilles
' non-rectangulaires ...
'Voilà :
'Pour faire des fenêtres non-rectangulaire, on doit d'abord
'créer une Région : c'est comme une sorte de dessin à deux
'couleurs (plein ou vide) que l'on va ensuite appliquer à une
'fenêtre.
'Les zones de la fenêtre correspondant à le couleur "plein"
'seront visibles.
'Celles correspondant à la couleur "vide" seront invisibles.
'Les zones crée sont identifiées grace à leur Handle. Il sagit
'd'un numéro unique attribué pour identifier tous les objets :
'Boutons, Fenêtres, Régions, TextBox, etc.
'//////////////////////////////////////////////////////////////
'// CREER DES REGIONS //
'//////////////////////////////////////////////////////////////
' Pour Créer des régions il faut utiliser une des fonctions
' suivante :
'(Les coordonnée des points sont exprimées en pixels)
'CREER DES RECTANGLES
'Pour créer un région en forme de rectangle :
Declare Function CreateRectRgn Lib "gdi32" ( _
ByVal X1 As Long, _
ByVal Y1 As Long, _
ByVal X2 As Long, _
ByVal Y2 As Long) _
As Long
'X1 et Y1 indiquent les coordonnées du coin supérieur droit
'X2 et Y2 indiquent les coordonnées du coin inférieur gauche
'Cette fonction revoie le Handle de la région crée
'CREER DES ELLIPSES
'Pour créer une région en forme d'ellipse :
Declare Function CreateEllipticRgn Lib "gdi32" ( _
ByVal X1 As Long, _
ByVal Y1 As Long, _
ByVal X2 As Long, _
ByVal Y2 As Long) _
As Long
'Cette fonction crée une ellipse qui rentre dans le rectangle
'formée avec les coordonées X1, X2, Y1, Y2
'Cette fonction revoie le Handle de la région crée
'CREER DES POLYGONES
'Pour créer une région ayant la forme d'un polygone
Declare Function CreatePolygonRgn Lib "gdi32" ( _
lpPoint As POINTAPI, _
ByVal nCount As Long, _
ByVal nPolyFillMode As Long _
) As Long
'lpPoint est un tableau désignant les coins du polygone
'Il est de type POINTAPI :
Type POINTAPI
X As Long
Y As Long
End Type
'nCount désigne le nombre de coins du polygone.
'nPolyFillMode désigne le mode de remplissage.
'tu peux utiliser les constantes suivantes
Public Const ALTERNATE = 1
Public Const WINDING = 2
'J'avoue que je ne comprend pas la différence entre les deux,
'Tu peut mettre 1, ça marche bien.
'//////////////////////////////////////////////////////////////
'// COMBINER DES REGIONS //
'//////////////////////////////////////////////////////////////
'Maintenant que nous pouvons créer des régions, voici comment
'les combiner pour créer des régions complexes.
'Il faut utiliser la fonction :
Declare Function CombineRgn Lib "gdi32" ( _
ByVal hDestRgn As Long, _
ByVal hSrcRgn1 As Long, _
ByVal hSrcRgn2 As Long, _
ByVal nCombineMode As CombineMode _
) As Long
'hDestRgn désigne le Handle de la région de destination.
'/--------------------------------------------------------\
'|ATTENTION : POUR QUE CELA FONCTIONNE, IL FAUT ABSOLUMENT|
'|QUE LA REGION SOIT DEJA INITIALISEE A L'AIDE D'UNE DES |
'|FONCTIONS VUE CI-DESSUS. |
'\--------------------------------------------------------/
'hSrcRgn1 désigne le Handle de la première Région à combiner
'hSrcRgn2 désigne le Handle de la deuxième Région à combiner
'nCombineMode désigne le mode utilisé pour la Combinaison
'Tu peux utiliser une des constantes suivante :
Public Enum CombineMode
RGN_AND = 1 ' Créé l'intersection des deux
'régions
RGN_COPY = 5 ' Copie la Région1
RGN_DIFF = 4 ' Combine les parties de Région1
'qui ne font pas partie de région2
RGN_OR = 2 ' Créé l'union des deux régions
RGN_XOR = 3 ' Créé l'union des deux régions à
'laquelle on enleve l'intersection
'des deux régions
End Enum
'//////////////////////////////////////////////////////////////
'// APPLIQUER DES REGIONS //
'//////////////////////////////////////////////////////////////
'Pour appliquer une région à une fenêtre, on utilise la
'fonction suivante :
Declare Function SetWindowRgn Lib "user32" ( _
ByVal hwnd As Long, _
ByVal hRgn As Long, _
ByVal bRedraw As Boolean _
) As Long
'hWnd indique le Handle de la fenêtre à laquelle on veut
'appliquer la région.
'hRgn indique le Handle de la région à appliquer.
'bRedraw indique s'il faut redessiner la fenêtre.
'Mettre True si la fenêtre est visible
'On peut mettre False si elle est cachée.
'Note : On peut utiliser cette fonction avec le handle d'un
'contrôle au lieu de celui d'une Fenêtre
'//////////////////////////////////////////////////////////////
'// SUPPRIMER DES REGIONS //
'//////////////////////////////////////////////////////////////
'Une fois que l'on a plus besoin de la région, il faut la
'supprimer pour libérer de la mémoire.
'Pour cela, on peut utiliser la fonction :
Declare Function DeleteObject Lib "gdi32" ( _
ByVal hObject As Long _
) As Long
'hObject désigne le Handle de la région à supprimer.
'ATTENTION : NE PAS SUPPRIMER UNE REGION QUI EST APPLIQUEE
'A UNE FENETRE. CELA AURAIT POUR EFFET DE LAISSER LA FENETRE
'IMPRIMEE SUR LE BUREAU (CA FAIT PAS BEAU)
dans un 2e module
'Creation d'une fenêtre en forme de smiley
'Auteur : Thomas Detoux (Detoux@club-internet.fr)
'Pour l'utiliser, ajoutez simplement ce module
'à votre projet.
'Puis, utilisez la syntaxe :
'Smiley form
'une fois la sub lancée, la variable publique 'leSmiley'
'renvoie le handle de la région utilisée
'AVERTISSEMENT:
'Ce module nécessite le module 'Regions.bas'
'(du même auteur) pour fonctionner
'Pour toutes questions ou suggestions, n'hésitez pas
'à me mailer.
Option Explicit
Dim leSmiley As Long
Sub Smiley(obj As Form)
'////////////////
'/Initialisation/
'////////////////
Dim X As Long, Y As Long
X = obj.Width / Screen.TwipsPerPixelX
Y = obj.Height / Screen.TwipsPerPixelY
'Formes de bases
Dim Grond As Long
Dim Gsmile As Long
Dim Psmile As Long
Dim Rect As Long
Dim eyeG As Long
Dim eyeD As Long
'Formes complexes
Dim Bouee As Long
Dim leSmile As Long
Dim Yeux As Long
Dim Tete As Long
Dim LesPoints(0 To 4) As POINTAPI
'////////////////////////////////
'/Creation des formes de bases :/
'////////////////////////////////
Grond = CreateEllipticRgn(0, 0, X, Y)
Gsmile = CreateEllipticRgn(Int(X / 10), Int(Y / 10), Int(X * 9 / 10), Int(Y * 9 / 10))
Psmile = CreateEllipticRgn(Int(X * 2 / 10), Int(Y * 4 / 10), Int(X * 8 / 10), Int(Y * 8 / 10))
LesPoints(0).X = 0
LesPoints(0).Y = 0
LesPoints(1).X = X
LesPoints(1).Y = 0
LesPoints(2).X = X
LesPoints(2).Y = Int(Y * 8 / 10)
LesPoints(3).X = Int(X / 2)
LesPoints(3).Y = Int(Y / 2)
LesPoints(4).X = 0
LesPoints(4).Y = Int(Y * 8 / 10)
Rect = CreatePolygonRgn(LesPoints(0), 5, 1)
eyeG = CreateEllipticRgn(Int(X * 2 / 10), Int(Y * 3 / 10), Int(X * 4 / 10), Int(Y * 5 / 10))
eyeD = CreateEllipticRgn(Int(X * 6 / 10), Int(Y * 3 / 10), Int(X * 8 / 10), Int(Y * 5 / 10))
'///////////////////////////////
'/Creation des formes complexes/
'///////////////////////////////
'Initialisation des régions
Bouee = CreateEllipticRgn(0, 0, X, Y)
leSmile = CreateEllipticRgn(0, 0, X, Y)
Yeux = CreateEllipticRgn(0, 0, X, Y)
Tete = CreateEllipticRgn(0, 0, X, Y)
leSmiley = CreateEllipticRgn(0, 0, X, Y)
'Compilation des régions
CombineRgn Bouee, Gsmile, Psmile, RGN_DIFF
CombineRgn leSmile, Bouee, Rect, RGN_DIFF
CombineRgn Yeux, eyeG, eyeD, RGN_OR
CombineRgn Tete, Grond, Yeux, RGN_DIFF
CombineRgn leSmiley, Tete, leSmile, RGN_DIFF
'////////////
'/Conclusion/
'////////////
'Suppression des régions inutiles
DeleteObject Grond
DeleteObject Gsmile
DeleteObject Psmile
DeleteObject Rect
DeleteObject eyeG
DeleteObject eyeD
DeleteObject Bouee
DeleteObject leSmile
DeleteObject Yeux
DeleteObject Tete
'Application de la région
SetWindowRgn obj.hwnd, leSmiley, True
End Sub
dans la form
Private Sub Command1_Click()
SetWindowRgn Me.hwnd, 0, False
DeleteObject leSmiley
End
End Sub
Private Sub Form_Load()
'************************************************************
'* NOM : Simley
'* DATE : 14/11/1998
'*
'* AUTEUR : Thomas Detoux ( Detoux@club-internet.fr )
'*
'* CODE TROUVE SUR "Le petit monde de Visual Basic"
'* http://www.vbasic.org
'*
'* DESCRIPTION :
'* Cet exemple vous montre comment créer une feuille
'* en forme de smiley.
'* Dans la même idée, voir les codes "ExRegions" et "YingYang"
'*
'************************************************************
Smiley Me
End Sub
Private Sub Form_Resize()
Dim oldSmiley
oldSmiley = leSmiley
Smiley Me
DeleteObject oldSmiley
End Sub
A+.
Thomas.