inheritance - los - ¿Cómo puedo heredar un cuadro de diálogo de MFC?
herencia windows forms c# (2)
Sí, puede heredar de una clase derivada de CDialog. Solo necesita agregar algunas macros como DECLARE_DYNAMIC y algunas otras para satisfacer MFC. Aquí hay un ejemplo. Puede usar esto como punto de partida:
En el archivo .h:
class cMyDialog2
: public cMyDialog
{
DECLARE_DYNAMIC(cMyDialog2)
pulic:
cMyDialog2();
virtual ~cMyDialog2();
protected:
DECLARE_MESSAGE_MAP()
};
En el archivo .cpp:
#include "cMyDialog2.h"
IMPLEMENT_DYNAMIC(cMyDialog2, cMyDialog)
BEGIN_MESSAGE_MAP(cMyDialog2, cMyDialog)
END_MESSAGE_MAP()
cMyDialog2::cMyDialog2()
{
}
...etc.
He creado un cuadro de diálogo (cMyDialog). Estoy planeando duplicar cMyDialog y llamarlo cMyDialog2. ¿Cómo puedo hacer herencia en MFC? Quiero que cMyDialog2 herede todos los IDD de cMyDialog1 para que no tenga que copiar y pegar el código de cMyDialog1 a cMyDialog2. El objetivo de cMyDialog2 es heredar todas las funciones de cMyDialog1 y agregar algunas funciones adicionales.
Muchas gracias por su respuesta. No estoy seguro del IMPLEMENT_DYNAMIC. A continuación hay un breve fragmento de mi código. ¿Puede por favor revisarlo y ayudarme si malinterpreté el 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)
}
Puedo heredar de CMyDialog mediante el método DECLARE_DYNAMIC
y el IMPLEMENT_DYNAMIC
. Muchas gracias por tu ayuda, Adam.
Pero no pude hacer funcionar la segunda parte de mi pregunta. Quería agregar algunas funciones adicionales en el cuadro de diálogo secundario, CMyDialog1, como agregar un botón "Guardar como", pero no pude hacerlo. ¿Es porque CMyDialog1 es un diálogo heredado de CMyDialog y por lo tanto, no puedo agregar nuevas funciones? ¿Cómo puedo agregar nuevas funciones en el cuadro de diálogo heredado?
Esto tal vez se considere como una adición a la respuesta de Adam Piece. También es importante comprender el rol de DoDataExchange()
cuando se deriva de otro diálogo. O la clase derivada (cMyDialog2) no implementará esta función o si se implementa (recomienda) debe llamar a la versión base de la siguiente manera:
void cMyDialog2::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
cMyDialog::DoDataExchange(pDX);
}
Si esto no se hace correctamente, los controles en el diálogo no se crearán y el diálogo puede bloquearse como resultado cuando se invoca / ejecuta.