Newsgroup: it.comp.programmare.win32
Titolo: Smistare messaggi "a mano"

Per esercizio privato, sto' scrivendo una Dialog che non abbia
una DialogProc in fase di creazione, ma che venga richiamata
quando arrivano i messaggi...
Sono poco chiaro? Eccovi la WinMain :)
int WINAPI WinMain(ecc.ecc.ecc.){
   hNoModalDialog=CreateDialog(hInstance,
            MAKEINTRESOURCE (IDD_NOMODAL),NULL,NULL);
    // Il dialog viene creato, nessun errore...
     ShowWindow(hNoModalDialog,SW_SHOW);
    // Questa ShowWindows ha senso? Non manda un mex alla WinProc?
    MSG msg;
    while(GetMessage(&msg,NULL,0,0)) {
         if(msg.hwnd==hNoModalDialog)        // Se il messaggio e' diretto alla dialog, lo instrado
                 NoModalDialogProc(msg.hwnd,msg.message,msg.wParam,msg.lParam);
    }
    return 0;
}
Adesso ho un paio di problemi:
Come gestisco i messaggi che non voglio usare "a mano"? Ho inserito una DefWindowsProc,
 ma sembra non andare :/
Secondo voi, perche' non arriva mai un WM_CLOSE alla mia Dialog? Eppure clicco su X...
Che messaggio e' quello con codice 15? Mi arriva di continuo...
Grazie dei chiarimenti che mi darete :)
Bow-wow
Killer

: 

La tua dialog ha una wndproc (DefDlgProc) che gestisce il processing dei 
messaggi.
Il tuo loop dei messaggi modificato intercetta i messaggi passati con 
PostMessage (o con SendMessage da altri thread), ma potrebbe "mancare" i 
messaggi inviati con SendMessage dallo stesso thread (ex: quando crei la 
dialog, quando la visualizzi e quando la chiudi) e i messaggi gestiti con 
qualche "scorciatoia" dentro la window proc standard delle dialog (che 
magari si richiama ricorsivamente o richiama direttamente la dialogproc 
senza passare per un messaggio...).
Per provare potresti inserire come dialog proc una procedura che si limita 
a fare una OutputDebugString del messaggio ricevuto e verificare quali 
messaggi passano per la dialog proc e non per il message loop.
P.S. capisco lo scopo "didattico" della prova, ma normalmente la comodità 
di una dialog è proprio il fatto di non doversi scrivere "a manina" la 
gestione di tutta una serie di messaggi che vengono gestiti dalla WndProc 
di default delle dialog (ex: gestione dei tab), tanto che, nel caso di 
programmi molto semplici, preferisco utilizzare una dialog come finestra 
principale dell'applicazione, sostituendo al message loop "tradizionale" 
una chiamata a DialogBox.
-- 
Valter Minute
min...@inwind.it
 (the reply address of this message is invalid)

 una chiamata a DialogBox.
Faccio anch'io cosi' (anche perche' per adesso non faccio applicazioni molto
complesse), ma lo scopo "didattico" aveva un fine piu' pratico...
Sto' realizzando (come penso abbiano fatto un po' tutti quando hanno iniziato
a programmare in Win32) un insieme di classi (in C++) per gestire le varie
parti di un programma Win32 (dialog, finestre, butto ecc..)
Il problema e' che la DialogBox richiede l'indirizzo di una funzione che non puo'
essere un membro di una classe (se non istanziata): so' che e' un problema comune,
ma prima di leggere un modo per ovviare a questo problema, volevo trovare una
soluzione da solo, e avevo pensato che un loop come quello che avevo presentato
poteva essere una soluzione. Sembra che mi sbaglio :/
Grazie, cmq, per la risposta :)
Bow-wow
Killer


Puoi utilizzare Get/SetWindowLong per associare un puntatore (4 byte, come 
un long) a una specifica finestra. Ovviamente dovrai riservare 4 byte in 
più per ogni finestra (member cbWndExtra della struttura WNDCLASS). Tieni 
presente che, nel caso delle dialog, dovrai riservare DLGWINDOWEXTRA+4 
bytes per ogni finestra.
Con CreateWindow e DialogBoxParam puoi passare un parametro "user" alla 
finesta, passagli il "this" pointer del tuo oggetto in modo da poterlo 
associare alla classe durante il processing di WM_NCCREATE (primo messaggio 
inviato alla finestra).
In questo modo la WndProc della tua finestra potrà richiamare membri 
dell'oggetto associato ad una specifica finestra.
Ovviamente questo metodo ha un overhead che però non dovrebbe essere 
percepibile se non in casi particolari.
Altre librerie (ATL, ad esempio) ricorrono a trucchi un po' più "sporchi" 
(thunking e simili) per ridurre le operazioni da eseguire per passare dalla 
finestra al puntatore alla classe. 


 percepibile se non in casi particolari.
Quale? Meglio saperlo prima :)
GRAZIE tantissime!!!! :)
Killer

 ha scritto nel messaggio news:JkEb6.11301$ew1.8...@news.infostrada.it...
[CUT]
Questa e' la mia DlgProc:
{
 if(uMsg==48){
  file://SetWindowLong(hwnd,0,(long)((LPCREATESTRUCT)lparam)->lpCreateParams);
  SetWindowLong(hwndDlg,DWL_USER,(long)lpCurrent); // lpCurrent e' "static ModalDialog*"
 }
 ModalDialog *p=(ModalDialog*)GetWindowLong(hwndDlg,DWL_USER);
 return p->ModalDialogProc(hwndDlg,uMsg,wParam,lParam);
}
Sembra funzionare, infatti il dialog sembra non dare problemi.
Ma che messaggio e' "48"? Ho provato sia a mettere WM_CREATE, sia WM_NCCREATE
ma nessuno dei due viene spedito "prima" di questo 48...
Cmq grazie, adesso ho fatto una cosa' in + :)
Killer

Killer
