IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Utilisation de l'API Windows pour personnaliser des contrôles


Sujet :

VB.NET

  1. #1
    Membre actif
    Inscrit en
    Juillet 2013
    Messages
    777
    Détails du profil
    Informations forums :
    Inscription : Juillet 2013
    Messages : 777
    Points : 275
    Points
    275
    Par défaut Utilisation de l'API Windows pour personnaliser des contrôles
    Il semble que l'utilisation de l'API Windows user32.dll soit courante pour ne pas dire indispensable dès que l'on veut personnaliser des contrôles Winforms (ce qui est un peu l'idée première d'un débutant qui souhaite se lancer dans la création de classes).

    Or, comme je l'expliquais ici, les exemples utilisant cet API sont assez difficile à reproduire ou à extrapoler.

    Je voudrais savoir si vous connaissez un tuto qui explique les rudiments concernant cet API pour l'utiliser dans la personnalisation de contrôles.

    J'ai cherché mais je suis surtout tombé sur des dictionnaires du contenu de cette DLL sans que l'utilisation de ce contenu ne soti vraiment expliqué du point de vue de l'intérêt qu'on peut en tirer.

  2. #2
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 175
    Points : 25 116
    Points
    25 116
    Par défaut
    il n'est pas nécessaire de passer par une api pour modifier l'apparence des controles (à part un ou deux comme le textbox)

    la majorité des controles du framework sont codés en .net, il est donc possible de les adapter à ce qu'on veut faire
    en fait il y a une méthode paint sur chaque controle, appelé quand windows ou un autre controle décide qu'il faut redessiner le controle, ensuite c'est du draw tout simple

    par un exmple un label fait un drawstring, un picturebox fait un drawimage
    pour faire un bouton on peut faire un drawrectangle et un drawstring, le combobox permet aussi de changer le rendu des items etc...

    pour faire un bouton on peut donc faire un classe monbouton, marqué inherits button et faire un overrides de onpaint qui n'appelle mybase.onpaint
    ensuite on e.graphics.Draw ce qu'on veut (penser à mettre des try catch, parce que quand on débute ca peut planter dans visual studio si on fait des bugs)
    monbouton apparait ensuite dans la boite à outils et on peut poser des monbouton

  3. #3
    Membre actif
    Inscrit en
    Juillet 2013
    Messages
    777
    Détails du profil
    Informations forums :
    Inscription : Juillet 2013
    Messages : 777
    Points : 275
    Points
    275
    Par défaut
    Si on peut se passer de l'API, comment résoudrait-tu mon pb dans le prix que j'ai cité au post précédent ?
    Il semble que la difficulté se pose dès que l'on souhaite redessiner une partie du contrôle dans le cadre d'un Event.
    Dans le cas que j.exposais, il s.agit de redessiner la bordure sur l'événement ongotfocus.
    Si solution il y a, je n'en ai trouvé sur le net que basées sur l'API.

  4. #4
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 175
    Points : 25 116
    Points
    25 116
    Par défaut
    explique ton problème sur ce topic ou donne un lien vers le topic

    si c'est pour rajouter du contenu sur un controle spécifique, on peut s'abonner à l'event paint et dessiner sur e.Graphics
    ce qu'on dessine sera rajouté par dessus le dessin du controle
    pour avertir un controle qu'on veut qu'il se redessine il faut appeler lecontrole.invalidate (l'event paint sera appelé dans la foulée)

    si c'est pour modifier le dessin total il faut faire un inherits comme dit précédemment

  5. #5
    Membre actif
    Inscrit en
    Juillet 2013
    Messages
    777
    Détails du profil
    Informations forums :
    Inscription : Juillet 2013
    Messages : 777
    Points : 275
    Points
    275

  6. #6
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 175
    Points : 25 116
    Points
    25 116
    Par défaut
    ah oui c'était le lien du départ désolé ^^

    alors le textbox c'est une des exceptions à ce que je dis, il est géré en plus bas niveau par windows, il ne vaut mieux donc rien lui faire par du paint

    après je vois 2 options soit faire un usercontrol avec un textbox dedans, et c'est le backcolor du textbox qu'on modifie, soit faire un inherits textbox et dans dessiner sur son parent un rectangle autour du textbox
    les 2 ont des avantages et des inconvénients

  7. #7
    Membre actif
    Inscrit en
    Juillet 2013
    Messages
    777
    Détails du profil
    Informations forums :
    Inscription : Juillet 2013
    Messages : 777
    Points : 275
    Points
    275
    Par défaut
    ah oui c'était le lien du départ désolé ^^
    Pas de soucis

    soit faire un inherits textbox et dans dessiner sur son parent un rectangle autour du textbox
    Ben si tu regardes ma tentative de code dans le topic dont je t'ai indiqué le lien, tu verras que je suis parti sur cette méthode. Mais le pb est ailleurs : comment appeler les fonctions paint depuis la sub OnGotFocus ? Le point qui me pose pb est en commentaire dans le code en question.

  8. #8
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 175
    Points : 25 116
    Points
    25 116
    Par défaut
    pas regardé mais comme je l'ai dit, le dessin doit être fait dans l'event paint et invalidate déclenche l'event paint
    il faut alors une variable dans la classe disant ce qu'il y a à faire dans paint

    gotfocus :
    set variable pour dire la couleur ou autre
    invalidate

    paint :
    dessin selon la variable

  9. #9
    Membre actif
    Inscrit en
    Juillet 2013
    Messages
    777
    Détails du profil
    Informations forums :
    Inscription : Juillet 2013
    Messages : 777
    Points : 275
    Points
    275
    Par défaut
    J'ai traduit ton propos comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    Imports System.ComponentModel
     
    Public Class MonTextBox
        Inherits System.Windows.Forms.TextBox
        Private _BorderColor As Color = Color.Red
        Private _CurrentColor As Color
        Private _BorderWidth As SByte = 1
     
        Public Sub New()
            Me.BorderStyle = Windows.Forms.BorderStyle.FixedSingle
        End Sub
     
        <Browsable(True), Category("Apparence")> _
        Public Property BorderColor() As Color
            Get
                Return _BorderColor
            End Get
            Set(ByVal value As Color)
                _BorderColor = value
                _CurrentColor = value
                Me.Invalidate()
            End Set
        End Property
     
        <Browsable(True), Category("Apparence")> _
        Public Property BorderWidth() As SByte
            Get
                Return _BorderWidth
            End Get
            Set(ByVal value As SByte)
                _BorderWidth = value
                Me.Invalidate()
            End Set
        End Property
     
        Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
            Dim mypen As Pen
            mypen = New Pen(_CurrentColor, _BorderWidth)
            e.Graphics.DrawRectangle(mypen, _BorderWidth, _BorderWidth, Me.Width - 2 * _BorderWidth, Me.Height - 2 * _BorderWidth)
        End Sub
     
        Protected Overrides Sub OnGotFocus(ByVal e As System.EventArgs)
            _CurrentColor = _BorderColor
            Me.Invalidate()
        End Sub
     
        Protected Overrides Sub OnLostFocus(ByVal e As System.EventArgs)
            _CurrentColor = Color.Black
            Me.Invalidate()
        End Sub
    End Class
    Mais ça ne marche pas : un pas à pas montre qu'on ne rentre jamais dans la procédure OnPaint

  10. #10
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 175
    Points : 25 116
    Points
    25 116
    Par défaut
    il y a une ligne de code pour que paint soit déclenché pour le textbox
    mais comme je l'ai dit il ne faut pas modifier le paint du textbox il est géré en plus bas niveau, et même en activant le paint avec la ligne de code magique le rendu c'est du n'importe quoi (ce qu'on dessine est affiché pendant peu de temps et pas très synchrone, selon les events clavier)

    ce que j'ai précédemment pour avoir une bordure autour d'un textbox :
    après je vois 2 options soit faire un usercontrol avec un textbox dedans, et c'est le backcolor du textbox qu'on modifie, soit faire un inherits textbox et dans dessiner sur son parent un rectangle autour du textbox
    les 2 ont des avantages et des inconvénients
    il faudrait faire me.parent.invalidate sur le gotfocus, sur onparentchanged faire addhandler parent.paint, addressof dessin (ou removehandler si me.parent is nothing)
    et sur la sub dessin faire e.Graphics.Drawrectangle (me.clientrectangle à un pixel près)
    en gros si le textbox est sur un form, c'est sur le form qu'on dessine le rectangle, c'est donc au form qu'il faut demander le redessin, même si le traitement est fait dans le textbox et la variable stockée dans le textbox

  11. #11
    Membre actif
    Inscrit en
    Juillet 2013
    Messages
    777
    Détails du profil
    Informations forums :
    Inscription : Juillet 2013
    Messages : 777
    Points : 275
    Points
    275
    Par défaut
    J'y suis presque...
    Mais comme j'ai initié la textBox de façon à ce que sa propriété BorderStyle = FixedSingle (pour que la bordure soit dessinée avec une épaisseur de 1 pixel avant traitement), la bordure apparaît donc noire.
    Donc quand je superpose une bordure rouge (par exemple), la nouvelle bordure semble passer en arrière-plan.

Discussions similaires

  1. Réponses: 8
    Dernier message: 01/03/2013, 15h06
  2. Utilisation de l'api criteria pour des join
    Par hugo123 dans le forum JPA
    Réponses: 0
    Dernier message: 04/02/2011, 11h46
  3. Une FAQ API Windows pour C
    Par O( N ) dans le forum C
    Réponses: 2
    Dernier message: 27/11/2006, 21h30
  4. api/windows pour extraire le nom de repertoire
    Par youssefinfo00 dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 06/09/2006, 16h03
  5. [DOM] Utilisation de l'API DOM pour créer du HTML sous IE
    Par pedouille dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 11/01/2006, 14h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo