Как я могу унаследовать диалоговое окно MFC? - PullRequest
3 голосов
/ 18 февраля 2009

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


Большое спасибо за ваш ответ. Я не совсем уверен насчет 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 и, следовательно, я не могу добавить новые функции? Как добавить новые функции в унаследованное диалоговое окно?

Ответы [ 2 ]

6 голосов
/ 18 февраля 2009

Да, вы можете наследовать от класса, производного от 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 голосов
/ 05 сентября 2013

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

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

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

...