Dela via


Skapa ett fönster

I den här artikeln lär du dig att skapa och visa ett fönster.

Fönsterklasser

En -fönsterklass definierar en uppsättning beteenden som flera fönster kan ha gemensamt. I en grupp med knappar har till exempel varje knapp ett liknande beteende när användaren väljer knappen. Naturligtvis är knappar inte helt identiska. Varje knapp visar en egen textsträng och har egna skärmkoordinater. Data som är unika för varje fönster kallas instansdata.

Varje fönster måste associeras med en fönsterklass, även om programmet bara skapar en instans av den klassen. En fönsterklass är inte en klass i C++-bemärkelse. Det är snarare en datastruktur som används internt av operativsystemet. Fönsterklasser registreras i systemet vid körning. Om du vill registrera en ny fönsterklass fyller du i en WNDCLASS- struktur:

// 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;

Du måste ange följande strukturmedlemmar:

  • lpfnWndProc är en pekare till en programdefinierad funktion som kallas fönsterprocedur eller fönsterprocess. Fönsterproceduren definierar det mesta av fönstrets beteende. För tillfället är det här värdet en framåtdeklaration av en funktion. Mer information finns i Skriva fönsterproceduren.
  • hInstance är referensen till programinstansen. Hämta det här värdet från parametern hInstance för wWinMain.
  • lpszClassName är en sträng som identifierar fönsterklassen.

Klassnamn är lokala för den aktuella processen, så namnet behöver bara vara unikt i processen. Standardkontrollerna för Windows har dock också klasser. Om du använder någon av dessa kontroller måste du välja klassnamn som inte är i konflikt med kontrollklassnamnen. Till exempel heter fönsterklassen för knappkontrollen Knapp.

WNDCLASS- struktur har andra medlemmar som inte visas här. Du kan ange dem till noll, som du ser i det här exemplet, eller fylla i dem. För mer information, se WNDCLASS.

Skicka sedan adressen till WNDCLASS- struktur till funktionen RegisterClass. Den här funktionen registrerar fönsterklassen med operativsystemet.

RegisterClass(&wc);

Skapa fönstret

Om du vill skapa en ny instans av ett fönster anropar du funktionen 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;
}

Detaljerade parameterbeskrivningar finns i CreateWindowEx. Här är en snabbsammanfattning:

  • Med den första parametern kan du ange några valfria beteenden för fönstret, till exempel transparenta fönster. Ange den här parametern till noll för standardbeteendena.
  • CLASS_NAME är namnet på fönsterklassen. Det här namnet definierar vilken typ av fönster som ska skapas.
  • Fönstertexten används på olika sätt av olika typer av fönster. Om fönstret har en titelrad visas texten där.
  • Fönsterformatet är en uppsättning flaggor som definierar en del av utseendet och känslan i ett fönster. Konstanten WS_OVERLAPPEDWINDOW är faktiskt flera flaggor i kombination med en bitvis OR. Tillsammans ger dessa flaggor fönstret en namnlist, en kantlinje, en systemmeny och Minimera och Maximera knappar. Den här uppsättningen flaggor är det vanligaste formatet för ett programfönster på den översta nivån.
  • För position och storlek innebär konstanten CW_USEDEFAULT att använda standardvärden.
  • Nästa parameter anger ett överordnat fönster eller ett ägarfönster för det nya fönstret. Ange föräldern om du vill skapa ett barnfönster. För ett fönster på den översta nivån anger du det här värdet till NULL.
  • För ett programfönster definierar nästa parameter menyn för fönstret. Det här exemplet använder inte en meny, så värdet är NULL.
  • hInstance är instanshandtaget som beskrevs tidigare. Se WinMain: Startpunkten för programmet.
  • Den sista parametern är en pekare till godtyckliga data av typen void*. Du kan använda det här värdet för att skicka en datastruktur till din fönsterprocedur. Ett möjligt sätt att använda den här parametern finns i Hantera programtillstånd.

CreateWindowEx returnerar ett handtag till det nya fönstret eller noll om funktionen misslyckas. Om du vill visa fönstret gör du fönstret synligt genom att skicka fönsterhandtaget till funktionen ShowWindow:

ShowWindow(hwnd, nCmdShow);

Parametern hwnd är fönsterreferensen som returneras av CreateWindowEx. Parametern nCmdShow kan användas för att minimera eller maximera ett fönster. Operativsystemet skickar det här värdet till programmet via funktionen wWinMain.

Här är den fullständiga koden för att skapa fönstret. Kom ihåg att WindowProc fortfarande bara är en framåtdeklaration av en funktion.

// 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);

Grattis, du har skapat ett fönster!

Just nu innehåller fönstret inget innehåll eller interagerar med användaren. I ett riktigt GUI-program skulle fönstret svara på händelser från användaren och operativsystemet. I nästa avsnitt beskrivs hur fönstermeddelanden ger den här typen av interaktivitet.

Se även

Fortsätt till fönstermeddelanden för att fortsätta med den här modulen.