Fonction pour mettre un combobox en readonly sans mettre explicitement enabled à false

Contenu du snippet

Cela n'est pas une méthode d'un contrôle hérité, mais une simple fonction autonome.

L'API FindWindowEx, via le 3iéme argument qui correspond à la WindowClass, permet de recherche le handle de la zone de saisie qui est contenue dans la ComboBox.

Le principe est le suivant si on veut mettre en lecture seule :
- on met Enabled=False sur la ComboBox
- on rend active la zone de saisie contenue dans la ComboBox
- on envoie un message Windows à cette zone de saisie pour la passer en lecture seule (correspond à la propriété ReadOnly sur un TextBox)

Donc la combobox est inactive, mais son contenue n'est pas 'flouté', comme avec la propriété Enabled.

Source / Exemple :


Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" _
        (ByVal hWnd1 As Integer, ByVal hwnd2 As Integer, ByVal lpsz1 As String, _
        ByVal lpsz2 As String) As Integer

    Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
            (ByVal hWnd As Integer, ByVal wMsg As Integer, ByVal wParam As Long, _
            ByRef lParam As Object) As Integer

    Private Const EM_SETREADONLY = &HCF
    Private Const WM_ENABLE = &HA

    Private Sub SetComboReadOnly(ByRef c As Control, ByVal ro As Boolean)
        Dim hWndEdit As Integer

        If Not (TypeOf c Is ComboBox) Then
            Throw New Exception("SetComboReadOnly : type de contrôle non géré.")
        End If

        c.Enabled = Not ro

        hWndEdit = FindWindowEx(c.Handle.ToInt32, 0&, "Edit", vbNullString)
        If hWndEdit <> 0 Then
            SendMessage(hWndEdit, WM_ENABLE, True, 0&)
            SendMessage(hWndEdit, EM_SETREADONLY, ro, 0&)
        Else
            Throw New Exception("SetComboReadOnly : erreur API Windows 'FindWindowEx'.")
        End If
    End Sub

Conclusion :


Une autre méthode consisterait à créer un contrôle hérité de la ComboBox, et d'intercepter les évènements de click souris, clavier etc...
(voir mes autres sources pour avoir un modèle)

A voir également

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.