Astuces de recherche...
Home
- Accueil & nouveautés
- Les newsgroups VB
- Téléchargements
- L'équipe
- Nous contacter
- Liens
Rubriques
- Toutes les questions
- Affichage & graphismes
- Algorithmique
- API
- Base de registre
- Bases de données
- Contrôles
- Date & heure
- Déploiement
- Divers
- Erreurs & problèmes
- Fichiers & dossiers
- Généralités
- Impression
- Internet & mails
- Math
- Multimédia
- Réseaux
- Structures de données
- Texte & strings
- VB .Net
- VB Script
- VBA
- Windows

Question 125

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

'Couleur transparente
Private Const TransparencyKey As Long = vbMagenta

Private Sub Form_Load()
    Dim lOldStyle As Long
     
    'Indique qu'il s'agit d'une "layered window"
    lOldStyle = GetWindowLong(Me.hWnd, GWL_EXSTYLE)
    SetWindowLong Me.hWnd, GWL_EXSTYLE, lOldStyle Or WS_EX_LAYERED
     
    'Définit la couleur transparente
    SetLayeredWindowAttributes Me.hWnd, TransparencyKey, 0, LWA_COLORKEY
     
    'Met à jour les propriétés de la fenêtre
    SetWindowPos Me.hWnd, HWND_TOPMOST, 0, 0, 0, 0, _
        SWP_NOMOVE Or SWP_NOSIZE Or SWP_NOACTIVATE Or SWP_SHOWWINDOW

    'Initialise les propriétés de traçage
    Me.ForeColor = vbGreen
    Me.BackColor = TransparencyKey
    Me.FillStyle = FillStyleConstants.vbFSSolid
    Me.FillColor = TransparencyKey
End Sub

Private Sub Form_Paint()
    Dim sCircleRadius As Single

    'Trace un rectangle vert de la moitié de la taille de la fenêtre, centré sur celle-ci
    Me.Line (1 * Me.ScaleWidth / 4, 1 * Me.ScaleHeight / 4)-(3 * Me.ScaleWidth / 4, 3 * Me.ScaleHeight / 4), vbGreen, BF

    'Y inscrit un cercle transparent (cfr. FillStyle et FillColor)
    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,