Contrôle checkbox avec une propriété readonly - valable aussi pour n'importe quel autre contrôle

0/5 (5 avis)

Snippet vu 14 685 fois - Téléchargée 32 fois

Contenu du snippet

Voici comment faire pour ajouter une propriété ReadOnly sur un CheckBox, pour le rendre insensible aux clicks de souris.

Sur le contrôle CheckBox 'standard', seule la propriété Enabled peut être mise à False, mais cela change aussi l'aspect du contrôle : il est 'flouté'.
Le fonctionnement est le même que le propriété ReadOnly du contrôle TextBox.

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Ce code peut s'adapter facilement pour n'importe quel autre contrôle
en changeant simplement la ligne 'inherits'
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Source / Exemple :


Public Class MonCheckBox
    Inherits System.Windows.Forms.CheckBox

#Region " Code généré par le Concepteur Windows Form "

    Public Sub New()
        MyBase.New()

        'Cet appel est requis par le Concepteur Windows Form.
        InitializeComponent()

        'Ajoutez une initialisation quelconque après l'appel InitializeComponent()

    End Sub

    'La méthode substituée Dispose du UserControl pour nettoyer la liste des composants.
    Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
        If disposing Then
            If Not (components Is Nothing) Then
                components.Dispose()
            End If
        End If
        MyBase.Dispose(disposing)
    End Sub

    'Requis par le Concepteur Windows Form
    Private components As System.ComponentModel.IContainer

    'REMARQUE : la procédure suivante est requise par le Concepteur Windows Form
    'Elle peut être modifiée en utilisant le Concepteur Windows Form.  
    'Ne la modifiez pas en utilisant l'éditeur de code.
    <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
        components = New System.ComponentModel.Container()
    End Sub

#End Region

    Private Const WM_LBUTTONDOWN As Int32 = &H201
    Private Const WM_LBUTTONUP As Int32 = &H202
    Private Const WM_LBUTTONDBLCLK As Int32 = &H203

    Private _dtp_ro As Boolean = False

    'Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs)
    '    MyBase.OnPaint(e)
    '    Console.WriteLine("paint")
    '    If Me._dtp_ro Then          ' readonly=true
    '        e.Graphics.FillRectangle(New SolidBrush(Color.FromKnownColor(KnownColor.Control)), e.ClipRectangle)
    '        'Me.Invalidate()
    '    End If
    'End Sub

    Protected Overrides Sub WndProc(ByRef m As Message)
        Select Case m.Msg
            Case WM_LBUTTONDOWN, WM_LBUTTONUP, WM_LBUTTONDBLCLK
                If Not Me._dtp_ro Then      ' readonly=false
                    MyBase.WndProc(m)
                End If
            Case Else
                MyBase.WndProc(m)
        End Select
    End Sub

    Public Property Read_Only() As Boolean
        Get
            Return Me._dtp_ro
        End Get
        Set(ByVal Value As Boolean)
            Me._dtp_ro = Value
            'Me.Invalidate()
        End Set
    End Property
End Class

Conclusion :


L'éventail des possibilités est illimité : j'ai juste désactivé les évènements WM_LBUTTONDOWN, WM_LBUTTONUP, WM_LBUTTONDBLCLK, qui arrive lorsqu'on enfonce ou on relâche le bouton gauche de la souris, ou lorsqu'on double-clique.

Cette gestion des évènements peut être complexifiée à volonté dans la procédure WndProc, notamment pour interdire les évènements clavier qui peuvent aussi changer l'état d'un CheckBox (touche ESPACE)

Voilà.

A voir également

Ajouter un commentaire Commentaires
pzweilin Messages postés 1 Date d'inscription mercredi 4 juin 2008 Statut Membre Dernière intervention 17 juillet 2008
17 juil. 2008 à 10:45
En fait, pour une checkbox, c'est plus simple de mettre sa propriété AutoCheck à False !
chris_brabant Messages postés 64 Date d'inscription dimanche 24 juillet 2005 Statut Membre Dernière intervention 29 septembre 2014
10 avril 2006 à 21:24
désolé, je ne pratique pas VB6, mais ca ne doit pas être très compliqué d'adapter.
Silmon Messages postés 85 Date d'inscription mardi 6 janvier 2004 Statut Membre Dernière intervention 7 mai 2007
10 avril 2006 à 14:58
C'est exactement ce que je cherchais merci!
En revanche pour la variable ou tu gardes le readonly:
Le "_dtp_ro" , il y a avait plus compliqué comme nom?
pourquoi pas "_#%ap$_8ç~5" ?

9/10 du coup
cs_filou Messages postés 98 Date d'inscription mercredi 19 décembre 2001 Statut Membre Dernière intervention 15 janvier 2008
8 avril 2006 à 11:00
C'est ce que je cherche mais pour VB6 je n'ai pas .net
cs_Willi Messages postés 2375 Date d'inscription jeudi 12 juillet 2001 Statut Modérateur Dernière intervention 15 décembre 2018 22
7 avril 2006 à 19:29
Pas mal comme code mais je ne pense pas que cela soit d'un niveau expert.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.