Bonjour,
voilà une partie du code générer quand on crée un nouveau projet mfc (B dialog)
BEGIN_MESSAGE_MAP(CtestApp, CWinApp)
ON_COMMAND(ID_HELP, &CWinApp::OnHelp)
END_MESSAGE_MAP()
J'aimerai bien si vous pouvez mz commenter lces tois lignes.
Merci
Version imprimable
Bonjour,
voilà une partie du code générer quand on crée un nouveau projet mfc (B dialog)
BEGIN_MESSAGE_MAP(CtestApp, CWinApp)
ON_COMMAND(ID_HELP, &CWinApp::OnHelp)
END_MESSAGE_MAP()
J'aimerai bien si vous pouvez mz commenter lces tois lignes.
Merci
La Message Map est une liste de structures contenant notamment ID de message & pointeur de fonction membre vers la fonction membre qui traitera le message.
(Chaque structrure contient aussi d'autres infos, comme notamment ici un ID de commande).
ON_COMMAND() définit une telle structure pour déclarer que si la fenêtre reçoit un message WM_COMMAND avec l'ID de commande ID_HELP, la fonction membre OnHelp() sera appelée.
BEGIN_MESSAGE_MAP() déclare le début de la liste en question, et END_MESSAGE_MAP() est typiquement juste une accolade fermante (et peut-être d'autres trucs après).
On n'a pas à se soucier de ce que ces macros contiennent vraiment, même si c'est instructif au sujet des entrailles des MFC.
en fait ce n'est pas trop laire pour moi ! dsl mais mes connaissances sont trop limités en ça!
sinon j'aimerai bien tu peux me donner un exemple de ce que tu m'as dis : quand la fenêtre reçoit un message WM_COMMAND avec l'ID de commande ID_HELP. et où exactement on le trouve dans le progmmme ?
MERCI ;)
As-tu déjà programmé en Win32 fenêtré? c'est dans ce contexte qu'on parle de "message de fenêtre", et MFC est une surcouche par-dessus ça.
Bonjour Médinoc,
Malheuresement non j'ai aucune expérience en win32! en fait c'est la 1ere fois que j'utilse MFC (après moins de 2 mois d'expérience en c++) ! (je suis plus orienté vers le c embarqué et Matlab) mais bon je suis obligé d'apprendre rappidement pour gérer mon stage :'( j'espère que tu m'as compris !:cry:
sinon dans le même projet et dans la classe monAppDlg y a ces intructions:
1 BEGIN_MESSAGE_MAP(CtestDlg, CDialogEx)
2 ON_WM_SYSCOMMAND()
3 ON_WM_PAINT()
4 ON_WM_QUERYDRAGICON()
5 ON_BN_CLICKED(IDC_BUTTON1, &CtestDlg::OnBnClickedButton1)
6 ON_BN_CLICKED(IDC_BUTTON2, &CtestDlg::OnBnClickedButton2)
7 ON_BN_CLICKED(IDOK, &CtestDlg::OnBnClickedOk)
END_MESSAGE_MAP()
par exemple l'instruction N°5 je l'ai bien compris:ID de message=IDC_BUTTON1
pointeur de fonction membre vers la fonction membre = &CtestDlg::OnBnClickedButton1 (c'est là où on va définir le traitement qui suit chaque clic sur ce boutton )
je vois que y a plusieurs macro en fait(ON_BN_CLICKED, ON_COMMAND,ON_WM_PAINT... ), et je ne sais pas si je vais arriver à les métiriser tous et faire la différences entre eux ! :calim2:
Faire du MFC avant de connaître Win32, c'est vachement difficile.
Voici une petite piqure de rappel sur Win32:
En gros, chaque événement qui se produit sur une fenêtre est appelé un message, qui consiste en un ID définie par une constante (WM_COMMAND, WM_PAINT, WM_SYSCOMMAND...) et optionnellement des paramètres, regroupés en deux intptr_t appelés "wParam" et "lParam" pour des raisons qui remontent aux Windows 16 bits.
À chaque événement Win32, la procédure de fenêtre (ou la procédure de boîte de dialogue, légèrement différente) est appelée, avec l'ID de message et ses paramètres. Typiquement, elle fait un switch() sur l'ID de message et bosse dessus:
Dans la bibliothèque de MFC, il y a une procédure de fenêtre qui fait la même chose, mais au lieu de faire des switch(), elle parcoure la Message Map à la place, pour appeler la bonne fonction.Code:
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
34
35
36
37 INT_PTR CALLBACK DialogProcedure( HWND hWnd, //Handle de fenêtre de la boîte de dialogue UINT message, //ID de message, WPARAM wParam, //premier intptr_t LPARAM lParam //second intptr_t ) { INT_PTR messageTraite = TRUE; switch(message) { case WM_COMMAND: { /*Extrait trois paramètres*/ unsigned short idCommande = LOWORD(wParam); unsigned short notification = HIWORD(wParam); HWND hWndControle = (HWND)lParam; //Handle de fenêtre du bouton /*Travail sur la notification, souvent avec un switch() sur idCommande */ switch(idCommande) { case IDC_BUTTON1: MonTraitementSiBouton1Clique(hWnd, notification, hWndControle); break; default: messageTraite = FALSE; break; } } break; case WM_PAINT: /*Dessine le contenu de la fenêtre*/ break; default: messageTraite = FALSE; break; } return messageTraite; }
La ligne ON_BN_CLICKED(IDC_BUTTON1, &CtestDlg::OnBnClickedButton1) signifie que quand un message WM_COMMAND sera reçu avec wParam contenant les valeurs BN_CLICKED et IDC_BUTTON1, la procédure de fenêtre appellera OnBnClickedButton1().
beaucoup plus claire merci Médinoc :ccool:
sinon tu peux me dire que est ce qu'elle fait la fonction membre OnHelp() sera appelée ? en fait je n'ai pas son effet durant l'excution du programme !
Désolé, les Message Maps hors des fenêtres (ici, c'est dans CWinApp, qui hérite de CWinThread), ça sort un peu de mes compétences. Mais il y a des chances que ça arrive quand ton thread principal reçoit un message WM_HELP qui n'est pas déstiné à une fenêtre en particulier (PostThreadMessage() permet ça). Il doit y avoir certains contrôles MFC qui font ça...
ok je voie merci Médinoc :ccool:
sinon dans un projet SDI ou MDI, est ce que on peut rajouter un bouton ou una autre composant en utilisant la boite à Outil ?
Dans un projet Based Dialog on peut faire ça il suffit aller au (fichiers de ressources -> Dialog ) et on glisse que est ce qu'on veut par contre en SDI et MDI je n'ai pas trouvé la fentre principale! que les fentres de boite dialogue qui sont dans le dossier Dialog :?
Tu dois au moins pouvoir modifier les Toolbars de ta fenêtre SDI ou MDI avec les ressources.
Si tu utilises le "Document / View model", tu dois aussi pouvoir arranger certaines vues (notamment, les CFormView sont des boîtes de dialogue aussi).
Mais généralement, ce qu'on rajoute dans la fenêtre principale (qui peut être aussi simple qu'une EditBox qui fait toute la fenêtre), il faut l'intégrer "à la main", dans le code. Très dûr si tu ne t'y connais pas déjà, donc je te conseillerais de te limiter aux boîtes de dialogues et aux CFormView.
oui je te comprends mais là j'ai arrivé à bien manipuler les boites de dialogue et il faut que je passe maintenant au applications de type SDI ou MDI qui sont similaires à l'application sur la quelle je devrais travailler ;)
mais ta réponse était claire " ...il faut l'intégrer 'à la main' ..." et c'était ce que je cherchais à savoir !
Merciiii Médinoc :ccool: