Qual è la differenza tra WM_QUIT, WM_CLOSE e WM_DESTROY in un programma Windows?

Mi chiedevo quale fosse la differenza tra i messaggi WM_QUIT, WM_CLOSE e WM_DESTROY in un programma Windows, in sostanza: quando vengono inviati e hanno effetti automatici oltre a quelli definiti dal programma?

Sono totalmente diversi.

WM_CLOSE viene inviato alla finestra quando si preme “X” o si sceglie “Chiudi” dal menu della finestra. Se rilevi questo messaggio, questo è il tuo invito a trattarlo: ignoralo o chiudi davvero la finestra. Per impostazione predefinita, WM_CLOSE passato a DefWindowProc causa la DefWindowProc finestra. Quando viene distrutta la finestra, viene inviato il messaggio WM_DESTROY . In questa fase, in opposizione a WM_CLOSE , non è ansible interrompere il processo, è ansible solo effettuare una pulizia necessaria. Ma ricorda che quando prendi WM_DESTROY appena prima che tutte le windows figlio siano già state distrutte. WM_NCDESTROY viene inviato subito dopo che tutte le windows figlio sono state distrutte.

WM_QUIT messaggio WM_QUIT non è correlato a nessuna finestra (l’ hwnd ottenuto da GetMessage è NULL e non viene chiamata alcuna procedura di finestra). Questo messaggio indica che il ciclo del messaggio deve essere interrotto e l’applicazione deve essere chiusa. Quando GetMessage legge WM_QUIT restituisce 0 per indicare quello. Dai un’occhiata al tipico snippet del loop dei messaggi : il loop continua mentre GetMessage ritorna diverso da zero. WM_QUIT può essere inviato dalla funzione PostQuitMessage . Questa funzione viene solitamente chiamata quando la finestra principale riceve WM_DESTROY (vedere lo snippet di procedura tipico della finestra ).

Prima di tutto, i messaggi WM_CLOSE e WM_DESTROY sono associati a windows particolari, mentre il messaggio WM_QUIT è applicabile all’intera applicazione (thread well) e il messaggio non viene mai ricevuto tramite una procedura di finestra (routine WndProc ), ma solo tramite GetMessage o PeekMessage funzioni.

Nella routine WndProc la funzione DefWindowProc si occupa del comportamento predefinito di questi messaggi. I messaggi WM_CLOSE richiedono che l’applicazione si chiuda e il comportamento predefinito per questo è chiamare la funzione DestroyWindow . È quando viene chiamata questa funzione DestroyWindow che viene inviato il messaggio WM_DESTROY . Si noti che WM_CLOSE è solo un messaggio che richiede la chiusura (come WM_QUIT ) – in realtà non è necessario uscire / uscire. Ma il messaggio WM_DESTROY ti dice che la tua finestra viene chiusa e distrutta, quindi devi pulire tutte le risorse, le maniglie, ecc.

Solo così non si perde nei commenti … non dimenticare WM_CANCEL . Quando si fa clic sul pulsante di chiusura (x) in una finestra di dialogo MFC, verrà inviato WM_CLOSE . La funzione OnCancel() predefinita chiamerà quindi la funzione predefinita (class base) OnCancel() .

Tuttavia, se si digita semplicemente il tasto ESC , questo porterà alla chiusura della finestra di dialogo, ma (per quanto posso dire) senza generare l’evento WM_CLOSE , si passa direttamente al WM_CANCEL/OnCancel() .

Con la presente invito la comunità a elaborare questo … o modificare tale elaborazione nella risposta accettata.

Inizialmente discutiamo di WM_QUIT – la differenza rispetto ad altri messaggi che non è associata alla finestra. È usato dall’applicazione. Ad esempio, questo può essere gestito da un server OLE standalone non visibile (.exe, ma non in-proc come .dll)

WM_CLOSE – per msdn: ” Un’applicazione può richiedere all’utente la conferma, prima di distruggere una finestra ” – viene usata come notifica sull’intenzione di chiudere (puoi rifiutare questa intenzione).

WM_DESTROY – è un fatto che la finestra si sta chiudendo e tutte le risorse devono (!) Essere deallocate.