Condividi tramite


Informazioni su Windows

Questo argomento descrive gli elementi di programmazione usati dalle applicazioni per creare e usare finestre; gestire le relazioni tra finestre; e dimensioni, spostare e visualizzare finestre.

La panoramica include gli argomenti seguenti.

Finestra desktop

Quando si avvia il sistema, crea automaticamente la finestra desktop. La finestra desktop è una finestra definita dal sistema che disegna lo sfondo dello schermo e funge da base per tutte le finestre visualizzate da tutte le applicazioni.

La finestra desktop usa una bitmap per disegnare lo sfondo dello schermo. Il modello creato dalla bitmap è denominato sfondo desktop. Per impostazione predefinita, la finestra desktop usa la bitmap da un file .bmp specificato nel Registro di sistema come sfondo desktop.

La funzione GetDesktopWindow restituisce un handle alla finestra desktop.

Un'applicazione di configurazione del sistema, ad esempio un elemento Pannello di controllo, modifica lo sfondo desktop usando la funzione SystemParametersInfo con il parametro wAction impostato su SPI_SETDESKWALLPAPER e il parametro lpvParam che specifica un nome file bitmap. SystemParametersInfo carica quindi la bitmap dal file specificato, usa la bitmap per disegnare lo sfondo dello schermo e immette il nuovo nome file nel Registro di sistema.

Windows dell'applicazione

Ogni applicazione basata su Windows grafica crea almeno una finestra, denominata finestra principale, che funge da interfaccia primaria tra l'utente e l'applicazione. La maggior parte delle applicazioni crea anche altre finestre, direttamente o indirettamente, per eseguire attività correlate alla finestra principale. Ogni finestra fa parte della visualizzazione dell'output e della ricezione dell'input dall'utente.

Quando si avvia un'applicazione, il sistema associa anche un pulsante della barra delle applicazioni all'applicazione. Il pulsante della barra delle applicazioni contiene l'icona del programma e il titolo. Quando l'applicazione è attiva, il pulsante della barra delle applicazioni viene visualizzato nello stato push.

Una finestra dell'applicazione include elementi come una barra del titolo, una barra dei menu, il menu della finestra (in precedenza noto come menu di sistema), il pulsante di riduzione al minimo, il pulsante di ingrandimento, il pulsante di ripristino, il pulsante di chiusura, un bordo di ridimensionamento, un'area client, una barra di scorrimento orizzontale e una barra di scorrimento verticale. La finestra principale di un'applicazione include in genere tutti questi componenti. La figura seguente mostra questi componenti in una finestra principale tipica.

finestra tipica

Client Area

L'area client è la parte di una finestra in cui l'applicazione visualizza l'output, ad esempio testo o grafica. Ad esempio, un'applicazione di pubblicazione desktop visualizza la pagina corrente di un documento nell'area client. L'applicazione deve fornire una funzione, denominata procedura finestra, per elaborare l'input nella finestra e visualizzare l'output nell'area client. Per altre informazioni, vedere Routine della finestra.

Area non client

La barra del titolo, la barra dei menu, il menu finestra, ridurre al minimo e massimizzare i pulsanti, il bordo di ridimensionamento e le barre di scorrimento vengono definite collettivamente come area nonclient della finestra. Il sistema gestisce la maggior parte degli aspetti dell'area non client; l'applicazione gestisce l'aspetto e il comportamento dell'area client.

La barra del titolo visualizza un'icona definita dall'applicazione e una riga di testo; in genere, il testo specifica il nome dell'applicazione o indica lo scopo della finestra. Un'applicazione specifica l'icona e il testo durante la creazione della finestra. La barra del titolo consente anche all'utente di spostare la finestra usando un mouse o un altro dispositivo di puntamento.

La maggior parte delle applicazioni include una barra dei menu che elenca i comandi supportati dall'applicazione. Gli elementi nella barra dei menu rappresentano le categorie principali dei comandi. Facendo clic su una voce sulla barra dei menu viene in genere aperto un menu a comparsa le cui voci corrispondono alle attività all'interno di una determinata categoria. Facendo clic su un comando, l'utente indirizza l'applicazione per eseguire un'attività.

Il menu della finestra viene creato e gestito dal sistema. Contiene un set standard di voci di menu che, quando scelto dall'utente, imposta le dimensioni o la posizione di una finestra, chiudi l'applicazione o esegue attività. Per altre informazioni, vedere Menu.

I pulsanti nell'angolo superiore destro influiscono sulle dimensioni e sulla posizione della finestra. Quando si fa clic sul pulsante di ingrandimento, il sistema espande la finestra alle dimensioni dello schermo e posiziona la finestra, quindi copre l'intero desktop, meno la barra delle applicazioni. Allo stesso tempo, il sistema sostituisce il pulsante ingrandisce con il pulsante di ripristino. Quando si fa clic sul pulsante di ripristino, il sistema ripristina la finestra con le dimensioni e la posizione precedenti. Quando si fa clic sul pulsante riduci al minimo, il sistema riduce la finestra alle dimensioni del pulsante della barra delle applicazioni, posiziona la finestra sul pulsante della barra delle applicazioni e visualizza il pulsante della barra delle applicazioni nello stato normale. Per ripristinare le dimensioni e la posizione precedenti dell'applicazione, fare clic sul pulsante della barra delle applicazioni. Quando si fa clic sul pulsante chiudi, l'applicazione viene chiusa.

Il bordo di ridimensionamento è un'area intorno al perimetro della finestra che consente all'utente di ridimensionare la finestra usando un mouse o un altro dispositivo di puntamento.

La barra di scorrimento orizzontale e la barra di scorrimento verticale converte il mouse o l'input della tastiera in valori usati da un'applicazione per spostare il contenuto dell'area client orizzontalmente o verticalmente. Ad esempio, un'applicazione di elaborazione delle parole che visualizza un documento di lunghezza fornisce in genere una barra di scorrimento verticale per consentire all'utente di paginarsi verso l'alto e verso il basso attraverso il documento.

Controlli e finestre di dialogo

Un'applicazione può creare diversi tipi di finestre oltre alla finestra principale, inclusi i controlli e le finestre di dialogo.

Un controllo è una finestra usata da un'applicazione per ottenere una parte specifica di informazioni dall'utente, ad esempio il nome di un file da aprire o le dimensioni desiderate di una selezione di testo. Le applicazioni usano anche i controlli per ottenere informazioni necessarie per controllare una particolare funzionalità di un'applicazione. Ad esempio, un'applicazione di elaborazione delle parole fornisce in genere un controllo per consentire all'utente di attivare e disattivare il wrapping delle parole. Per altre informazioni, vedere Controlli Windows.

I controlli vengono sempre usati insieme a un'altra finestra, in genere una finestra di dialogo. Una finestra di dialogo è una finestra contenente uno o più controlli. Un'applicazione usa una finestra di dialogo per richiedere all'utente l'input necessario per completare un comando. Ad esempio, un'applicazione che include un comando per aprire un file visualizza una finestra di dialogo che include controlli in cui l'utente specifica un percorso e un nome file. Le finestre di dialogo non usano in genere lo stesso set di componenti della finestra come fa una finestra principale. La maggior parte ha una barra del titolo, un menu finestra, un bordo (non ridimensionamento) e un'area client, ma in genere non hanno una barra dei menu, ridurre al minimo e massimizzare i pulsanti o barre di scorrimento. Per altre informazioni, vedere Finestre di dialogo.

Una finestra di messaggio è una finestra di dialogo speciale che visualizza una nota, una cautela o un avviso per l'utente. Ad esempio, una finestra di messaggio può informare l'utente di un problema riscontrato dall'applicazione durante l'esecuzione di un'attività. Per altre informazioni, vedere Caselle di messaggi.

Attributi finestra

Un'applicazione deve fornire le informazioni seguenti durante la creazione di una finestra. Con l'eccezione dell'handle finestra, che la funzione di creazione restituisce in modo univoco la nuova finestra.

Questi attributi di finestra sono descritti nelle sezioni seguenti.

Nome della classe

Ogni finestra appartiene a una classe finestra. Un'applicazione deve registrare una classe di finestra prima di creare qualsiasi finestra di tale classe. La classe finestra definisce la maggior parte degli aspetti dell'aspetto e del comportamento di una finestra. Il componente principale di una classe finestra è la routine della finestra, una funzione che riceve e elabora tutti gli input e le richieste inviate alla finestra. Il sistema fornisce l'input e le richieste sotto forma di messaggi. Per altre informazioni, vedere Classi di finestra, procedure di finestra e messaggi e code di messaggi.

