Newsgroup: it.comp.programmare.win32
Titolo: Message Loop

Avrei anche un altro problema.
Ho scritto un codice che ha questa forma:
// Variabili ambientali
// Registro una classe generica
MSG msg
HWND Fin;
Fin=CreateWindow(....); // e fin qui tutto ok
while(GetMessage(&msg,NULL,0,0))
{
    TranslateMessage(&msg);
    DispatchMessage(&msg);
}
return 0;
// fine del codice
Il programma funziona correttamente ma non si chiude !
O meglio, la finestra scompare quando clicco sul pulsante apposito, ma se
faccio
ctrl+alt+canc vedo che il mio programma è ancora in memoria !!!!
Se anzichè passare NULL a GetMessage passo Fin funziona tutto ma non
gestisce le altre finestre !
Cosa sbaglio ? (Ho provato anche a fare un controllo per GetMessage(..)!= -1
ma non è cambiato nulla). Dal mio debug risulta che non si chiude il message
loop.
Grazie per una gentile risposta.
P.S: uso Visual C++ 5.0 senza MFC :-)

P.S: uso Visual C++ 5.0 senza MFC :-)
Fammi sapere com'e' andata, la cosa mi incuriosisce :-)
Saluti
    Mardy
--
Per rispondere, togliere NVN dal mio indirizzo.
Per scrivere questo messaggio non e' stato abbattuto nessun albero!

La mia finestra processa WM_QUIT e WM_DESTROY con la DefWindowProc.
Cmq ho tentato a processarlo manualmente.... ma il risultato è sempre lo
stesso.
Ho trovato cmq una soluzione ma non è il massimo:
ho trasformato il loop nel modo seguente:
while(GetMessage(&msg,NULL,0,0))
{
if(!isWindow(Fin)) break;  // ricordo che Fin è l'handle della finestra
principale
translatemessage(&msg);
dispatchmessage(&msg);
}
return msg.wparam;
Così funziona, uso un if di troppo nel loop e inoltre non potrei creare + di
una finestra principale !
La situazione è preoccupante...
Non riesco a tirarmene fuori. Ho veramente bisogno di aiuto !
GetMessage in teoria dovrebbe restituire 0 se trova un WM_QUIT.
Ma a quanto pare questo non avviene oppure DefWindowProc non passa un
WM_QUIT alla mia finestra...
Non vorrei avere qualche libreria un po' bucata !

...

Allora, devi procedere per tentativi... Hai il programma Spy++? Io ce l'ho
nel Visual C 4.0, penso ci sia anche nelle versioni successive... Se ce
l'hai lancialo dopo aver fatto partire la tua applicazione, ti elenchera' le
finestre presenti in quel momento nel sistema; seleziona la tua: vedrai i
messaggi che essa riceve e processa... Forse riesci a dedurne qualcosa...
Nota: GetMessage restituisce -1 se incontra un errore; potrebbe essere
questo il motivo del loop infinito... Prova a cambiare il loop cosi':
BOOL risultato;
while (risultato = GetMessage(...)) {
    if (risultato == -1) {
        risultato = 0; /*non e' importante che riga scrivi, l'importante e'
che ci metti un breakpoint per vedere quando e se essa viene eseguita*/
    }
    ...Solite operazioni...
}
Cosi' vediamo se ci sono errori.
Ah, e quando hai provato a processare il WM_DESTROY hai chiamato
PostQuitMessage?
Saluti
    Mardy
--
6 maggio 1999- NETSTRIKE CONTRO TELECOM
Informati e iscriviti su 
www.notut.org


WM_QUIT alla mia finestra...
Non devi affidarti in tutto e per tutto alla DefWindowProc, ma -- come diceva
giustamente Mardy -- avere una tua wndproc che processi il WM_DESTROY con un bel
PostQuitMessage(0).
La tua wndproc cosa fa? 
Aggiungo solo che, ad occhio e croce, DefWindowProc non invia mai WM_QUIT
(altrimenti ti troveresti applicazioni che si chiudono insieme alla chiusura di
una qualsiasi delle loro finestre ;).
_mirko_
--
Knowledge is power.
"ciucciati.il.calzino" is antispam.