Comment Customisez les Windows Forms et les Boutons

joe guilian Messages postés 10 Date d'inscription lundi 2 janvier 2006 Statut Membre Dernière intervention 14 mars 2006 - 10 mars 2006 à 14:01
jannoman Messages postés 256 Date d'inscription jeudi 17 avril 2003 Statut Membre Dernière intervention 20 février 2008 - 10 mars 2006 à 14:14
Bonjour à tous !
J'utilise Visual Studio 2005 et je voudrai s'avoir s'il est possible dans une windowsForm l'orsque l'on place un bouton (par exemple Quitter ou OK) de l'avoir autrement que rectangulaire. J'aimerai l'avoir rond ou avoir une forme étoilé par exemple.
Idem quand je creer un nouveau projet les fenetre sont toujour carré ou rectangulaire. Jaimerai l'avoir Rond ou Ovale Avoir les angles arrondi etc....
Ma question est comment faire.
Y a t'il un Plug-in ou un Programme particulier.
Merci pour votre aide

1 réponse

jannoman Messages postés 256 Date d'inscription jeudi 17 avril 2003 Statut Membre Dernière intervention 20 février 2008 1
10 mars 2006 à 14:14
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.
0
Rejoignez-nous