Erstellen eines Fensters

In diesem Artikel erfahren Sie, wie Sie ein Fenster erstellen und anzeigen.

Fensterklassen

Eine Fensterklasse definiert eine Reihe von Verhaltensweisen, die mehrere Fenster gemeinsam haben können. Beispielsweise weist jede Schaltfläche in einer Gruppe von Schaltflächen ein ähnliches Verhalten auf, wenn der Benutzer die Schaltfläche auswählt. Natürlich sind Schaltflächen nicht vollständig identisch. Jede Schaltfläche zeigt eine eigene Textzeichenfolge an und verfügt über eigene Bildschirmkoordinaten. Daten, die für jedes Fenster eindeutig sind, werden als Instanzdaten bezeichnet.

Jedes Fenster muss einer Fensterklasse zugeordnet sein, auch wenn Ihr Programm immer nur eine Instanz dieser Klasse erstellt. Eine Fensterklasse ist keine Klasse im C++-Sinne. Es handelt sich vielmehr um eine Datenstruktur, die intern vom Betriebssystem verwendet wird. Fensterklassen werden zur Laufzeit beim System registriert. Um eine neue Fensterklasse zu registrieren, füllen Sie eine WNDCLASS-Struktur aus:

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

Sie müssen die folgenden Strukturmber festlegen:

  • lpfnWndProc ist ein Zeiger auf eine anwendungsdefinierte Funktion, die als Fensterprozedur oder Fensterproc bezeichnet wird. Die Fensterprozedur definiert den größten Teil des Verhaltens des Fensters. Vorerst ist dieser Wert eine Vorwärtsdeklaration einer Funktion. Weitere Informationen finden Sie unter Schreiben der Window-Prozedur.
  • hInstance ist das Handle für die Anwendungsinstanz. Rufen Sie diesen Wert aus dem hInstance-Parameter von ab wWinMain.
  • lpszClassName ist eine Zeichenfolge, die die Fensterklasse identifiziert.

Klassennamen sind lokal für den aktuellen Prozess, sodass der Name nur innerhalb des Prozesses eindeutig sein muss. Die Standardmäßigen Windows-Steuerelemente verfügen jedoch auch über Klassen. Wenn Sie eines dieser Steuerelemente verwenden, müssen Sie Klassennamen auswählen, die nicht mit den Steuerelementklassennamen in Konflikt treten. Die Fensterklasse für das Schaltflächensteuerelement heißt z. B. Button.

Die WNDCLASS-Struktur enthält weitere Member, die hier nicht angezeigt werden. Sie können sie wie in diesem Beispiel gezeigt auf 0 (null) festlegen oder ausfüllen. Weitere Informationen finden Sie unter WNDCLASS.

Übergeben Sie als Nächstes die Adresse der WNDCLASS-Struktur an die RegisterClass-Funktion . Diese Funktion registriert die Fensterklasse beim Betriebssystem.

RegisterClass(&wc);

Erstellen des Fensters

Um eine neue Instanz eines Fensters zu erstellen, rufen Sie die CreateWindowEx-Funktion auf:

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

Ausführliche Parameterbeschreibungen finden Sie unter CreateWindowEx. Hier ist eine kurze Zusammenfassung:

  • Mit dem ersten Parameter können Sie einige optionale Verhaltensweisen für das Fenster angeben, z. B. transparente Fenster. Legen Sie diesen Parameter für das Standardverhalten auf 0 fest.
  • CLASS_NAME ist der Name der Fensterklasse. Dieser Name definiert den Typ des zu erstellenden Fensters.
  • Der Fenstertext wird von verschiedenen Fenstertypen auf unterschiedliche Weise verwendet. Wenn das Fenster über eine Titelleiste verfügt, wird der Text in der Titelleiste angezeigt.
  • Das Fensterformat besteht aus einer Reihe von Flags, die das Aussehen und Verhalten eines Fensters definieren. Die konstante WS_OVERLAPPEDWINDOW besteht tatsächlich aus mehreren Flags, die mit einem bitweisen ORkombiniert werden. Zusammen geben diese Flags dem Fenster eine Titelleiste, einen Rahmen, ein Systemmenü sowie die Schaltflächen Minimieren und Maximieren . Dieser Satz von Flags ist die am häufigsten verwendete Formatvorlage für ein Anwendungsfenster der obersten Ebene.
  • Für Position und Größe bedeutet die Konstante CW_USEDEFAULT , Standardwerte zu verwenden.
  • Der nächste Parameter legt ein übergeordnetes Fenster oder Besitzerfenster für das neue Fenster fest. Legen Sie das übergeordnete Element fest, wenn ein untergeordnetes Fenster erstellt werden soll. Legen Sie für ein Fenster der obersten Ebene diesen Wert auf fest NULL.
  • Für ein Anwendungsfenster definiert der nächste Parameter das Menü für das Fenster. In diesem Beispiel wird kein Menü verwendet, daher ist NULLder Wert .
  • hInstance ist das Instanzhandle, das zuvor beschrieben wurde. Weitere Informationen finden Sie unter WinMain: Der Anwendungseinstiegspunkt.
  • Der letzte Parameter ist ein Zeiger auf beliebige Daten vom Typ void*. Sie können diesen Wert verwenden, um eine Datenstruktur an Ihre Fensterprozedur zu übergeben. Eine mögliche Möglichkeit zur Verwendung dieses Parameters finden Sie unter Verwalten des Anwendungszustands.

CreateWindowEx gibt ein Handle an das neue Fenster zurück, oder null, wenn die Funktion fehlschlägt. Um das Fenster anzuzeigen, also das Fenster sichtbar machen, übergeben Sie das Fensterhandle an die ShowWindow-Funktion :

ShowWindow(hwnd, nCmdShow);

Der hwnd-Parameter ist das Fensterhandle, das von CreateWindowEx zurückgegeben wird. Der nCmdShow-Parameter kann verwendet werden, um ein Fenster zu minimieren oder zu maximieren. Das Betriebssystem übergibt diesen Wert über die wWinMain-Funktion an das Programm.

Hier sehen Sie den vollständigen Code zum Erstellen des Fensters. Denken Sie daran, dass WindowProc immer noch nur eine Vorwärtsdeklaration einer Funktion ist.

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

Herzlichen Glückwunsch, Sie haben ein Fenster erstellt!

Im Moment enthält das Fenster keinen Inhalt und interagiert nicht mit dem Benutzer. In einer echten GUI-Anwendung reagiert das Fenster auf Ereignisse des Benutzers und des Betriebssystems. Im nächsten Abschnitt wird beschrieben, wie Fenstermeldungen diese Art von Interaktivität bereitstellen.

Weitere Informationen

Fahren Sie mit Fenstermeldungen fort, um dieses Modul fortzusetzen.