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

MFC Discussion :

La macro ON_COMMAND


Sujet :

MFC

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2011
    Messages : 47
    Points : 50
    Points
    50
    Par défaut La macro ON_COMMAND
    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

  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 518
    Points
    41 518
    Par défaut
    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.
    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
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2011
    Messages : 47
    Points : 50
    Points
    50
    Par défaut
    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

  4. #4
    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 518
    Points
    41 518
    Par défaut
    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.
    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.

  5. #5
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2011
    Messages : 47
    Points : 50
    Points
    50
    Par défaut
    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 !

    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 !

  6. #6
    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 518
    Points
    41 518
    Par défaut
    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:
    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
    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;
    }
    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.

    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().
    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.

  7. #7
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2011
    Messages : 47
    Points : 50
    Points
    50
    Par défaut
    beaucoup plus claire merci Médinoc

    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 !

  8. #8
    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 518
    Points
    41 518
    Par défaut
    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...
    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.

  9. #9
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2011
    Messages : 47
    Points : 50
    Points
    50
    Par défaut
    ok je voie merci Médinoc

  10. #10
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2011
    Messages : 47
    Points : 50
    Points
    50
    Par défaut
    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

  11. #11
    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 518
    Points
    41 518
    Par défaut
    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.
    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.

  12. #12
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2011
    Messages : 47
    Points : 50
    Points
    50
    Par défaut
    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

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [VB6] Exécuter une macro Access
    Par Nektanebos dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 22/02/2006, 17h32
  2. [VBA-E] Macro ouverture fichier déja ouvert
    Par bhaal76 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 18/12/2002, 15h30
  3. [VBA-E] [Excel] Lancer une macro à une heure donnée
    Par Lysis dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 16/10/2002, 13h15
  4. Qu'est-ce qu'une macro ?
    Par karli dans le forum Assembleur
    Réponses: 2
    Dernier message: 01/09/2002, 04h38
  5. Réponses: 2
    Dernier message: 22/07/2002, 13h13

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