Das App-Objekt und DirectX (Windows Store-Apps mit C++ und DirectX)

Für Windows Store-Apps mit DirectX (in erster Linie Spiele) werden nur wenige der Benutzeroberflächenelemente und -objekte der neuen Windows-Benutzeroberfläche genutzt. Da sie auf einer niedrigeren Ebene des Windows-Runtime-Stapels ausgeführt werden, müssen sie stattdessen auf eine grundlegendere Weise mit dem UI-Framework interagieren, und zwar indem sie direkt auf das App-Objekt zugreifen und mit diesem interagieren. Im Folgenden erfahren Sie, zu welchem Zeitpunkt und auf welche Weise eine solche Interaktion erfolgt und wie Sie als DirectX-Entwickler dieses Modell beim Entwickeln von auf C++ basierenden Windows Store-Apps effizient nutzen können.

Die wichtigen Benutzeroberflächen-Kernnamespaces

Zunächst sind die Windows-Runtime-Namespaces zu erwähnen, die Sie (mit using) in Ihre Windows Store-App einschließen müssen. Hierauf gehen wir weiter unten noch ausführlicher ein.

Hinweis  Wenn Sie keine Windows Store-App mit DirectX und C++ entwickeln, verwenden Sie die UI-Komponenten in den JavaScript- oder XAML-spezifischen Bibliotheken und Namespaces anstelle der Typen in diesen Namespaces.

Das Windows-Runtime-App-Objekt

Sie möchten in Ihrer Windows Store-App ein Fenster und einen Ansichtsanbieter abrufen, von dem Sie wiederum eine Ansicht abrufen und mit dem Sie Ihre Swapkette (Ihre Anzeigepuffer) verbinden können. Sie können diese Ansicht auch in die fensterspezifischen Ereignisse für die ausgeführte App einbinden. Zum Abrufen des übergeordneten Fensters für das App-Objekt, das durch den CoreWindow-Typ definiert ist, erstellen Sie einen Typ, der IFrameworkViewSource implementiert, wie im vorherigen Codeausschnitt veranschaulicht.

Im Folgenden werden die grundlegenden Schritte zum Abrufen eines Fensters mit dem UI-Hauptframework erläutert:

  1. Erstellen Sie einen Typ, der IFrameworkView implementiert. Dies ist Ihre Ansicht.

    Definieren Sie in diesem Typ Folgendes:

    • Eine Initialize-Methode, die eine Instanz von CoreApplicationView als Parameter annimmt. Sie rufen eine Instanz dieses Typs ab, indem Sie CoreApplication.CreateNewView aufrufen. Das App-Objekt ruft die Methode beim Starten der App auf.
    • Eine SetWindow-Methode, die eine Instanz von CoreWindow als Parameter annimmt. Sie können eine Instanz dieses Typs abrufen, indem Sie auf die CoreWindow-Eigenschaft in der neuen CoreApplicationView-Instanz zugreifen.
    • Eine Load-Methode, die eine Zeichenfolge für einen Einsprungpunkt als einzigen Parameter annimmt. Das App-Objekt stellt den Einsprungpunkt bereit, wenn Sie diese Methode aufrufen. Hier richten Sie Ressourcen ein. Hier erstellen Sie Ihre Geräteressourcen. Das App-Objekt ruft die Methode beim Starten der App auf.
    • Eine Run-Methode, die das CoreWindow-Objekt aktiviert und den Fensterereignisverteiler startet. Der Aufruf durch das App-Objekt erfolgt, wenn der Prozess der App gestartet wird.
    • Eine Uninitialize-Methode, die die im Aufruf von Load eingerichteten Ressourcen bereinigt. Das App-Objekt ruft diese Methode beim Schließen der App auf.
  2. Erstellen Sie einen Typ, der IFrameworkViewSource implementiert. Dies ist Ihr Ansichtsanbieter.

    Definieren Sie in diesem Typ Folgendes:

    • Eine Methode mit dem Namen CreateView, die eine Instanz Ihrer IFrameworkView-Implementierung zurückgibt, die in Schritt 1 erstellt wurde.
  3. Übergeben Sie eine Instanz des Ansichtsanbieters an CoreApplication.Run von main.

Da Sie sich nun mit den Grundlagen vertraut gemacht haben, betrachten Sie nun weitere verfügbare Optionen, mit denen Sie diesen Ansatz ausweiten können.

UI-Haupttypen

Im Folgenden werden weitere UI-Haupttypen in der Windows-Runtime vorgestellt, die möglicherweise hilfreich sein können:

Mit diesen Typen können Sie auf die Ansicht der App zugreifen, insbesondere auf die Bits, mit denen die Inhalte des übergeordneten Fensters der App gezeichnet werden, und Sie können die für dieses Fenster ausgelösten Ereignisse behandeln. Der Prozess des App-Fensters befindet sich in einem Application Single-Threaded Apartment (ASTA), das isoliert ist und alle Rückrufe behandelt.

