Raccourcis des menus dans une dialog [Résolu]

Signaler
Messages postés
787
Date d'inscription
samedi 8 juin 2002
Statut
Membre
Dernière intervention
7 juin 2007
-
Messages postés
787
Date d'inscription
samedi 8 juin 2002
Statut
Membre
Dernière intervention
7 juin 2007
-
Bonjour,

J'utilise une DIALOG déclarée dans les ressources de mon programme et appelée avec DialogBox. Cette boîte de dialogue disposant d'un menu, j'aimerais savoir comment m'y prendre pour gérer les raccourcis correspondants (par exemple, Ctrl+O => Ouvrir) ? Auparavant j'utilisais TranslateAccelerator, mais là je n'ai pas de pompe à messages...

Merci d'avance pour votre aide.

6 réponses

Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
27
Mets un hook sur ta dialog et pour chaque cas qui correspond a tes menus tu envoies un PostMessage(hdlg, WM_COMMAND, monID, 0);

ciao...
BruNews, MVP VC++
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
27
Si on se sert d'un hook, on n'a pas besoin d'accelerator Table, c'est bien plus souple comme gestion et tu peux faire ce que tu veux.
Un exemple ici:
http://www.cppfrance.com/code.aspx?id=11007

ciao...
BruNews, MVP VC++
Messages postés
787
Date d'inscription
samedi 8 juin 2002
Statut
Membre
Dernière intervention
7 juin 2007
1
Merci, je m'y met de suite (çà va être pratique çà tiens !)
Messages postés
787
Date d'inscription
samedi 8 juin 2002
Statut
Membre
Dernière intervention
7 juin 2007
1
Bon j'ai mis mon hook local, et voici la procédure de hook (plus gérable que traiter manuellement les raccourcis) :

LRESULT CALLBACK MsgProc(INT nCode, WPARAM wParam, LPARAM lParam) {
if (nCode == HC_ACTION) {
TranslateAccelerator(hMainDlg, hMainAccel, (LPMSG) lParam);
}
return 0;
}

Mais comment dire à l'application que le message a été traité (c'est à dire que quand MsgProc se termine, passer au message suivant si TranslateAccelerator a déjà fait le travail) ?

Par exemple, j'ai un bouton "&Bouh" et un menu "&Bouh\aCtrl+B". Quand je fais Ctrl+B, çà affiche une MsgBox (celle du menu, j'ai vérifié en regardant HIWORD(wParam) dans la DlgProc), puis une autre MsgBox (celle du bouton, cette fois) ! Ce qui est assez contrariant :-/
Messages postés
787
Date d'inscription
samedi 8 juin 2002
Statut
Membre
Dernière intervention
7 juin 2007
1
J'ai trouvé un workaround, mais je ne sais pas si c'est très propre :

if (TranslateAccelerator(hMainDlg, hMainAccel, (LPMSG) lParam) != 0) {
ZeroMemory(lParam, sizeof(MSG));
}
Messages postés
787
Date d'inscription
samedi 8 juin 2002
Statut
Membre
Dernière intervention
7 juin 2007
1
Aaah ouais, c'est carrément plus simple et efficace, en fait. Merci !