[C con Clase] DialogBox

Antonio Escalante gravitonio en gmail.com
Mar Jun 21 16:15:13 CEST 2016


Hola, funciona perfectamente mil gracias.

Mi idea es crear una clase base CDialogo y varios dialogos cada uno con su clase digamos personalizada dependiendo de los controles que lleve y los mensajes que procese. Ahora me surge la cuestion de que al ser el procedimento del dialogo static puedo heredarlo pero no puedo hacerle un 'override'

He leido que los metodos static no tienen entrada en la vtable y pues no pueden ser virtuales. Que deberia hacer? olvidarme de la herencia? crear un clase que englobe todos los dialogos y luego cada cual que use la parte que necesita? hacerlo virtual? pero como?

El pasado 2016-06-20 14:44:12, Salvador Pozo escribió:
 
SP> El pasado 2016-06-19 15:53:22, Antonio Escalante escribió:
SP>  
SP> AE> Hola, si es justo lo que estaba buscando muchas gracias. Un par de dudas,
SP> AE> 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?
SP> Hola:
SP> Llamar a DialogBoxParam desde el constructor es sólo una opción. 
SP> En el ejemplo que envié el otro día, efectivamente habría que invocar el cuadro de diálogo usando el operador new con un puntero a un objeto de la clase CCDialog.
SP> Puedes añadir un método a la clase para hacer ejecutar el cuadro de diálogo, de modo que la declaración del objeto no lo ejecute automáticamente. Por ejemplo:
SP> ----8<------
SP> class CCDialog {
SP> public:
SP>     CCDialog() {}
SP>     ~CCDialog() {}
SP>     void Ejecutar();
SP>     void Init(HINSTANCE hInst, char* rec, HWND hwnd, LPARAM lparam) {
SP>         hInstance= hInst;
SP>         strcpy(recurso,rec);
SP>         hWnd = hwnd;
SP>         lParam = lparam;
SP>     }
SP> private:
SP>     HINSTANCE hInstance;
SP>     char recurso[64];
SP>     HWND hWnd;
SP>     LPARAM lParam;
SP>     static BOOL CALLBACK DlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam);
SP> };
SP> void CCDialog::Ejecutar() {
SP>     DialogBoxParam(hInstance, recurso, hWnd, (DLGPROC)&DlgProc, lParam);
SP> }
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> ----8<------
SP> En este caso puedes declarar un objeto de la clase CCDialog, iniciar sus miembros cuando sea necesario, e invocarlo cuando quieras usando el método "Ejecutar".
SP> La idea, cuando se encapsulan partes de un API, es hacerlo con más cosas. Por ejemplo, sería relativamente sencillo encapsular algunos controles comunes e insertarlos en tu diálogo durante la ejecución.
SP> AE> CCDialog::CCDialog(HINSTANCE hInstance, char* recurso, HWND hwnd, LPARAM lParam). 
SP> AE> Con char *recurso te refieres al ID del dialogo? tal que MAKEINTRESOURCE(IDD_DIALOGO)?
SP> Efectivamente. A mi me gusta más usar cadenas para identificar los cuadros de diálogo creados a partir de ficheros de recursos, pero probablemente, en este caso, sea más sencillo usar un entero y la macro MAKEINTRESOURCE para eso.
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