Nome della finestra

Un nome di finestra è una stringa di testo che identifica una finestra per l'utente. Una finestra principale, una finestra di dialogo o una finestra di messaggio visualizza in genere il nome della finestra nella barra del titolo, se presente. Un controllo può visualizzare il nome della finestra, a seconda della classe del controllo. Ad esempio, i pulsanti, i controlli di modifica e i controlli statici visualizzano i nomi delle finestre all'interno del rettangolo occupato dal controllo. Tuttavia, i controlli, ad esempio caselle di riepilogo e caselle combinate, non visualizzano i nomi delle finestre.

Per modificare il nome della finestra dopo la creazione di una finestra, usare la funzione SetWindowText . Questa funzione usa le funzioni GetWindowTextLength e GetWindowText per recuperare la stringa nome finestra corrente dalla finestra.

Stile della finestra

Ogni finestra ha uno o più stili di finestra. Uno stile di finestra è una costante denominata che definisce un aspetto dell'aspetto e del comportamento della finestra non specificato dalla classe della finestra. Un'applicazione imposta in genere gli stili di finestra durante la creazione di finestre. Può anche impostare gli stili dopo aver creato una finestra usando la funzione SetWindowLong .

Il sistema e, in qualche misura, la procedura della finestra per la classe, interpretare gli stili della finestra.

Alcuni stili di finestra si applicano a tutte le finestre, ma la maggior parte si applica alle finestre di classi di finestre specifiche. Gli stili di finestra generali sono rappresentati da costanti che iniziano con il prefisso WS_; possono essere combinati con l'operatore OR per formare diversi tipi di finestre, tra cui finestre principali, finestre di dialogo e finestre figlio. Gli stili di finestra specifici della classe definiscono l'aspetto e il comportamento delle finestre appartenenti alle classi di controllo predefinite. Ad esempio, la classe SCROLLBAR specifica un controllo barra di scorrimento, ma gli stili SBS_HORZ e SBS_VERT determinano se viene creato un controllo barra di scorrimento orizzontale o verticale.

Per elenchi di stili che possono essere usati da finestre, vedere gli argomenti seguenti:

Stile finestra estesa

Ogni finestra può facoltativamente avere uno o più stili di finestra estesi. Uno stile di finestra esteso è una costante denominata che definisce un aspetto dell'aspetto e del comportamento della finestra non specificato dalla classe finestra o dagli altri stili di finestra. Un'applicazione imposta in genere stili di finestra estesi durante la creazione di finestre. Può anche impostare gli stili dopo aver creato una finestra usando la funzione SetWindowLong .

Per altre informazioni, vedere CreateWindowEx.

Position

La posizione di una finestra è definita come coordinate dell'angolo superiore sinistro. Queste coordinate, talvolta chiamate coordinate della finestra, sono sempre relative all'angolo superiore sinistro dello schermo o, per una finestra figlio, l'angolo superiore sinistro dell'area client della finestra padre. Ad esempio, una finestra di primo livello con le coordinate (10.10) viene posizionata a destra dell'angolo superiore sinistro dello schermo e 10 pixel verso il basso. Una finestra figlio con le coordinate (10.10) viene posizionata a destra dell'angolo superiore sinistro dell'area client della finestra padre e 10 pixel verso il basso.

La funzione WindowFromPoint recupera un handle nella finestra che occupa un punto specifico sullo schermo. Analogamente, le funzioni ChildWindowFromPoint e ChildWindowFromPointEx recuperano un handle nella finestra figlio occupando un punto specifico nell'area client della finestra padre. Anche se ChildWindowFromPointEx può ignorare finestre figlio invisibili, disabilitate e trasparenti, ChildWindowFromPoint non può.

Dimensione

Le dimensioni di una finestra (larghezza e altezza) sono specificate in pixel. Una finestra può avere zero larghezza o altezza. Se un'applicazione imposta la larghezza e l'altezza di una finestra su zero, il sistema imposta le dimensioni sulla dimensione minima predefinita della finestra. Per individuare le dimensioni minime predefinite della finestra, un'applicazione usa la funzione GetSystemMetrics con i flag di SM_CXMIN e SM_CYMIN .

