IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Discussion :

Utiliser les touches flèche dans un controle Edit


Sujet :

Windows

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 90
    Points : 52
    Points
    52
    Par défaut Utiliser les touches flèche dans un controle Edit
    J'ai une boite de dialogue avec plusieurs contrôles Edit. J'aimerais piloter le focus de ces contrôles avec les touches flèches plutôt qu'avec la touche de tabulation. Mais, pas question d'utiliser WM_KEYDOWN qui n'est pas reconnu au niveau d'Edit. J'ai essayé d'autre part des accélérateurs qui utiliseraient VK_UP, VK_DOWN, VK_RIGHT et VK_LEFT, eux aussi, sans succès. Maintenant, je suis nez au mur... Quelqu'un a-t-il une idée?
    Merci

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Je ne sais pas si on peut faire autrement, mais la première chose qui me vient à l'esprit, c'est subclasser les editbox (remplacer leur windowproc avec SetWindowLong(GWL_WNDPROC,...)) et intercepter le message WM_GETDLGCODE (et pour tous les autres messages, tu rappelles la WindowProc originelle avec CallWindowProc()...)
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 90
    Points : 52
    Points
    52
    Par défaut Touches Flèches dans Edit Control
    Je vais essayer, j'avoue que je ne me suis jamais servi de SetWindowLong mais il faut bien un commencement à tout...
    Merci

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 90
    Points : 52
    Points
    52
    Par défaut Touches Fleche dans un Edit Control
    Okay, avec le subclassement que vous m'avez sggéré, j'arrive bien à récupérer les touches Flèche. Mais je me trouve devant un problème bizarre. Ainsi, par exemple avec la touche "Flèche DROITE" telle que traitée ci-dessous:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
     
    WNDPROC AncWndProc;
    
    LRESULT CALLBACK EditWndProc(HWND hwndDlg,UINT Message,WPARAM wParam, LPARAM lParam)
    {
    int IdtEdt,Rng,Col;
    switch(Message)
    {
    case WM_KEYDOWN:
    switch(wParam)
    {
    case VK_RIGHT:
    IdtEdt = GetDlgCtrlID(GetFocus());
    IdtEdt++;
    SetFocus(GetDlgItem(hwndDlg,IdtEdt));
    break;
    default:
    break;
    }
    default:
    break;
    }
    
    return CallWindowProc(AncWndProc,hwndDlg,Message,wParam,lParam);
    }

    Je récupére bien:
    - L'identificateur "IdtEdt" de l'Edit Control qui a le focus au début.
    - L'incrémentation de cet identificateur s'exécute correctement.
    -¨Par contre le SetFocus vers le handle défini par GetDlgItem(hwndDlg,IdtEdt)) ne s'exécute pas. A noter, cependant, que l'édit qui avait le focus l'a bien perdu.
    Je suis perplexe...

  5. #5
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Hum...
    Le focus doi être récupéré par autre chose lors du traitement de certaines touches par la boîte de dialogue elle-même.

    Essaie en interceptant seulement WM_GETDLGCODE pour que l'EditBox ne récupère plus les flèches : La boîte de dialogue devrait fera le reste...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 90
    Points : 52
    Points
    52
    Par défaut Utiliser les touches Flèches dans un Edit Control
    J'ai essayé d'utiliser WM_GETDLGCODE de multiples maniéres et, pour simplifier les choses suivant la dernière version ci_dessous. Dans cet exemple bien précis, je teste le contenu de la structure MSG de WM_GETDLGCODE et j'y récupère bien WM_KEYDOWN dans "message" et VK_RIGHT dans "wParam". Si j'ai bien compris le but de WM_GETDLGCODE, en retournant DLGC_WANTARROWS j'évite à la boite de dialogue d'utiliser VK_RIGHT, et je peux en faire maintenant lui faire ce que je veux. C'est bien ce que j'ai fait et je me retrouve comme précédemment avec un SetFocus inopérant (sauf dans le fait qu'il supprime le focus de l'Edit dans lequel il était.)
    J'ai essayé la même démarche avec VK_TAB et DLGC_WANTALLKEYS, effectivemement le déplacement du focus avec la touche TAB ne se fait plus, donc un fonctionnnement correct de WM_GETDLGCODE, mais le SetFocus est toujours aussi inopérant, à se demander si ce n'est pas lui qui pose problème...
    Qu'en penses-tu?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
    WNDPROC AncWndProc;
    LRESULT CALLBACK EditWndProc(HWND hwndDlg,UINT Msg,WPARAM wParam,LPARAM lParam)
    {
    int IdtEdt;
    switch(Msg)
    {
    case WM_GETDLGCODE:
    {
    LPMSG lpmsg;
    if((lpmsg = (LPMSG)lParam) != NULL)
    {
    if(lpmsg->message == WM_KEYDOWN && lpmsg->wParam == VK_RIGHT)
    {
    return DLGC_WANTARROWS;
    }
    }
    }
    break;
    case WM_KEYDOWN:
    {
    if(wParam == VK_RIGHT)
    {
    // MessageBoxPrintf("EnrGrl","IdtEdt = %i\n",wParam);
    IdtEdt = GetDlgCtrlID(GetFocus());
    IdtEdt++;
    SetFocus(GetDlgItem(hwndDlg,IdtEdt));
    }
    }
    break;
    }
    return CallWindowProc(AncWndProc,hwndDlg,Msg,wParam,lParam);
    }

  7. #7
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    ben mio, je n'ai jamais utilisé WM_GETDLGCODE sur le terrain, mais c'est au contraire que je pensais: "récupérer" moins de touches que l'Edit en récupère, pour laisser la boîte de dialogue décider du focus comme si on n'avait que des boutons...

    Bref, juste modifier le code de retour pour que l'Edit ne récupère plus les flèches et laisse la boite de dialogue s'en occuper...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

Discussions similaires

  1. [WPF] catcher les flèches dans un controle TextBox
    Par NeoKript dans le forum Windows Presentation Foundation
    Réponses: 17
    Dernier message: 12/12/2009, 08h43
  2. Réponses: 2
    Dernier message: 04/05/2009, 19h06
  3. Réponses: 2
    Dernier message: 12/05/2006, 11h07
  4. Utiliser les forms Access dans un projet ADP -> SQL SERVE
    Par _developpeur_ dans le forum Projets ADP
    Réponses: 12
    Dernier message: 09/12/2005, 12h37
  5. Réponses: 2
    Dernier message: 17/09/2005, 17h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo