È possibile utilizzare WM_NEXTDLGCTL con i genitori di controllo non di dialogo?
Non penso che sia possibile utilizzarlo in finestre padre non di dialogo (almeno con nessuna modifica alla finestra padre), la causa è che è implementata all'interno di DefDlgProc
. Quindi le altre finestre non di dialogo dovrebbero chiamarlo per far funzionare questo messaggio.
Questa è la citazione che ho trovato in The Old New Thing: lo sviluppo pratico attraverso l'evoluzione di Windows di: Cosa accade all'interno DefDlgProc?
Come le osservazioni per il messaggio WM_NEXTDLGCTL osservano, la funzione DefDlgProc gestisce il messaggio WM_NEXTDLGCTL aggiornando tutto il manager contabilità dialogo interno, decidendo pulsante che dovrebbe essere il default, tutta quella roba buona.
Un altro motivo per cui è Finestra di dialogo unico messaggio è il fatto che esso (citazione da MSDN per WM_NEXTDLGCTL):
imposta l'identificatore di controllo di default
per farlo deve inviare DM_SETDEFID, che è definito come:
#define DM_SETDEFID (WM_USER+1)
quindi è WM_USER, e come tale può essere usato per qualche altro scopo nella finestra non di dialogo (questo fatto è menzionato anche nel libro di Raymond Chens). La cosa interessante è che secondo questo libro IsDialogMessage
invia anche DM_SETDEFID/DM_GETDEFID alla tua finestra. Quindi, se vuoi usare TAB come la navigazione all'interno della finestra di dialogo senza finestra di dialogo (usando il codice di dialogo), devi rispettare alcune regole, puoi leggerle al loro interno: What happens inside IsDialogMessage?
del libro sopra. Ciò significa tra l'altro di utilizzare seguente messaggio di ciclo:
while (GetMessage(&msg, NULL, 0, 0)) {
if (IsDialogMessage(hwnd, &msg)) {
/* Already handled by dialog manager */
} else {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
quindi se non avete intenzione di fare grandi cambiamenti al codice di Windows genitore, allora temo che siete fuori di fortuna.
Questo sembra abbastanza convincente, specialmente quando sono coinvolti messaggi privati di classe finestra ('WM_USER + x'). Ancora, la documentazione per [DM_SETDEFID] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms645413.aspx) note: * "Per impostare il pulsante predefinito, la funzione può inviare ** WM_GETDLGCODE ** e ** BM_SETSTYLE ** messaggi al controllo specificato e al pulsante predefinito corrente. "* Quindi in teoria,' DM_SETDEFID' non è strettamente richiesto. Mentre penso che tu abbia ragione, c'è ancora un po 'di lacuna nel ragionamento. – IInspectable