Un'applicazione potrebbe dover creare una finestra con un'area client di una determinata dimensione. Le funzioni AdjustWindowRect e AdjustWindowRectEx calcolano le dimensioni necessarie di una finestra in base alle dimensioni desiderate dell'area client. L'applicazione può passare i valori delle dimensioni risultanti alla funzione CreateWindowEx .

Un'applicazione può ridimensionare una finestra in modo che sia estremamente grande; tuttavia, non deve ridimensionare una finestra in modo che sia più grande della schermata. Prima di impostare le dimensioni di una finestra, l'applicazione deve controllare la larghezza e l'altezza dello schermo usando GetSystemMetrics con i flag di SM_CXSCREEN e SM_CYSCREEN .

Handle finestra padre o proprietario

Una finestra può avere una finestra padre. Una finestra con un elemento padre è denominata finestra figlio. La finestra padre fornisce il sistema di coordinate usato per posizionare una finestra figlio. La presenza di una finestra padre influisce sugli aspetti dell'aspetto di una finestra; ad esempio, una finestra figlio viene ritagliata in modo che nessuna parte della finestra figlio possa essere visualizzata all'esterno dei bordi della finestra padre.

Una finestra che non ha alcun elemento padre o il cui padre è la finestra desktop, viene chiamata finestra di primo livello. Un'applicazione può usare la funzione EnumWindows per ottenere un handle per ogni finestra di primo livello sullo schermo. EnumWindows passa l'handle a ogni finestra di primo livello, a sua volta, a una funzione di callback definita dall'applicazione, EnumWindowsProc.

Una finestra di primo livello può essere proprietaria o di proprietà di un'altra finestra. Una finestra di proprietà viene sempre visualizzata davanti alla finestra del proprietario, è nascosta quando la finestra del proprietario viene ridotta al minimo e viene distrutta quando la finestra del proprietario viene distrutta. Per altre informazioni, vedere Windows di proprietà.

Una finestra figlio può avere un identificatore di finestra figlio , un valore univoco e definito dall'applicazione associato alla finestra figlio. Gli identificatori di finestra figlio sono particolarmente utili nelle applicazioni che creano più finestre figlio. Quando si crea una finestra figlio, un'applicazione specifica l'identificatore della finestra figlio. Dopo aver creato la finestra, l'applicazione può modificare l'identificatore della finestra usando la funzione SetWindowLong oppure recuperare l'identificatore usando la funzione GetWindowLong .

Ogni finestra, ad eccezione di una finestra figlio, può avere un menu. Un'applicazione può includere un menu fornendo un handle di menu durante la registrazione della classe della finestra o quando si crea la finestra.

Handle dell'istanza dell'applicazione

Ogni applicazione ha un handle di istanza associato. Il sistema fornisce l'handle dell'istanza a un'applicazione all'avvio dell'applicazione. Poiché può eseguire più copie della stessa applicazione, il sistema usa gli handle dell'istanza internamente per distinguere un'istanza di un'applicazione da un'altra. L'applicazione deve specificare l'handle dell'istanza in molte finestre diverse, incluse quelle che creano finestre.

Dati di creazione

Ogni finestra può avere dati di creazione definiti dall'applicazione associati. Quando la finestra viene creata per la prima volta, il sistema passa un puntatore ai dati nella procedura di finestra della finestra creata. La procedura della finestra usa i dati per inizializzare le variabili definite dall'applicazione.

Handle finestra

Dopo aver creato una finestra, la funzione di creazione restituisce un handle di finestra che identifica in modo univoco la finestra. Un handle di finestra ha il tipo di dati HWND ; un'applicazione deve usare questo tipo durante la dichiarazione di una variabile che contiene un handle di finestra. Un'applicazione usa questo handle in altre funzioni per indirizzare le azioni alla finestra.

Un'applicazione può usare la funzione FindWindow per individuare se esiste una finestra con il nome o il nome della finestra specificati nel sistema. Se tale finestra esiste, FindWindow restituisce un handle alla finestra. Per limitare la ricerca alle finestre figlio di un'applicazione specifica, usare la funzione FindWindowEx .

La funzione IsWindow determina se un handle di finestra identifica una finestra valida e esistente. Esistono costanti speciali che possono sostituire un handle di finestra in determinate funzioni. Ad esempio, un'applicazione può usare HWND_BROADCAST nelle funzioni SendMessage e SendMessageTimeout o HWND_DESKTOP nella funzione MapWindowPoints.

