2015-05-18 13 views
10

La documentazione per WM_NEXTDLGCTL Stati, che questo messaggio è per essere utilizzato con le finestre di dialogo:È possibile utilizzare WM_NEXTDLGCTL con finestre non di dialogo?

Invia ad un dialog box procedure per impostare lo stato attivo a un controllo diverso nella finestra di dialogo.

Se questo messaggio non può essere utilizzato con i genitori non-dialogo di controllo, sarebbe molto noioso per i controlli di sottoclasse in modo generico (come illustrato in this question), dal momento che la procedura di finestra avrebbe dovuto chiamare uno SetFocus o inviare un messaggio WM_NEXTDLGCTL, basato su non abbastanza banale per determinare il contesto.

Poiché altre API specifiche del dialogo possono essere utilizzate con finestre non di dialogo (ad esempio IsDialogMessage), sarebbe naturale poter utilizzare anche WM_NEXTDLGCTL in questa configurazione.

Domanda: È possibile utilizzare WM_NEXTDLGCTL con i genitori di controllo non di dialogo?

risposta

11

È 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.

+0

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

Problemi correlati