Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Questo articolo illustra come creare e visualizzare una finestra.
Classi di finestre
Una classe finestra definisce un set di comportamenti comuni a diverse finestre. Ad esempio, in un gruppo di pulsanti, ogni pulsante ha un comportamento simile quando l'utente seleziona il pulsante. Naturalmente, i pulsanti non sono completamente identici. Ogni pulsante visualizza la propria stringa di testo e ha le proprie coordinate dello schermo. I dati univoci per ogni finestra vengono chiamati dati dell'istanza.
Ogni finestra deve essere associata a una classe window, anche se il programma crea solo un'istanza di tale classe. Una classe window non è una classe nel senso C++. Piuttosto, si tratta di una struttura di dati usata internamente dal sistema operativo. Le classi window vengono registrate nel sistema in fase di esecuzione. Per registrare una nuova classe finestra, compilare una struttura di WNDCLASS:
// Register the window class.
const wchar_t CLASS_NAME[] = L"Sample Window Class";
WNDCLASS wc = { };
wc.lpfnWndProc = WindowProc;
wc.hInstance = hInstance;
wc.lpszClassName = CLASS_NAME;
È necessario impostare i membri della struttura seguenti:
- lpfnWndProc è un puntatore a una funzione definita dall'applicazione denominata window procedure o window proc. La routine della finestra definisce la maggior parte del comportamento della finestra. Per il momento, questo valore è una dichiarazione forward di una funzione. Per altre informazioni, vedere Scrittura della routine Window.
-
hInstance è l'handle dell'istanza dell'applicazione. Ottieni questo valore dal parametro hInstance di
wWinMain
. - lpszClassName è una stringa che identifica la classe window.
I nomi delle classi sono locali per il processo corrente, quindi il nome deve essere univoco solo all'interno del processo. Tuttavia, i controlli Windows standard dispongono anche di classi. Se si usa uno di questi controlli, è necessario selezionare nomi di classe che non sono in conflitto con i nomi delle classi di controllo. Ad esempio, la classe finestra per il controllo pulsante è denominata Button.
La struttura WNDCLASS include altri membri non visualizzati qui. È possibile impostarli su zero, come illustrato in questo esempio o compilarli. Per altre informazioni, vedere WNDCLASS.
Passare quindi l'indirizzo della struttura WNDCLASS alla funzione RegisterClass. Questa funzione registra la classe window con il sistema operativo.
RegisterClass(&wc);
Creare la finestra
Per creare una nuova istanza di una finestra, chiamare la funzioneCreateWindowEx:
HWND hwnd = CreateWindowEx(
0, // Optional window styles.
CLASS_NAME, // Window class
L"Learn to Program Windows", // Window text
WS_OVERLAPPEDWINDOW, // Window style
// Size and position
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
NULL, // Parent window
NULL, // Menu
hInstance, // Instance handle
NULL // Additional application data
);
if (hwnd == NULL)
{
return 0;
}
Per descrizioni dettagliate dei parametri, vedere CreateWindowEx. Ecco un breve riepilogo:
- Il primo parametro consente di specificare alcuni comportamenti facoltativi per la finestra, ad esempio finestre trasparenti. Impostare questo parametro su zero per i comportamenti predefiniti.
-
CLASS_NAME
è il nome della classe window. Questo nome definisce il tipo di finestra da creare. - Il testo della finestra viene usato in modi diversi per diversi tipi di finestre. Se la finestra ha una barra del titolo, il testo viene visualizzato nella barra del titolo.
- Lo stile della finestra è un insieme di flag che definiscono alcuni aspetti dell'aspetto e del comportamento di una finestra. La costante WS_OVERLAPPEDWINDOW è in realtà diversi flag combinati con un
OR
bit per bit. Insieme questi flag forniscono alla finestra una barra del titolo, un bordo, un menu di sistema e i pulsanti Riduci e Ingrandisci. Questo set di flag è lo stile più comune per una finestra dell'applicazione di primo livello. - Per la posizione e le dimensioni, la costante CW_USEDEFAULT indica l'uso dei valori predefiniti.
- Il parametro successivo imposta una finestra padre o una finestra di proprietario per la nuova finestra. Impostare l'elemento padre per creare una finestra figlia. Per una finestra di primo livello, impostare questo valore su
NULL
. - Per una finestra dell'applicazione, il parametro successivo definisce il menu per la finestra. Questo esempio non usa un menu, quindi il valore è
NULL
. - hInstance è l'handle dell'istanza, come descritto in precedenza. Vedere WinMain: il punto di ingresso dell'applicazione.
- L'ultimo parametro è un puntatore a dati arbitrari di tipo
void*
. È possibile usare questo valore per passare una struttura di dati alla routine della finestra. Per un modo possibile per usare questo parametro, vedere Managing Application State.
CreateWindowEx restituisce un handle alla nuova finestra oppure zero se la funzione non riesce. Per visualizzare la finestra, ovvero rendere visibile la finestra, passare l'handle della finestra alla funzione ShowWindow:
ShowWindow(hwnd, nCmdShow);
Il parametro hwnd è l'handle della finestra restituito da CreateWindowEx. Il parametro nCmdShow può essere usato per ridurre al minimo o ingrandire una finestra. Il sistema operativo passa questo valore al programma tramite la funzione wWinMain.
Ecco il codice completo per creare la finestra. Tenere presente che WindowProc è ancora solo una dichiarazione forward di una funzione.
// Register the window class.
const wchar_t CLASS_NAME[] = L"Sample Window Class";
WNDCLASS wc = { };
wc.lpfnWndProc = WindowProc;
wc.hInstance = hInstance;
wc.lpszClassName = CLASS_NAME;
RegisterClass(&wc);
// Create the window.
HWND hwnd = CreateWindowEx(
0, // Optional window styles.
CLASS_NAME, // Window class
L"Learn to Program Windows", // Window text
WS_OVERLAPPEDWINDOW, // Window style
// Size and position
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
NULL, // Parent window
NULL, // Menu
hInstance, // Instance handle
NULL // Additional application data
);
if (hwnd == NULL)
{
return 0;
}
ShowWindow(hwnd, nCmdShow);
Congratulazioni, hai creato una finestra!
Al momento, la finestra non contiene alcun contenuto o interagisce con l'utente. In un'applicazione GUI reale, la finestra risponderà agli eventi dell'utente e del sistema operativo. Nella sezione successiva viene descritto il modo in cui i messaggi della finestra forniscono questo tipo di interattività.
Vedere anche
Passare a messaggi finestra per continuare questo modulo.