OVH Cloud OVH Cloud

WndProc et Alt-Down

6 réponses
Avatar
Bernard
Bonjour,

Soit une datagrid comportant une combobox (comme décrit dans la FAQ du site
de SyncFusion).

Dans la classe NoKeyUpCombo, on surcharge la procédure WndProc pour filtrer
(ignorer) les éventuels appuis sur la touche TAB.

J'aimerais, dans cette procédure, récupérer l'appui simultané sur les
touches ALT + flèche vers le bas. Ceci afin de pouvoir forcer la combobox à
se dérouler (comme toute combobox qui se respecte).

J'ai essayé avec les messages WM_KEYDOWN et WM_SYSKEYDOWN mais je n'y arrive
pas.
Je sais qu'il faut traiter plusieurs messages successifs, mais je n'ai
certainement pas tout compris.

Un petit coup de main m'arrangerais bien !
___________
Bernard

6 réponses

Avatar
Zoury
Salut Bernard! :O)

Je n'ai pas le temps de testé pour l'instant , mais essai plutôt d'overrider
(<- c'est quoi donc le terme français ?!?) ProcessCmdKey().

voici un exemple que j'ai posté la semaine passée :
http://groups.google.com/groups?selm=OjQRPCo7EHA.2124%40TK2MSFTNGP14.phx.gbl

La méthode WndProc() ne reçoit pas les messages WM_KEYDOWN et autres
variantes de ce genre, c'est plutôt le contrôle qui a le focus *dans* le
datagrid qui les reçoit.

note : on peut aussi se brancher directement sur les événements du contrôle
qui a le focus par l'entremise de DataGridColumnStyle... j'avais trouvé un
exemple sur le web si ça t'intéresse, mais, au premier coup d'oeil, ça
m'apparaissait moins propre et plus difficile d'entretien..

--
Cordialement
Yanick
MVP pour Visual Basic
"Bernard" a écrit dans le message de
news:
Bonjour,

Soit une datagrid comportant une combobox (comme décrit dans la FAQ du


site
de SyncFusion).

Dans la classe NoKeyUpCombo, on surcharge la procédure WndProc pour


filtrer
(ignorer) les éventuels appuis sur la touche TAB.

J'aimerais, dans cette procédure, récupérer l'appui simultané sur les
touches ALT + flèche vers le bas. Ceci afin de pouvoir forcer la combobox


à
se dérouler (comme toute combobox qui se respecte).

J'ai essayé avec les messages WM_KEYDOWN et WM_SYSKEYDOWN mais je n'y


arrive
pas.
Je sais qu'il faut traiter plusieurs messages successifs, mais je n'ai
certainement pas tout compris.

Un petit coup de main m'arrangerais bien !
___________
Bernard




Avatar
Bernard
Merci Yannick de la réponse...

mais mon problème, c'est ALT+Down.

Keys.F4 (ton exemple), je vois...
Keys.Alt, je vois...
Keys.Down, je vois...
mais Keys.Alt.Down, ça n'existe pas...

Je soupçonne qu'il faille traiter deux fois l'évènement, mais je ne sais
comment ...

merci quand même.
________________
Bernard


Zoury wrote:
Salut Bernard! :O)

Je n'ai pas le temps de testé pour l'instant , mais essai plutôt
d'overrider (<- c'est quoi donc le terme français ?!?)
ProcessCmdKey().

voici un exemple que j'ai posté la semaine passée :
http://groups.google.com/groups?selm=OjQRPCo7EHA.2124%40TK2MSFTNGP14.phx.gbl

La méthode WndProc() ne reçoit pas les messages WM_KEYDOWN et autres
variantes de ce genre, c'est plutôt le contrôle qui a le focus *dans*
le datagrid qui les reçoit.

note : on peut aussi se brancher directement sur les événements du
contrôle qui a le focus par l'entremise de DataGridColumnStyle...
j'avais trouvé un exemple sur le web si ça t'intéresse, mais, au
premier coup d'oeil, ça m'apparaissait moins propre et plus difficile
d'entretien..

Bonjour,

Soit une datagrid comportant une combobox (comme décrit dans la FAQ
du site de SyncFusion).

Dans la classe NoKeyUpCombo, on surcharge la procédure WndProc pour
filtrer (ignorer) les éventuels appuis sur la touche TAB.

J'aimerais, dans cette procédure, récupérer l'appui simultané sur les
touches ALT + flèche vers le bas. Ceci afin de pouvoir forcer la
combobox à se dérouler (comme toute combobox qui se respecte).

J'ai essayé avec les messages WM_KEYDOWN et WM_SYSKEYDOWN mais je
n'y arrive pas.
Je sais qu'il faut traiter plusieurs messages successifs, mais je
n'ai certainement pas tout compris.

Un petit coup de main m'arrangerais bien !
___________
Bernard




Avatar
Zoury
Salut Bernard! :O)

mais mon problème, c'est ALT+Down.
mais Keys.Alt.Down, ça n'existe pas...

Je soupçonne qu'il faille traiter deux fois l'évènement, mais je ne sais
comment ...



