Raccourcis des menus dans une dialog

Résolu
cs_Nebula Messages postés 787 Date d'inscription samedi 8 juin 2002 Statut Membre Dernière intervention 7 juin 2007 - 28 déc. 2004 à 08:45
cs_Nebula Messages postés 787 Date d'inscription samedi 8 juin 2002 Statut Membre Dernière intervention 7 juin 2007 - 28 déc. 2004 à 18:00
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

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
28 déc. 2004 à 11:14
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++
3
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
28 déc. 2004 à 17:48
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++
3
cs_Nebula Messages postés 787 Date d'inscription samedi 8 juin 2002 Statut Membre Dernière intervention 7 juin 2007 2
28 déc. 2004 à 14:42
Merci, je m'y met de suite (çà va être pratique çà tiens !)
0
cs_Nebula Messages postés 787 Date d'inscription samedi 8 juin 2002 Statut Membre Dernière intervention 7 juin 2007 2
28 déc. 2004 à 17:01
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 :-/
0

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

Posez votre question
cs_Nebula Messages postés 787 Date d'inscription samedi 8 juin 2002 Statut Membre Dernière intervention 7 juin 2007 2
28 déc. 2004 à 17:35
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));
}
0
cs_Nebula Messages postés 787 Date d'inscription samedi 8 juin 2002 Statut Membre Dernière intervention 7 juin 2007 2
28 déc. 2004 à 18:00
Aaah ouais, c'est carrément plus simple et efficace, en fait. Merci !
0
Rejoignez-nous