2009-02-18 9 views
3

J'ai créé une boîte de dialogue (cMyDialog). J'ai l'intention de dupliquer cMyDialog et de l'appeler cMyDialog2. Comment puis-je faire de l'héritage dans MFC? Je veux que cMyDialog2 hérite de tous les IDD de cMyDialog1 pour que je n'aie pas à copier et coller le code de cMyDialog1 à cMyDialog2. Le but de cMyDialog2 est d'hériter de toutes les fonctions de cMyDialog1 et d'y ajouter des fonctions supplémentaires.Comment puis-je hériter d'une boîte de dialogue MFC?


Merci beaucoup pour votre réponse. Je ne suis pas tout à fait sûr de l'IMPLEMENT_DYNAMIC. Voici un petit extrait de mon code. Pouvez-vous s'il vous plaît l'examiner et m'aider si j'ai mal compris la macro?

// cMyDialog1.cpp : implementation file 

cMyDialog1::cMyDialog1(void * pMsgData, CWnd* pParent /*=NULL*/): CDialog(cMyDialog1::IDD, pParent) 

{ //codes.... 
} 

BOOL cMyDialog1::OnInitDialog() 

{ 
    CDialog::OnInitDialog(); 
... 
} 


//cMyDialog2.cpp 

cMyDialog2::cMyDialog2(void * pMsgData, CWnd* pParent /*=NULL*/) 
    : CMyDialog1(cMyDialog2::IDD, pParent) 

{ //codes.... 
    IMPLEMENT_DYNAMIC(cMyDialog2, cMyDialog1) 
} 

Je suis en mesure d'hériter de CMyDialog via la méthode DECLARE_DYNAMIC et IMPLEMENT_DYNAMIC. Merci beaucoup pour votre aide, Adam.

Mais je n'ai pas réussi à faire fonctionner la deuxième partie de ma question. Je voulais ajouter quelques fonctions supplémentaires dans la boîte de dialogue enfant, CMyDialog1, comme l'ajout d'un bouton "Enregistrer sous", mais je ne pouvais pas le faire. Est-ce parce que CMyDialog1 est un dialogue hérité de CMyDialog et par conséquent, je ne peux pas ajouter de nouvelles fonctions? Comment puis-je ajouter de nouvelles fonctions dans la boîte de dialogue héritée?

Répondre

6

Oui, vous pouvez hériter d'une classe dérivée de CDialog. Vous avez juste besoin d'ajouter quelques macros comme DECLARE_DYNAMIC et quelques autres pour satisfaire MFC. Voici un exemple. Vous pouvez l'utiliser comme point de départ:

Dans le fichier .h:

class cMyDialog2 
    : public cMyDialog 
{ 
    DECLARE_DYNAMIC(cMyDialog2) 

pulic: 
    cMyDialog2(); 
    virtual ~cMyDialog2(); 

protected: 
    DECLARE_MESSAGE_MAP() 
}; 

Dans le fichier .cpp:

#include "cMyDialog2.h" 

IMPLEMENT_DYNAMIC(cMyDialog2, cMyDialog) 

BEGIN_MESSAGE_MAP(cMyDialog2, cMyDialog) 
END_MESSAGE_MAP() 

cMyDialog2::cMyDialog2() 
{ 
} 

...etc. 
0

Ceci peut être considéré comme additif à Adam réponse Piece. Il est également important de comprendre le rôle de DoDataExchange() lors de la dérivation d'une autre boîte de dialogue. Soit la classe dérivée (cMyDialog2) ne doit pas mettre en œuvre cette fonction ou si elle est mise en œuvre (recommandé), il doit appeler la version de base comme ci-dessous:

void cMyDialog2::DoDataExchange(CDataExchange* pDX) 
{ 
    CDialog::DoDataExchange(pDX); 
    cMyDialog::DoDataExchange(pDX); 
} 

Si cela ne se fait pas correctement, les commandes de la boîte de dialogue sera pas être créé et le dialogue peut se bloquer en conséquence lors de l'invocation/exécution.