[C con Clase] DialogBox

Salvador Pozo salvapozo en gmail.com
Lun Jun 20 16:44:12 CEST 2016


El pasado 2016-06-19 15:53:22, Antonio Escalante escribió:
 
AE> Hola, si es justo lo que estaba buscando muchas gracias. Un par de dudas,
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?

Hola:

Llamar a DialogBoxParam desde el constructor es sólo una opción. 

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.

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:
----8<------
class CCDialog {
public:
    CCDialog() {}
    ~CCDialog() {}
    void Ejecutar();
    void Init(HINSTANCE hInst, char* rec, HWND hwnd, LPARAM lparam) {
        hInstance= hInst;
        strcpy(recurso,rec);
        hWnd = hwnd;
        lParam = lparam;
    }
private:
    HINSTANCE hInstance;
    char recurso[64];
    HWND hWnd;
    LPARAM lParam;
    static BOOL CALLBACK DlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam);

};


void CCDialog::Ejecutar() {
    DialogBoxParam(hInstance, recurso, hWnd, (DLGPROC)&DlgProc, lParam);
}

BOOL CALLBACK CCDialog::DlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch (msg)                  /* manipulador del mensaje */
    {
        case WM_INITDIALOG:
            return TRUE;
        case WM_COMMAND:
            switch(LOWORD(wParam)) {
                case IDOK:
                    EndDialog(hDlg, FALSE);
                    break;
            }
            return TRUE;
    }
    return FALSE;
}
----8<------

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".

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.

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

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.

Hasta pronto.



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