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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    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
    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
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    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 confirmé
    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
    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
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    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 confirmé
    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
    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
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    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.

+ 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, 16h32
  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, 14h30
  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, 12h15
  4. Qu'est-ce qu'une macro ?
    Par karli dans le forum Assembleur
    Réponses: 2
    Dernier message: 01/09/2002, 03h38
  5. Réponses: 2
    Dernier message: 22/07/2002, 12h13

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