[C con Clase] DialogBox

Antonio Escalante gravitonio en gmail.com
Dom Jun 19 17:53:22 CEST 2016


Hola, si es justo lo que estaba buscando muchas gracias. Un par de dudas,

A  DialogBoxParam se le llama desde el constructor de la clase. Deberia declarar la clase CCDialog con el operador new? cuando se hace click en el menu de la ventana principal que deberia lanzar el dialogo? sino como hago para llamar al constructor justo cuando quiero que se muestre el dialogo?

CCDialog::CCDialog(HINSTANCE hInstance, char* recurso, HWND hwnd, LPARAM lParam). 
Con char *recurso te refieres al ID del dialogo? tal que MAKEINTRESOURCE(IDD_DIALOGO)?

Gracias de nuevo.



El pasado 2016-06-17 14:49:55, Salvador Pozo escribió:
 
SP> El pasado 2016-06-16 17:50:25, Antonio Escalante escribió:
SP>  
SP> AE> Hola grupo,
SP> AE> Necesito ayuda con la funcion DialogBox. La idea es llevarme el
SP> AE> procedimiento de un dialogo a una funcion de una clase fuera del .cpp
SP> AE> principal.
SP> AE> Por ejemplo, dada una clase (claseEjemplo) la idea seria que al clickear
SP> AE> una entrada del menu (ID_LANZA_DIALOGO) se lanzara el dialogo definido
SP> AE> en el cpp de la clase aparte. Seria algo asi:
SP> AE> (en el .cpp principal)
SP> AE> case WM_COMMAND:
SP> AE>    switch(LOWORD(wParam))
SP> AE>       case ID_LANZA_DIALOGO:
SP> AE>          DialogBox(GetModuleHandle(NULL),
SP> AE> MAKEINTRESOURCE(IDD_DIALOGO_NEWUSER), hwnd, claseEjemplo.dialogo(HWND hwnd,
SP> AE> UINT msg, WPARAM wParam, LPARAM lParam)
SP> AE> De que tipo deberia ser el dialogo en prototipo DLGPROC? BOOL CALLBACK?. Lo
SP> AE> que he leido en google no me ha aclarado nada.
SP> AE> Alguien podria explicarmelo sin complicarlo mucho?. Muchas gracias.
SP> Hola:
SP> Entiendo que quieres, al menos en cierto modo, encapsular un cuadro de diálogo en una clase.
SP> Hace tiempo estuve investigando sobre este tema. Al final tuve que acudir al código fuente de otros encapsulados, como MFC, y por lo que recuerdo, los procedimientos de ventana tienen que ser estáticos, es decir, todas las ventanas de la misma clase deben compartir el mismo procedimiento de ventana, y lo mismo se aplica a cuadros de diálogo.
SP> Te pongo un ejemplo sencillo, espero que te aclare algunas cosas.
SP> ----8<------
SP> #define ID_BOTON 100
SP> class CCDialog {
SP> public:
SP>     CCDialog(HINSTANCE hInstance, char* recurso, HWND hwnd, LPARAM lParam);
SP>     ~CCDialog();
SP> private:
SP>     // Procedimiento de diálogo estático:
SP>     static BOOL CALLBACK DlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam);
SP> };
SP> // Constructor
SP> CCDialog::CCDialog(HINSTANCE hInstance, char* recurso, HWND hwnd, LPARAM lParam) {
SP>     DialogBoxParam(hInstance, recurso, hwnd, (DLGPROC)&DlgProc, lParam);
SP> }
SP> // Destructor
SP> CCDialog::~CCDialog();
SP> // Procedimiento de diálogo
SP> BOOL CALLBACK CCDialog::DlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
SP> {
SP>     switch (msg)                  /* manipulador del mensaje */
SP>     {
SP>         case WM_INITDIALOG:
SP>             return TRUE;
SP>         case WM_COMMAND:
SP>             switch(LOWORD(wParam)) {
SP>                 case IDOK:
SP>                     EndDialog(hDlg, FALSE);
SP>                     break;
SP>             }
SP>             return TRUE;
SP>     }
SP>     return FALSE;
SP> }
SP> ...
SP> // Al crear el diálogo, se ejecuta automáticamente:
SP> CCDialog *dialogo = new CCDialog(hInstance, "Dialogo", hwnd, 0);
SP> ----8<------
SP> MFC declara además el procedimiento de diálogo como virtual, de modo que cuando se crean diálogos basados en CDialog, se puede redefinir el procedimiento de diálogo, y siempre se puede invocar al procedimiento padre.
SP> Por supuesto, se pueden añadir funciones miembro para procesar mensajes concretos, como WM_INITDIALOG, que añadiría los controles e iniciaría miembros de la clase, y se pueden añadir datos miembro, de modo que el procedimiento de diálogo puede acceder a los correctos, usando el puntero this.
SP> Desconozco si hay métodos alternativos, pero esto funciona.
SP> Hasta pronto.
SP> _______________________________________________
SP> Lista de correo Cconclase Cconclase en listas.conclase.net
SP> http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
SP> Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ


Más información sobre la lista de distribución Cconclase