Die Ansicht Ihrer App wird durch den Ansichtsanbieter für das App-Fenster generiert und in den meisten Fällen durch ein spezifisches Frameworkpaket oder direkt vom System implementiert, sodass Sie die Implementierung nicht selbst ausführen müssen. Für DirectX müssen Sie wie zuvor beschrieben einen kompakten Ansichtsanbieter implementieren. Zwischen den folgenden Komponenten und Verhalten besteht eine spezifische 1:1-Beziehung:

  • Die Ansicht einer App, die durch den CoreApplicationView-Typ dargestellt wird und die die Methoden zum Aktualisieren des Fensters definiert.
  • Ein ASTA, dessen Attribute das Threadingverhalten der App definieren. Sie können keine Instanzen von STA-attributierten COM-Typen für ein ASTA erstellen.
  • Ein Ansichtsanbieter, den Ihre App vom System erhält oder der von Ihnen implementiert wird.
  • Ein übergeordnetes Fenster, das durch den CoreWindow-Typ dargestellt wird.
  • Quellentnahme für alle Aktivierungsereignisse. Sowohl Ansichten als auch Fenster verfügen über separate Aktivierungsereignisse.

Dies lässt sich wie folgt zusammenfassen: Das App-Objekt stellt eine Ansichtsanbieterfactory bereit. Es erstellt einen Ansichtsanbieter und instanziiert ein übergeordnetes Fenster für die App. Der Ansichtsanbieter definiert die Ansicht der App für das übergeordnete Fenster der App. Im Folgenden wird genauer auf die Ansicht und das übergeordnete Fenster eingegangen.

CoreApplicationView – Verhalten und Eigenschaften

CoreApplicationView stellt die aktuelle App-Ansicht dar. Der App-Singleton erstellt die App-Ansicht während der Initialisierung; die Ansicht bleibt jedoch so lange ruhend, bis sie aktiviert wird. Sie können das CoreWindow abrufen, in dem die Ansicht angezeigt wird, indem Sie auf die zugehörige CoreApplicationView.CoreWindow-Eigenschaft zugreifen: Sie können Aktivierungs- und Deaktivierungsereignisse für die Ansicht behandeln, indem Sie Delegaten beim CoreApplicationView.Activated-Ereignis registrieren.

CoreWindow – Verhalten und Eigenschaften

Das übergeordnete Fenster, das eine CoreWindow-Instanz darstellt, wird erstellt und an den Ansichtsanbieter übergeben, wenn das App-Objekt initialisiert wird. Wenn die App über ein anzuzeigendes Fenster verfügt, wird dieses angezeigt. Andernfalls wird lediglich die Ansicht initialisiert.

CoreWindow stellt eine Reihe von Ereignissen bereit, die spezifisch für das Eingabeverhalten und das grundlegende Fensterverhalten sind. Sie können diese Ereignisse behandeln, indem Sie eigene Delegaten für diese registrieren.

Sie können auch den Fensterereignisverteiler für das Fenster abrufen, indem Sie auf die CoreWindow.Dispatcher-Eigenschaft zugreifen, die eine Instanz von CoreDispatcher bereitstellt.

CoreDispatcher – Verhalten und Eigenschaften

Sie können das Threadingverhalten der Ereignisverteilung für ein Fenster mit dem CoreDispatcher-Typ bestimmen. Bei diesem Typ gibt es eine besonders wichtige Methode: die CoreDispatcher.ProcessEvents-Methode, die die Fensterereignisverarbeitung startet. Wenn Sie diese Methode mit der falschen Option für Ihre App aufrufen, kann dies zu allen Arten von unerwartetem Ereignisverarbeitungsverhalten führen.

CoreProcessEventsOption-OptionBeschreibung
CoreProcessEventsOption.ProcessOneAndAllPending Verteilen Sie alle derzeit verfügbaren Ereignisse in der Warteschlange. Wenn keine Ereignisse ausstehen, warten Sie auf das nächste neue Ereignis.
CoreProcessEventsOption.ProcessOneIfPresent Verteilen Sie ein Ereignis, wenn es in der Warteschlange aussteht. Wenn keine Ereignisse ausstehen, warten Sie nicht, dass ein neues Ereignis ausgelöst wird, sondern kehren Sie stattdessen sofort zurück.
CoreProcessEventsOption.ProcessUntilQuit Warten Sie auf neue Ereignisse, und verteilen Sie alle verfügbaren Ereignisse. Setzen Sie dieses Verhalten fort, bis das Fenster geschlossen wird oder die Anwendung die Close-Methode für die CoreWindow-Instanz aufruft.
CoreProcessEventsOption.ProcessAllIfPresent Verteilen Sie alle derzeit verfügbaren Ereignisse in der Warteschlange. Wenn keine Ereignisse ausstehen, kehren Sie sofort zurück.

 

Für Windows Store-Apps mit DirectX muss die CoreProcessEventsOption.ProcessAllIfPresent-Option verwendet werden, um blockierendes Verhalten zu verhindern, das Grafikaktualisierungen beeinträchtigen könnte.

 

 

Anzeigen:
© 2014 Microsoft. Alle Rechte vorbehalten.