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.