2013-08-09 12 views
9

Sto gestendo la chiave ESC nella mia applicazione e quando questa chiave viene ricevuta desidero chiudere la finestra corrente.In Win32 programmazione C++ per chiudere una finestra, dovrei chiamare DestroyWindow (hWnd) me stesso o SendMessage (WM_CLOSE, hWnd, 0, 0)?

Devo chiamare semplicemente DestroyWindow(hWnd) o devo SendMessage(WM_CLOSE, hWnd, 0, 0) o devo chiudere la finestra corrente in qualche modo diverso?

+0

Se tutto il tuo gestore 'WM_CLOSE' è chiamato' DestroyWindow() 'allora non c'è motivo di non chiamarlo direttamente. Dipende se vuoi eseguire qualsiasi altra elaborazione (ad es. Mostra una finestra di dialogo "Sei sicuro di voler uscire?"). –

+0

Grazie Jonathan. Non eseguo altre elaborazioni, il mio gestore 'WM_CLOSE' chiama semplicemente' DestroyWindow() '. – bodacydo

risposta

16

Si dovrebbe PostMessage(hWnd, WM_CLOSE, 0, 0). Inserisce il messaggio WM_CLOSE nella coda dei messaggi della finestra per l'elaborazione e la finestra può chiudersi correttamente quando la coda dei messaggi viene cancellata.

È necessario utilizzare PostMessage anziché SendMessage. La differenza è che PostMessage mette semplicemente il messaggio nella coda dei messaggi e restituisce; SendMessage attende una risposta dalla finestra e non è necessario farlo nel caso di WM_CLOSE.

0

Sia PostMessage o SendMessage WM_CLOSE

+0

Grazie Paul, ci sto provando. PS. Qual è la differenza tra PostMessage e SendMessage? – bodacydo

+0

Da molto tempo da quando eseguivo Win32 - dalla memoria, SendMessage invia il messaggio in modo sincrono mentre PostMessage funziona in modo asincrono mettendo il messaggio in coda per la normale elaborazione dei messaggi. –

+0

-1 Mentre suggerisci che 'PostMessage' è buono come' SendMessage', 'SendMessage' è sicuramente lo strumento sbagliato. – IInspectable

2

Spetta a voi che si utilizza. Il tasto Esc dovrebbe agire proprio come fare clic sul pulsante di chiusura o distruggere definitivamente la finestra?

L'implementazione predefinita di WM_CLOSE (come si trova nella DefWindowProc) chiama DestroyWindow, quindi se non siete movimentazione WM_CLOSE specificamente poi uno è buono come un altro. Ma WM_CLOSE non deve necessariamente chiamare DestroyWindow, quindi, se la finestra in questione lo gestisce, potrebbe fare qualcos'altro. Ad esempio, it could pop up a "Are you sure?"-type message box, o semplicemente non fare nulla. DestroyWindow ignorerà tutto ciò.

1

È necessario utilizzare PostQuitMessage.

Da MSDN: Non pubblicare il WM_QUIT messaggio utilizzando la funzione di uso PostMessagePostQuitMessage.

Se si utilizza PostMessage, si rischia di inviare tale messaggio a tutte le finestre di livello superiore se il valore hWnd diventa in qualche modo HWND_BROADCAST.

Problemi correlati