2011-09-14 7 views
5

In Windows, per ogni controllo come (per ogni finestra di dialogo, finestra, casella di testo e casella di controllo, ecc.) Verrà fornito un ID di controllo.Come vengono creati gli ID di controllo della GUI di Windows?

Come viene creato questo ID di controllo? Due applicazioni in Windows possono avere gli stessi ID di controllo? C'è un modo per impostare manualmente gli ID di controllo di Windows?

+0

È vero? Penso che i controlli possano scegliere di utilizzare ID o meno. Una maniglia di finestra è sufficiente per identificare un controllo. –

+1

Non lo è. Normalmente è impostato solo per le finestre di dialogo create da un modello di dialogo. Può essere modificato in seguito con SetWindowLongPtr, GWLP_ID. –

+0

Esistono più tipi di ID di controllo. Automation ID è ciò che desideri impostare. Stai usando WinForms, WPF o Win32 per la tua app? La risposta a "esiste un modo per impostare manualmente gli ID di controllo di Windows" sarà diversa per ogni framework.E gli ID di automazione non devono essere globalmente unici - devono essere unici in un dato ambito per essere utili, dal momento che è sufficiente un percorso unico lungo l'albero per identificare un particolare controllo. Vedi questo per le app della GUI .Net: http://msdn.microsoft.com/en-us/library/aa349646.aspx –

risposta

5

L'ID di controllo è uno dei parametri passati alla funzione CreateWindow. Se il controllo è stato creato da un modello di finestra di dialogo, il gestore della finestra di dialogo ottiene l'ID di controllo dal modello di finestra di dialogo. È abbastanza comune che due controlli abbiano lo stesso ID. Ad esempio, la maggior parte dei pulsanti Cancel avrà l'ID di controllo IDCANCEL.

+0

Non vedo quale parametro CreateWindow è l'ID di controllo. http://msdn.microsoft.com/en-us/library/windows/desktop/ms632679(v=vs.85).aspx – Erik

+0

Ah, trovato. Usa hMenu. Trovato in questa pagina: http://msdn.microsoft.com/en-us/library/windows/desktop/ms645478(v=vs.85).aspx nella sezione commenti. – Erik

+0

È piuttosto raro ** che due controlli nella stessa finestra abbiano lo stesso ID. Ad esempio la [funzione GetDlgItem] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms645481 (v = vs.85) .aspx) dipende da questo. – user34660

4

In aggiunta a quanto Raymond ha scritto:

E 'perfettamente legale per una finestra di creare a finestre figlio (aka controlli) e dare loro la stessa ControlID. L'unico problema è che non sarai in grado di recuperare un controllo in modo univoco tramite il suo id (usando GetDlgItem()). Se non sei interessato a manipolare un controllo in fase di esecuzione (come un'etichetta statica), non devi preoccuparti di assegnare un ID di controllo univoco. Dagli solo 0xFFFF).

Un è sicuramente legale (e normale) lo stesso ID di controllo per diversi controlli/finestre figlio in diverse applicazioni o finestre madri (ad es. IDCANCEL o IDOK per i pulsanti). GetDlgItem() recupera il controllo di una determinata finestra genitore.

3

Oltre alle informazioni nelle altre risposte:

in Windows per ogni controllo come (per ogni finestra di dialogo, la finestra, testo e casella di controllo, ecc) verrà assegnato un ID di controllo

Questo in realtà non è del tutto vero: le finestre di livello superiore, come le finestre delle app e le finestre di dialogo, non hanno affatto un ID di controllo. Solo le finestre figlio possono avere ID di controllo.

(finestre di livello superiore utilizzare il parametro di CreateWindow per indicare la HMENU per la finestra, invece - in modo che Windows solo di primo livello possono avere barre di menu.)

E 'davvero fino allo sviluppatore di app per decidere come assegnare e usare gli ID. Di solito sono usati con GetDlgItem(), che cerca un HWND con un dato ID con un HWND genitore, quindi in quel caso gli ID devono essere unici all'interno di quel genitore. Se uno sviluppatore non ha bisogno di cercare un controllo in fase di esecuzione, può dargli qualsiasi ID, tradizionalmente -1 viene utilizzato lì.

Alcuni framework non utilizzano affatto gli ID di controllo e tengono traccia degli HWND non appena vengono creati.

+0

Utilizzo di WinSpy ++ Ho esaminato la finestra di livello superiore per calc.exe e ha un ID di controllo. So che è la finestra di livello superiore perché l'ID della finestra principale è "00000000". – Sabuncu

+0

Tale valore è probabilmente l'handle del menu della finestra; Windows ha un gestore di menu o un ID di controllo a seconda che si tratti di finestre di livello superiore o secondarie. Lo strumento Spy ++ di Microsoft utilizza la stessa riga nella sua versione della finestra di dialogo Proprietà finestra per visualizzare questo valore, utilizzando l'etichetta "ID di controllo" per impostazione predefinita, cambiandola in "Maniglia menu" se la finestra è di livello superiore e il valore è non nullo. Probabilmente WinSpy ++ non è così diligente nel suo uso delle etichette qui. – BrendanMcK

+0

Grazie per la risposta. Tuttavia, sono in grado di passare il suddetto Control ID a 'GetDlgItem()' e ottenere in cambio un hwnd significativo. Sto pensando che se 'GetDlgItem()' onora l'elemento dati come ID di controllo valido, allora deve essere uno. – Sabuncu

0

In aggiunta alle altre risposte:

Sebbene ID del controllo può essere lo stesso, è meglio lo rendono unico. Il controllo riporta gli eventi alla loro finestra genitore con il suo id e hwnd. Nel loop dei messaggi del genitore generalmente usiamo id per identificare il controllo, in questo caso, se vuoi gestire diversi eventi, usa un id differente per ciascun controllo.

Problemi correlati