oui en effet, c'est assez ch... :O/
je croyais que c'était plus simple désolé pour la moitier de réponse

essai la comparaison suivante :
'***
Private Const WM_SYSKEYDOWN As Int32 = &H104
Private Const VK_DOWN As Int32 = &H28

Protected Overrides Function ProcessCmdKey(ByRef msg As
System.Windows.Forms.Message, ByVal keyData As System.Windows.Forms.Keys) As
Boolean

If (msg.Msg = WM_SYSKEYDOWN) Then
If (msg.WParam.ToInt32() = VK_DOWN) Then
If (Control.ModifierKeys = Keys.Alt) Then
Console.WriteLine("Bingo!")
Return True
End If
End If
End If

Return MyBase.ProcessCmdKey(msg, keyData)
End Function
'***

--
Cordialement
Yanick
MVP pour Visual Basic
Avatar
Bernard
Exact, ça fonctionne.

Hélas, quand l'événement est déclenché, je ne sais plus dans quelle colonne
je suis, ni si elle contient une combobox.

Décidément, la datagrid est vraiment un contrôle médiocre, ce machin est
franchement inutilisable.

Si au moins on avait un datarepeater, je me ferais un contrôle perso.

Enfin, merci quand même, je vais essayer d'autres voies.
________
Bernard


Zoury wrote:
Salut Bernard! :O)

mais mon problème, c'est ALT+Down.
mais Keys.Alt.Down, ça n'existe pas...

Je soupçonne qu'il faille traiter deux fois l'évènement, mais je ne
sais comment ...



oui en effet, c'est assez ch... :O/
je croyais que c'était plus simple désolé pour la moitier de réponse

essai la comparaison suivante :
'***
Private Const WM_SYSKEYDOWN As Int32 = &H104
Private Const VK_DOWN As Int32 = &H28

Protected Overrides Function ProcessCmdKey(ByRef msg As
System.Windows.Forms.Message, ByVal keyData As
System.Windows.Forms.Keys) As Boolean

If (msg.Msg = WM_SYSKEYDOWN) Then
If (msg.WParam.ToInt32() = VK_DOWN) Then
If (Control.ModifierKeys = Keys.Alt) Then
Console.WriteLine("Bingo!")
Return True
End If
End If
End If

Return MyBase.ProcessCmdKey(msg, keyData)
End Function
'***


Avatar
Zoury
Salut Bernard! :O)

je ne sais pas si la question est encore d'actualité, mais le DataGrid offre
l'événement CurrentCellChanged se produit lorsque la propriété CurrentCell a
été modifiée. Tu pourrais dans cette événement conserver les infos qui te
sont utiles dans des variables "globales" (au niveau de la classe
seulement). Ainsi lorsque ProcessCmdKey() se déclenche tu sauras qu'elle
cellule/colonne avait le focus.

--
Cordialement
Yanick
MVP pour Visual Basic
"Bernard" a écrit dans le message de
news:
Exact, ça fonctionne.

Hélas, quand l'événement est déclenché, je ne sais plus dans quelle


colonne
je suis, ni si elle contient une combobox.

Décidément, la datagrid est vraiment un contrôle médiocre, ce machin est
franchement inutilisable.

Si au moins on avait un datarepeater, je me ferais un contrôle perso.

Enfin, merci quand même, je vais essayer d'autres voies.
________
Bernard


Zoury wrote:
> Salut Bernard! :O)
>
>> mais mon problème, c'est ALT+Down.
>> mais Keys.Alt.Down, ça n'existe pas...
>>
>> Je soupçonne qu'il faille traiter deux fois l'évènement, mais je ne
>> sais comment ...
>
> oui en effet, c'est assez ch... :O/
> je croyais que c'était plus simple désolé pour la moitier de réponse
>
> essai la comparaison suivante :
> '***
> Private Const WM_SYSKEYDOWN As Int32 = &H104
> Private Const VK_DOWN As Int32 = &H28
>
> Protected Overrides Function ProcessCmdKey(ByRef msg As
> System.Windows.Forms.Message, ByVal keyData As
> System.Windows.Forms.Keys) As Boolean
>
> If (msg.Msg = WM_SYSKEYDOWN) Then
> If (msg.WParam.ToInt32() = VK_DOWN) Then
> If (Control.ModifierKeys = Keys.Alt) Then
> Console.WriteLine("Bingo!")
> Return True
> End If
> End If
> End If
>
> Return MyBase.ProcessCmdKey(msg, keyData)
> End Function
> '***




Avatar
Bernard
Zoury wrote:
Salut Bernard! :O)

je ne sais pas si la question est encore d'actualité, mais le
DataGrid offre l'événement CurrentCellChanged se produit lorsque la
propriété CurrentCell a été modifiée. Tu pourrais dans cette
événement conserver les infos qui te sont utiles dans des variables
"globales" (au niveau de la classe seulement). Ainsi lorsque
ProcessCmdKey() se déclenche tu sauras qu'elle cellule/colonne avait
le focus.




Ce n'est plus d'actualité, je laisse tomber DataGrid au profit de
ComponentOne TrueDbGrid
Encore merci