Creazione della finestra

Per creare finestre dell'applicazione, usare la funzione CreateWindow o CreateWindowEx. È necessario fornire le informazioni necessarie per definire gli attributi della finestra. CreateWindowEx ha un parametro , dwExStyle, che CreateWindow non ha; in caso contrario, le funzioni sono identiche. In effetti, CreateWindow chiama semplicemente CreateWindowEx con il parametro dwExStyle impostato su zero. Per questo motivo, la parte restante di questa panoramica si riferisce solo a CreateWindowEx.

Questa sezione contiene i seguenti argomenti:

Nota

Sono disponibili funzioni aggiuntive per la creazione di finestre per scopi speciali, ad esempio finestre di dialogo e finestre di messaggio. Per altre informazioni, vedere DialogBox, CreateDialog e MessageBox.

 

Creazione della finestra principale

Ogni applicazione basata su Windows deve avere WinMain come funzione del punto di ingresso. WinMain esegue una serie di attività, tra cui la registrazione della classe finestra per la finestra principale e la creazione della finestra principale. WinMain registra la classe della finestra principale chiamando la funzione RegisterClass e crea la finestra principale chiamando la funzione CreateWindowEx .

La funzione WinMain può anche limitare l'applicazione a una singola istanza. Creare un mutex denominato usando la funzione CreateMutex . Se GetLastError restituisce ERROR_ALREADY_EXISTS, esiste un'altra istanza dell'applicazione (il mutex è stato creato) ed è necessario uscire da WinMain.

Il sistema non visualizza automaticamente la finestra principale dopo averlo creato; In alternativa, un'applicazione deve usare la funzione ShowWindow per visualizzare la finestra principale. Dopo aver creato la finestra principale, la funzione WinMain dell'applicazione chiama ShowWindow, passando due parametri: un handle alla finestra principale e un flag che specifica se la finestra principale deve essere ridotta o ingrandita quando viene visualizzata per la prima volta. In genere, il flag può essere impostato su una delle costanti che iniziano con il prefisso SW_. Tuttavia, quando viene chiamato ShowWindow per visualizzare la finestra principale dell'applicazione, il flag deve essere impostato su SW_SHOWDEFAULT. Questo flag indica al sistema di visualizzare la finestra come indicato dal programma che ha avviato l'applicazione.

Se una classe finestra è stata registrata con la versione Unicode di RegisterClass, la finestra riceve solo messaggi Unicode. Per determinare se una finestra usa o meno il set di caratteri Unicode, chiamare IsWindowUnicode.

messaggi Window-Creation

Quando si crea una finestra, il sistema invia messaggi alla routine della finestra per la finestra. Il sistema invia il messaggio WM_NCCREATE dopo aver creato l'area non client della finestra e il messaggio WM_CREATE dopo aver creato l'area client. La procedura della finestra riceve entrambi i messaggi prima che il sistema visualizzi la finestra. Entrambi i messaggi includono un puntatore a una struttura CREATESTRUCT che contiene tutte le informazioni specificate nella funzione CreateWindowEx . In genere, la routine window esegue attività di inizializzazione al momento della ricezione di questi messaggi.

Quando si crea una finestra figlio, il sistema invia il messaggio WM_PARENTNOTIFY alla finestra padre dopo l'invio dei messaggi WM_NCCREATE e WM_CREATE . Invia anche altri messaggi durante la creazione di una finestra. Il numero e l'ordine di questi messaggi dipendono dalla classe e dallo stile della finestra e dalla funzione usata per creare la finestra. Questi messaggi sono descritti in altri argomenti di questo file della Guida.

Applicazioni multithread

Un'applicazione basata su Windows può avere più thread di esecuzione e ogni thread può creare finestre. Il thread che crea una finestra deve contenere il codice per la relativa routine della finestra.

Un'applicazione può usare la funzione EnumThreadWindows per enumerare le finestre create da un determinato thread. Questa funzione passa l'handle a ogni finestra del thread, a sua volta, a una funzione di callback definita dall'applicazione , EnumThreadWndProc.

La funzione GetWindowThreadProcessId restituisce l'identificatore del thread che ha creato una finestra specifica.

Per impostare lo stato di visualizzazione di una finestra creata da un altro thread, usare la funzione ShowWindowAsync .