2009-02-18 2 views
3

Я создал диалоговое окно (cMyDialog). Я планирую дублировать cMyDialog и называть его cMyDialog2. Как я могу наследовать в MFC? Я хочу, чтобы cMyDialog2 наследовал все IDD из cMyDialog1, так что мне не нужно копировать и вставлять код из cMyDialog1 в cMyDialog2. Цель cMyDialog2 - наследовать все функции из cMyDialog1 и добавить в нее некоторые дополнительные функции.Как я могу наследовать диалоговое окно MFC?


Большое спасибо за ваш ответ. Я не совсем уверен в IMPLEMENT_DYNAMIC. Ниже приведен короткий фрагмент моего кода. Можете ли вы просмотреть его и помочь мне, если я неправильно понял макрос?

// 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) 
} 

Я могу наследовать от CMyDialog с помощью метода DECLARE_DYNAMIC и IMPLEMENT_DYNAMIC. Большое спасибо за вашу помощь, Адам.

Но мне не удалось получить вторую часть моего вопроса для работы. Я хотел добавить некоторые дополнительные функции в дочернем диалоговом окне CMyDialog1, например, добавить кнопку «Сохранить как», но я не смог это сделать. Это потому, что CMyDialog1 является наследуемым диалогом из CMyDialog и, следовательно, я не могу добавить в новые функции? Как добавить новые функции в наследуемом диалоговом окне?

ответ

6

Да, вы можете наследовать из класса, полученного из CDialog. Вам просто нужно добавить несколько макросов, таких как DECLARE_DYNAMIC и несколько других, чтобы удовлетворить MFC. Вот пример. Вы можете использовать это в качестве отправной точки:

В файле .h:

class cMyDialog2 
    : public cMyDialog 
{ 
    DECLARE_DYNAMIC(cMyDialog2) 

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

protected: 
    DECLARE_MESSAGE_MAP() 
}; 

В файле .cpp:

#include "cMyDialog2.h" 

IMPLEMENT_DYNAMIC(cMyDialog2, cMyDialog) 

BEGIN_MESSAGE_MAP(cMyDialog2, cMyDialog) 
END_MESSAGE_MAP() 

cMyDialog2::cMyDialog2() 
{ 
} 

...etc. 
0

Это может быть рассмотрен в качестве добавления к Адаму Кусочек ответ. Также важно понять роль DoDataExchange() при построении из другого диалогового окна. Либо производный класс (cMyDialog2) не должен осуществлять эту функцию, или если она реализована (рекомендуется) он должен вызвать базовую версию этого, как показано ниже:

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

Если это не будет сделано правильно, элементы управления в диалоговом окне будет не создаваться, и в результате при вызове/выполнении может произойти сбой в диалоговом окне.