Ouvrir Automatiquement la liste d'une ComboBox

Résolu
SonicDusbir Messages postés 30 Date d'inscription dimanche 24 septembre 2006 Statut Membre Dernière intervention 5 juillet 2011 - 17 déc. 2009 à 16:00
SonicDusbir Messages postés 30 Date d'inscription dimanche 24 septembre 2006 Statut Membre Dernière intervention 5 juillet 2011 - 18 déc. 2009 à 12:13
Bonjour tout le monde !

J'ai une DateTimePicker ( mais je pense que le problème est le même avec une ComboBox) que j'affiche que sous certaines conditions.

Lorsque je l'affiche, j'aimerais ouvrir automatiquement le calendrier ( la liste déroulante dans le cas d'une ComboBox).

Comment faire ?

Merci !

38 réponses

ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
18 déc. 2009 à 00:08
Ton outil contient peut-être une ou plusieurs fenêtres filles. Si tel est le cas, la chose devient complexe car il va d'abord falloir les énumérer puis tenter de leur envoyer une séquence de click, tour à tour, jusqu'à trouver la bonne ....
On peut voir une image de ton DTPicker (tel qu'il est avant déroulement) ?


____________________
Très intéressante fable, L'OISELEUR, L'AUTOUR ET L'ALOUETTE !
Cliquer sur "Réponse acceptée" (en bas d'une solution avérée adéquate) rendra service à d'autres. PENSEZ-Y.
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
18 déc. 2009 à 07:31
testé avec ton KryptonDateTimePicker....

ca fonctionne.

    Private Const WM_LBUTTONDOWN As Int32 = &H201

    Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageW" (ByVal hwnd As Int32, ByVal wMsg As Int32, ByVal wParam As Int32, ByVal lParam As Int32) As Int32

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        With KryptonDateTimePicker1
            SendMessage(.Handle, WM_LBUTTONDOWN, 1, .Width - 10 + &H50000)
        End With
    End Sub


Renfield - Admin CodeS-SourceS - MVP Visual Basic
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
18 déc. 2009 à 09:31
Ne serait-il pas plus orthodoxe de :
-1) déterminer quelle est la fenêtre qui doit avoir le focus pour cet outil (classe, nom, etc...) en s'y plaçant (et l'écrire sur une feuille de papier)
- 2) (maintenant qu'on en connait les caractéristiques pour cet outil) :
aller à la pêche du handle concerné (à l'aide de ce que l'on connaît maintenant) et utiliser sendmessage avec ce handle là

Ce serait beaucoup plus propre, à mon sens.


____________________
Très intéressante fable, L'OISELEUR, L'AUTOUR ET L'ALOUETTE !
Cliquer sur "Réponse acceptée" (en bas d'une solution avérée adéquate) rendra service à d'autres. PENSEZ-Y.
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
18 déc. 2009 à 09:38
j'avoue ne pas avoir saisi ta remarque, ucfoutu ...

si elle concerne le code que j'ai soumis ce matin, le SendMessage joue bien avec le Handle du DateTimePicker

on clique ici en fait à 10 pixels de la bordure droite, et 5 de la bordure haute.
c'est un peu hasardeux, peut etre, selon le theme ou differentes propriétés du controle, mais tel qu'il arrive de base, on clique bel et bien sur le bouton.

enfin, on clique, non, on dit au controle que l'on a cliqué...


Renfield - Admin CodeS-SourceS - MVP Visual Basic
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
18 déc. 2009 à 09:51
Je sais...
Ce que j'aime moins, c'est le click "géographique", qui devrait pouvoir être remplacé par un message envoyé à la "sous-fenêtre" concernée (dont on a extrait le handle).
Cette discussion ressemble un peu (pas exactement, mais...) à celle tenue ici :
http://www.vbfrance.com/forum/sujet-CAPTER-HANDLE-TOOLBAR_1387574.aspx
en ajoputant que le demandeur, dans cette discussion-là, est également le dépositaire d'une source qui permet de déterminer les caractéristiques d'une sous-fenêtre.
A voir...
____________________
Très intéressante fable, L'OISELEUR, L'AUTOUR ET L'ALOUETTE !
Cliquer sur "Réponse acceptée" (en bas d'une solution avérée adéquate) rendra service à d'autres. PENSEZ-Y.
0
SonicDusbir Messages postés 30 Date d'inscription dimanche 24 septembre 2006 Statut Membre Dernière intervention 5 juillet 2011
18 déc. 2009 à 09:55
Effectivement cela fonctionne avec ton code Renfield.

Mais le problème est que je dois cliquer quand même 2 fois pour pouvoir sélectionner une date. Or le but de cette opération était d'économiser un clic pour une meilleure cohérence de mon interface.

Une solution ?
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
18 déc. 2009 à 09:58
Pour que tu me comprennes mieux (et bien que celà n'ait pas vraiment grand chose à voir avec SON contrôle) :
Voici, par exemple, comment extraire le handle de la seule zone éditable d'une combo.

Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hwndParent As Long, _
ByVal hwndChildAfter As Long, ByVal lpszClass As String, ByVal lpszWindow As String) As Long

Public Function GetComboBoxEdithWnd(ByVal hwnd As Long) As Long
   GetComboBoxEdithWnd = FindWindowEx(hwnd, 0, "EDIT", vbNullString)
End Function

Private Sub Form_Load()
 MsgBox GetComboBoxEdithWnd(Combo1.hwnd) & "  " & Combo1.hwnd
End Sub


Regarde ce que l'on a utilisé dans cet exemple ( "EDIT"). C'est ce genre de renseignement, qu'il faudrait pouvoir extraire en ce qui concerne SON DtPicker.
Une fois ce handle-là obtenu, tout devrait alors être très simple.
____________________
Très intéressante fable, L'OISELEUR, L'AUTOUR ET L'ALOUETTE !
Cliquer sur "Réponse acceptée" (en bas d'une solution avérée adéquate) rendra service à d'autres. PENSEZ-Y.
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
18 déc. 2009 à 10:09
c'est .Handle....

son controle est pas composé d'un EDIT (j'ai téléchargé la suite Krypto)



Mais le problème est que je dois cliquer quand même 2 fois pour pouvoir sélectionner une date. Or le but de cette opération était d'économiser un clic pour une meilleure cohérence de mon interface.


Attends, quel est le but final ?

tu voulais pouvoir afficher le calendar, c'est chose faite.


Renfield - Admin CodeS-SourceS - MVP Visual Basic
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
18 déc. 2009 à 10:10
y'a pas de sous fenetre, en somme, c'est juste un container unique, dans lequel tout est dessiné

Renfield - Admin CodeS-SourceS - MVP Visual Basic
0
SonicDusbir Messages postés 30 Date d'inscription dimanche 24 septembre 2006 Statut Membre Dernière intervention 5 juillet 2011
18 déc. 2009 à 10:15
Effectivement je n'ai pas pensé à le précisé je m'en excuse.

Quand ma DateTimePicker s'affiche, je veux que s'ouvre automatiquement le calendrier et qu'on puisse sélectionner une date directement via un seul clic donc.
Sinon je dois faire un clic pour afficher le calendrier, puis un clic pour sélectionner la date. Ici malgré que le calendrier est affiché je dois en refaire quand même un avant de pouvoir sélectionner une date.
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
18 déc. 2009 à 10:19
rendu là, ce qu'il reste a faire ne doit pas être si terrible...

le tout est de trouver le Handle du Calendar, chose qui t'es je pense fournie via les propriétés du controle (je l'ai pas installé là, au boulot)

et de lui donner le focus.

Renfield - Admin CodeS-SourceS - MVP Visual Basic
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
18 déc. 2009 à 10:22
Tu es en train de venir, doucement mais sûrement, à ce que je tentais d'exprimer, Renfield
____________________
Très intéressante fable, L'OISELEUR, L'AUTOUR ET L'ALOUETTE !
Cliquer sur "Réponse acceptée" (en bas d'une solution avérée adéquate) rendra service à d'autres. PENSEZ-Y.
0
SonicDusbir Messages postés 30 Date d'inscription dimanche 24 septembre 2006 Statut Membre Dernière intervention 5 juillet 2011
18 déc. 2009 à 10:42
Alors j'ai essayer divers trucs, mais rien ne fonctionne.
Par contre, si juste après avoir afficher mon calendrier, j'affiche une MsgBox, et bah après avoir fait OK pour celle-ci, je peux sélectionner directement ma date.

Donc que se passe-t-il comme évènement lors de la disparition de ma MsgBox ?
Je n'aurais plus qu'à le reproduire comme ça...

Merci !
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
18 déc. 2009 à 11:10
Ce n'est pas la disparition de ta msgbox, qui "restitue", mais son appel, qui empêche la suite des instructions de ton contrôle (une msgbox est modale), ce qui fait que le focus reste où il se trouvait (sur ton calendar, donc).
C'est ce que je pense

____________________
Très intéressante fable, L'OISELEUR, L'AUTOUR ET L'ALOUETTE !
Cliquer sur "Réponse acceptée" (en bas d'une solution avérée adéquate) rendra service à d'autres. PENSEZ-Y.
0
SonicDusbir Messages postés 30 Date d'inscription dimanche 24 septembre 2006 Statut Membre Dernière intervention 5 juillet 2011
18 déc. 2009 à 11:14
Oui mais alors pourquoi je perd le focus du calendrier alors qu'il ne se passe rien ensuite ?
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
18 déc. 2009 à 12:03
SonicDusbir -> l'interférence se fait justement par le click du bouton

le code de renfield est sans doute correct, voici juste une autre manière qui fonctionne chez moi (toujours avec le simple datetimepicker


    <System.Runtime.InteropServices.DllImportAttribute("user32.dll", SetLastError:=True)> Shared Function SendMessage(ByVal hWnd As IntPtr, ByVal Msg As Int32, ByVal wParam As Int32, ByVal lParam As Int32) As Integer
    End Function
    Sub DropBox(ByVal hBoxHandle As IntPtr)
        'oBox peut être =>
        '       ComboBox
        '       DateTimePicker
        '       KryptonDateTimePicker

        Const WM_SYSKEYDOWN As Int32 = &H104
        SendMessage(hBoxHandle, WM_SYSKEYDOWN, Keys.Down, 0)
    End Sub



    Private Sub TextBox1_Validated(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextBox1.Validated
        DropBox(DateTimePicker1.Handle)
    End Sub



une fois le calendrier déployé, une seule pression suffit à sélectionner la date et à le refermer
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
18 déc. 2009 à 12:07
ne fonctionne pas.

perso, j'ai pas trouvé une seule touche du clavier qui déplie le calendar (Down et F4 comprises)

Renfield - Admin CodeS-SourceS - MVP Visual Basic
0
SonicDusbir Messages postés 30 Date d'inscription dimanche 24 septembre 2006 Statut Membre Dernière intervention 5 juillet 2011
18 déc. 2009 à 12:13
Moi aussi j'ai tester toutes les touches du clavier rien ne fonctionne pour déplier le calendrier.
Et je confirme chez moi le code de PCPT ne fonctionne pas.

Par contre nickel ton code Renfield ! Merci !

Merci à tous en tous cas, je n'aurais jamais trouvé tout seul.
0
Rejoignez-nous