Comment créer une feuille ou un contrôle aux contours irréguliers ?
Analysons tout d'abord la création d'un contrôle ActiveX ou d'un contrôle
utilisateur aux contours irréguliers. Visual Basic offre à cet effet diverses
propriétés :
- BackStyle : permet de choisir entre un fond opaque ou transparent,
- MaskPicture : définit une image qui, combinée à la propriété
MaskColor, détermine les régions visibles (donc opaques) et transparentes,
- MaskColor : définit la couleur qui détermine la région transparente de
l'image affectée à la propriété MaskPicture.
Dans le cas d'une feuille aux contours irréguliers vous disposerez d'une ou deux
solutions en fonction de la compatibilité dont vous avez besoin.
Si votre plan de compatibilité n'intègre que Windows 2000, Windows XP et supérieurs,
les API relatives aux "Layered Window" sont probablement le choix le plus aisé.
Ce genre de fenêtre vous permet, après avoir dessiné l'une ou l'autre partie
de celle-ci dans une couleur autrement inutilisée, de rendre cette partie de
la fenêtre invisible. A noter que pour enlever la bordure de fenêtre, vous devrez spécifier la propriété BorderStyle à 0 - None, en design-time, comme de coutume. Cette technique est illustrée dans le code suivant.
Option Explicit
Private Const GWL_EXSTYLE = (-20)
Private Const WS_EX_LAYERED = &H80000
Private Const LWA_COLORKEY = &H1&
Private Const SWP_NOMOVE = &H2
Private Const SWP_NOSIZE = &H1
Private Const SWP_NOACTIVATE = &H10
Private Const SWP_SHOWWINDOW = &H40
Private Const HWND_TOPMOST = -1
Private Declare Function GetWindowLong _
Lib "user32" _
Alias "GetWindowLongA" _
( _
ByVal hWnd As Long, _
ByVal nIndex As Long _
) _
As Long
Private Declare Function SetWindowLong _
Lib "user32" _
Alias "SetWindowLongA" _
( _
ByVal hWnd As Long, _
ByVal nIndex As Long, _
ByVal dwNewLong As Long _
) _
As Long
Private Declare Function SetLayeredWindowAttributes _
Lib "user32" _
( _
ByVal hWnd As Long, _
ByVal crKey As Long, _
ByVal bAlpha As Byte, _
ByVal dwFlags As Long _
) _
As Long
Private Declare Function SetWindowPos _
Lib "user32" _
( _
ByVal hWnd As Long, _
ByVal hWndInsertAfter As Long, _
ByVal X As Long, _
ByVal Y As Long, _
ByVal cx As Long, _
ByVal cy As Long, _
ByVal uFlags As Long _
) _
As Long
Private Const TransparencyKey As Long = vbMagenta
Private Sub Form_Load()
Dim lOldStyle As Long
lOldStyle = GetWindowLong(Me.hWnd, GWL_EXSTYLE)
SetWindowLong Me.hWnd, GWL_EXSTYLE, lOldStyle Or WS_EX_LAYERED
SetLayeredWindowAttributes Me.hWnd, TransparencyKey, 0, LWA_COLORKEY
SetWindowPos Me.hWnd, HWND_TOPMOST, 0, 0, 0, 0, _
SWP_NOMOVE Or SWP_NOSIZE Or SWP_NOACTIVATE Or SWP_SHOWWINDOW
Me.ForeColor = vbGreen
Me.BackColor = TransparencyKey
Me.FillStyle = FillStyleConstants.vbFSSolid
Me.FillColor = TransparencyKey
End Sub
Private Sub Form_Paint()
Dim sCircleRadius As Single
Me.Line (1 * Me.ScaleWidth / 4, 1 * Me.ScaleHeight / 4)-(3 * Me.ScaleWidth / 4, 3 * Me.ScaleHeight / 4), vbGreen, BF
If (Me.ScaleWidth > Me.ScaleHeight) Then
sCircleRadius = Me.ScaleHeight / 4
Else
sCircleRadius = Me.ScaleWidth / 4
End If
Me.Circle (Me.ScaleWidth / 2, Me.ScaleHeight / 2), sCircleRadius, TransparencyKey
End Sub
Si au contraire votre application doit fonctionner sous Windows 9x, vous n'aurez d'autre choix
que d'utiliser les APIs graphiques concernant les régions. La méthode est simple :
après avoir créé une région et obtenu son hRgn, vous imposez la forme de la région à la
fenêtre à l'aide de la fonction SetWindowRgn. Un exemple complet décrivant cette technique est
disponible sur le site de François Picalausa :
Hello
Regions.
|
Date de publication : 13 février 2003
Dernière modification : 25 février 2007
Rubriques : Affichage & graphismes
Mots-clés : feuille, form, fenêtre, apparence, surface, forme, délimiter, délimitation, contours, bordure, regions, irréguliers, layer, layered window, transparent, transparence, |