2009-10-09 9 views

risposta

26

Ci sono molti concetti strettamente correlati coinvolti, e termini correlati sono spesso utilizzati impropriamente, anche nella documentazione ufficiale.

importanti tipi di finestre:

  • finestre di primo livello: Windows che non hanno alcuna finestra padre. La finestra principale di un'applicazione è quasi sempre una finestra di livello superiore. Non ha nulla a che fare con z-order.

  • finestre figlio: finestre contenute in una finestra padre. La loro posizione è sempre relativa all'area della vedova madre. Le finestre secondarie sono spesso "controlli": elementi dell'interfaccia utente come pulsanti e caselle di modifica.

  • finestre padre: finestre con finestre secondarie. Le finestre di livello superiore hanno spesso bambini. Notare che le finestre figlio possono avere anche figli e quindi essere sia finestre padre che figlio.

  • finestre di proprietà: finestre controllate da un'altra finestra, ma non necessariamente figli dell'altra finestra. Un esempio è una tavolozza degli strumenti mobile: è di proprietà di un'altra finestra nell'applicazione, ma non è bloccata sull'area di quell'altra finestra.

  • finestre proprietario: finestre che possiedono una finestra di proprietà.

Spesso la distinzione tra un/rapporto di proprietà proprietario e una relazione padre/figlio non è importante, in modo che i termini principali e secondari sono spesso utilizzati per entrambi i contesti, anche nella documentazione. In alcuni casi, i campi parent e i parametri vengono sovraccaricati per indicare padre e/o proprietario.

concetti importanti:

  • all'inizio della ordine z: Ciò significa letteralmente la finestra che visualizza sulle altre finestre.

  • finestra attiva: Un concetto fuzzy, ma in genere indica la finestra di livello superiore che l'utente considera la finestra "corrente". La finestra attiva viene in genere disegnata con un bordo distintivo e il suo riquadro sulla barra delle attività è evidenziato. La finestra attiva si trova solitamente in corrispondenza o in prossimità della parte superiore dell'ordine z tra tutte le altre finestre di livello superiore ed è il parent o il proprietario (forse indirettamente) della finestra con lo stato attivo della tastiera.

  • focus tastiera: indica la finestra che riceverà i messaggi della tastiera. Concettualmente, c'è una finestra con il focus della tastiera. Spesso la finestra con focus è un figlio (o nipote, ecc.) Della finestra attiva.

  • primo piano: la finestra attiva è in genere in primo piano. Il nome sembra suggerire che è in cima allo z-order, ma in realtà significa che il thread che ha creato la finestra ottiene un leggero incremento di priorità. Quella finestra attiva è solitamente anche la finestra in primo piano.

Quindi diciamo che hai questa finestra del browser aperta, e hai anche avuto un caso di blocco note in esecuzione. Se fai clic sul documento nel Blocco note, si verifica un'intera raffica di messaggi e cambiamenti di stato. Stai effettivamente facendo clic su una grande casella di modifica, che è una finestra secondaria della finestra di livello superiore del Blocco note. Questo clic fa sì che la casella di modifica venga attivata, ma le finestre figlio non possono essere realmente la finestra "attiva", quindi prende solo lo stato attivo della tastiera e passa il messaggio di attivazione attraverso i suoi antenati fino a quando raggiunge una finestra di livello superiore. La finestra di primo livello si "attiva" spostandosi in cima all'ordine z, evidenziando il suo bordo, ecc. Diventa anche la finestra in primo piano, quindi il suo thread ottiene un piccolo miglioramento per rendere l'interfaccia utente un po 'più reattiva di qualsiasi altra finestre.

Con questi termini in mente, è possibile analizzare le descrizioni MSDN per le funzioni elencate per mettere in evidenza le sottili differenze.

Se stai cercando di disporre i figli della tua finestra, usa SetWindowPos (o MoveWindow, SizeWindow e ShowWinow). Tra le restanti funzioni, SwitchToThisWindow sembra deprecato ed essenzialmente uguale a SetForegroundWindow. (Nota che, in molti casi, SetForegroundWindow non farà ciò che vuoi a meno che tu non sia l'applicazione attiva o l'applicazione attiva ti abbia dato il permesso di usarlo.) BringWindowToTop si occupa principalmente di portare una finestra in cima alla z- ordine (che puoi fare con SetWindowPos), con effetti collaterali extra che lo fanno comportarsi come SetForegroundWindow se lo chiami su una finestra di primo livello.

Aggiornamento: Raymond Chen ha pubblicato un clearer distinction between the active window and the foreground window. Per citare:

Il concetto di finestra in primo piano è stato introdotto quando voce è stata disaccoppiato per esprimere la "finestra attiva davvero globale", al contrario di SetActiveWindow, che ha continuato a fare riferimento alla finestra attiva locale.

3

Usa setwindowpos se è necessario modificare le dimensioni della finestra (non solo il suo stato)

Usa showwindow cambiare solo lo stato della finestra

Usa bringwindowtotop per attivare una finestra padre tramite il figlio . se gli mandi una finestra figlia (forse una barra degli strumenti mobile) il genitore sarà portato in primo piano e avrà il focus al posto del bambino.

Tutti hanno il loro posto e ovviamente hanno funzionalità duplicate, ma ognuno fa le cose un po 'diverse a seconda di cosa si vuole fare.

Problemi correlati