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)
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.