Creare una finestra

Questo articolo illustra come creare e visualizzare una finestra.

Classi finestra

Una classe finestra definisce un set di comportamenti che diverse finestre potrebbero avere in comune. 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 sono denominati dati dell'istanza.

Ogni finestra deve essere associata a una classe finestra, anche se il programma crea solo un'istanza di tale classe. Una classe finestra non è una classe nel senso C++. Si tratta invece di una struttura di dati usata internamente dal sistema operativo. Le classi finestra vengono registrate nel sistema in fase di esecuzione. Per registrare una nuova classe finestra, compilare una struttura 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 procedura finestra o processo di finestra. 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. Ottenere 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, anche i controlli Windows standard hanno classi. Se si utilizza uno di questi controlli, è necessario selezionare i 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 che non sono 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 funzione CreateWindowEx :

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 in base a 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 set di flag che definiscono l'aspetto di una finestra. La costante WS_OVERLAPPEDWINDOW è in realtà diversi flag combinati con un bit per ORbit . Insieme questi flag danno alla finestra una barra del titolo, un bordo, un menu di sistema e pulsanti Riduci a icona e Ingrandisci . Questo set di flag è lo stile più comune per una finestra dell'applicazione di primo livello.
  • Per posizione e dimensioni, la costante CW_USEDEFAULT indica l'uso dei valori predefiniti.
  • Il parametro successivo imposta una finestra padre o una finestra del proprietario per la nuova finestra. Impostare l'elemento padre se per creare una finestra figlio. 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 di istanza 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 Gestione dello stato dell'applicazione.

CreateWindowEx restituisce un handle alla nuova finestra oppure zero se la funzione ha esito negativo. 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 di finestra restituito da CreateWindowEx. Il parametro nCmdShow può essere usato per ridurre 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, è stata creata 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. La sezione successiva descrive come i messaggi della finestra forniscono questo tipo di interattività.

Vedi anche

Passare a Messaggi finestra per continuare questo modulo.