Originariamente inviato da MRj92
ci avevo pensato anch'io però non mi piace tanto... come hai detto tu è la più "sporca".
In certi casi l'ho usata. Tanto la programmazione a livello di API Win32 è tutto tranne che elegante/pulita/lineare....

Originariamente inviato da MRj92
non ci ho capito molto... soprattutto dal "tenerlo vivo" in poi...
Significa sostanzialmente:

a) Definire ad esempio una struttura:
codice:
typedef struct
{
    CHAR username[30];
} LOGIN, *PLOGIN;
b) Quando devi aprire la dialog-box si usa DialogBoxParam e si passa l'indirizzo alla struttura:
codice:
LOGIN login;
DialogBoxParam (hInstance, ........, DialogProc, (LPARAM) &login);
Nota che 'login' va anche bene se è una variabile locale. È sufficiente che esista fino a quando ti serve. Quando DialogBoxParam termina farai qualcosa con quel campo username.

c) In risposta a WM_INITDIALOG:
codice:
case WM_INITDIALOG:
    SetWindowLongPtr (hDlg, DWLP_USER, (LONG_PTR) lParam);
    return TRUE;
In questo modo lParam (che contiene il puntatore alla struttura) è salvato in una area riservata e associata alla finestra). Così è sempre disponibile, anche successivamente quando ricevi altri messaggi.

d) A seguito di una autenticazione con successo, dovrai chiudere la dialog e restituire lo username:
codice:
....
PLOGIN plogin;
plogin = (PLOGIN) GetWindowLongPtr (hDlg, DWLP_USER);
GetDlgItemText (hDlg, IDC_USERNAME, plogin->username, sizeof (plogin->username));
EndDialog (hDlg, 1);
....
Come vedi nulla di trascendentale. Io ho usato una struttura perché in genere è comoda, se si dovessero aggiungere altri campi i vari step fatti non cambiano.

Originariamente inviato da MRj92
mi ispira assai!! potresti approfondire un po'?
I messaggi custom specifici per una applicazione partono da WM_USER in poi, nel tuo caso ad esempio:

codice:
#define WM_LOGINSUCCESS    (WM_USER+0)
Quando determini che la autenticazione ha avuto successo fai:

codice:
char username[30];

GetDlgItemText (hDlg, IDC_USERNAME, username, sizeof (username));
SendMessage (GetParent (hDlg), WM_LOGINSUCCESS, 0, (LPARAM)(LPSTR) username);
La window-procedure del padre della dialog riceverà il messaggio:
codice:
case WM_LOGINSUCCESS:
{
    LPSTR lpszUsername = (LPSTR) lParam;

    .....fai quello che vuoi....
    return 0;
}
Nota che SendMessage è sincrona, chiama la window-procedure e ritorna solo quando la w.p. ritorna. Questo vuol dire che se anche la variabile 'username' è locale, "vive" sicuramente fino a quando la SendMessage ritorna, che è ciò che serve.