Erstellen von Assistenten

Ein Assistent ist eine Art von Eigenschaftenblatt, das eine einfache und leistungsstarke Möglichkeit bietet, Benutzer durch eine Prozedur zu führen.

Assistenten sind einer der Schlüssel zur Vereinfachung der Benutzererfahrung. Sie ermöglichen es Ihnen, einen komplexen Vorgang zu nehmen, z. B. die Konfiguration einer Anwendung, und ihn in eine Reihe einfacher Schritte zu unterteilen. An jedem Punkt im Prozess können Sie eine Erläuterung der benötigten Elemente bereitstellen und Steuerelemente anzeigen, mit denen der Benutzer Auswahlmöglichkeiten treffen und Text eingeben kann.

Ein Assistent ist tatsächlich ein Typ von Eigenschaftenblatt. Ein Eigenschaftenblatt ist im wesentlichen ein Container für eine Sammlung von Seiten, wobei jede Seite ein separates Dialogfeld ist. Während normale Eigenschaftenblätter dem Benutzer jederzeit den Zugriff auf eine beliebige Seite ermöglichen, zeigen Assistenten die Seiten nacheinander. Anstelle von Registerkarten werden Schaltflächen verwendet, um vorwärts und rückwärts zu navigieren. Die Reihenfolge, in der Seiten angezeigt werden, wird von der Anwendung gesteuert und kann basierend auf der Benutzereingabe geändert werden.

Es gibt zwei Hauptstile des Assistenten: den älteren Wizard97-Stil und den in Windows Vista eingeführten Aero-Stil. Abbildungen finden Sie unter Infos zu Eigenschaftenblättern. (Ein dritter Stil, der nur das PSH_WIZARD- oder PSH_WIZARD_LITE-Flag verwendet, zeigt eine einfache Folge von Eigenschaftenblättern ohne Kopfzeilen oder Wasserzeichen.)

Hinweis

Ein „Wasserzeichen“ im Kontext von Assistenten ist eine Bitmap, die am linken Rand einiger Seiten angezeigt wird.

 

Bei der Diskussion in den meisten Dokumenten wird davon ausgegangen, dass Sie einen Assistenten für ein System mit Version 5.80 oder höher der allgemeinen Steuerelemente implementieren. Wenn Sie versuchen, den Stil „Wizard97“ mit früheren Versionen der allgemeinen Steuerelemente zu verwenden, kann die Anwendung möglicherweise kompiliert werden, aber sie wird nicht ordnungsgemäß angezeigt. Eine Erläuterung zum Erstellen eines Wizard97-kompatiblen Assistenten auf früheren Systemen finden Sie später in diesem Thema unter „Abwärtskompatible Assistenten“.

Wichtige Informationen

Technologie

Voraussetzungen

  • C/C++
  • Programmierung einer Windows-Benutzeroberfläche

Anweisungen

Implementierung eines Assistenten

Das Implementieren eines Assistenten ähnelt der Implementierung eines regulären Eigenschaftenblatts. Auf der untersten Ebene geht es darum, eines der folgenden Flags oder Kombinationen von Flags in der PROPSHEETHEADER-Struktur festzulegen, die das Eigenschaftenblatt definiert.

Flag Stil
PSH_WIZARD Ein einfacher Assistent ohne Kopfzeilen oder Bitmaps.
PSH_WIZARD_LITE Ähnlich wie PSH_WIZARD, mit einigen geringfügigen Unterschieden im Erscheinungsbild. Beispielsweise wird die Trennlinie über den Schaltflächen auf die volle Breite des Fensters festgelegt.
PSH_WIZARD97 Ein Wizard97-Assistent mit (optionalen) Kopfzeilen, Kopfzeilenbitmaps und Wasserzeichen.
PSH_WIZARD | PSH_AEROWIZARD Ein Aero-Assistent. Aero-Assistenten verwenden keine Wasserzeichen oder Kopfzeilenbitmaps. Sie benötigen das Singlethread-Apartmentmodell (STA-Modell).

 

Das grundlegende Verfahren für die Implementierung eines Assistenten ist wie folgt:

  1. Erstellen Sie eine Dialogfeldvorlage für jede Seite.
  2. Definieren Sie die Seiten, indem Sie eine PROPSHEETPAGE-Struktur für jede Seite erstellen. Diese Struktur definiert die Seite und enthält Zeiger auf die Dialogfeldvorlage und alle Bitmaps oder anderen Ressourcen.
  3. Übergeben Sie die im vorherigen Schritt erstellte PROPSHEETPAGE-Struktur an die CreatePropertySheetPage-Funktion, um den HPROPSHEETPAGE-Handler der Seite zu erstellen.
  4. Definieren Sie den Assistenten, indem Sie für ihn eine PROPSHEETHEADER-Struktur erstellen.
  5. Übergeben Sie die PROPSHEETHEADER-Struktur an die PropertySheet-Funktion, um den Assistenten anzuzeigen.
  6. Implementieren Sie Dialogfeldprozeduren für jede Seite, um Benachrichtigungen von den Steuerelementen der Seite und den Schaltflächen des Assistenten zu verarbeiten und anderes Windows-Messaging zu verarbeiten.

Erstellen der Dialogfeldvorlagen

Es gibt zwei grundlegende Arten der Assistentenseite: äußere und innere. Außenseiten sind die Einführungsseiten (Willkommensseiten) und die Abschlussseiten. Alle anderen Seiten sind Innenseiten.

Dialogfeldvorlagen für Außenseiten

Das Basislayout der Einführungs- und Abschlussseiten ist identisch. Die folgende Abbildung zeigt ein Beispiel der Wizard97-Einführungsseite mit einem Platzhalterwasserzeichen.

screen shot showing a wizard page with a graphic on the left, title and body text on the right, and back, next and cancel buttons at the bottom

Bei Wizard97-Außenseiten ist die Dialogfeldvorlage 317 x 193 Dialogeinheiten. Sie füllt den gesamten Assistenten aus, mit Ausnahme der Untertitel und des Bereichs unten, der die Schaltflächen Zurück, Weiter und Abbrechen enthält. Die linke Seite der Vorlage, die für eine „Wasserzeichen“-Bitmap reserviert ist, sollte keine Steuerelemente enthalten. Das Wasserzeichen wird in der PROPSHEETHEADER-Struktur des Assistenten angegeben und der Seite automatisch hinzugefügt. Sie müssen beim Entwerfen der Ressourcenvorlage Platz dafür reservieren.

Beachten Sie beim Erstellen der Wasserzeichenbitmap, dass das Dialogfeld möglicherweise größer wird, wenn der Benutzer beispielsweise eine große Systemschriftart auswählt. Unterschiedliche Sprachen neigen auch dazu, unterschiedliche Schriftartmetriken zu haben. Wenn die Seite wächst, wird der für das Wasserzeichen reservierte Bereich proportional größer. Sie können die Wasserzeichenbitmap jedoch nicht ändern, noch wird die Bitmap gestreckt, um den größeren Bereich auszufüllen. Stattdessen wird die Bitmap in der ursprünglichen Größe im oberen linken Bereich des reservierten Bereichs belassen. Der Teil des größeren reservierten Bereichs, der nicht durch das Wasserzeichen abgedeckt wird, wird automatisch mit der Farbe des oberen linken Pixels der Bitmap gefüllt.

Wenn Sie für unterschiedliche Schriftartmetriken Wasserzeichenbitmaps unterschiedlicher Größe verwenden müssen, gibt es zwei mögliche Lösungen:

  • Rufen Sie die Schriftartmetriken ab, bevor Sie den Assistenten erstellen, und geben Sie eine entsprechend dimensionierte Wasserzeichenbitmap an.
  • Geben Sie beim Erstellen des Assistenten keine Wasserzeichenbitmap an. Wizard97 wird den Wasserzeichenbereich leer lassen. Zeichnen Sie dann eine entsprechend dimensionierte Bitmap auf dem Bereich, der für das Wasserzeichen reserviert ist.

Sie können Steuerelemente in dem Bereich rechts neben dem Wasserzeichen platzieren, so wie Sie es für ein normales Dialogfeld tun würden. Die Hintergrundfarbe dieses Bereichs wird vom System bestimmt und erfordert keine Aktion von Ihnen. Normalerweise platzieren Sie zwei statische Steuerelemente in diesen Bereich. Das obere enthält den Titel und verwendet eine große fett formatierte Schriftart (12 Punkt Verdana Bold für Wizard97). Das andere, das für erklärenden Text bestimmt ist, verwendet die Standardschriftart des Dialogfelds.

Der Hauptunterschied zwischen den Einführungs- und Abschlussseiten sind die Schaltflächen des Assistenten und der Text in den statischen Steuerelementen. Einführungsseiten verfügen normalerweise über eine Schaltfläche Weiter und Zurück, wobei nur die Schaltfläche Weiter aktiviert ist. Abschlussseiten haben die Schaltfläche Zurück aktiviert, und die Schaltfläche Weiter wird durch eine Schaltfläche Fertig stellen ersetzt.

Hinweis

In Aero-Assistenten wird die Schaltfläche Zurück durch eine Pfeilschaltfläche in der Untertitelleiste ersetzt.

 

Sie können den Text auf der Schaltfläche Fertig stellen ändern, indem Sie dem Assistenten eine PSM_SETFINISHTEXT-Nachricht senden. Standardmäßig enthält die Schaltfläche Fertig stellen keine Tastenkombination. Um eine Tastenkombination zu definieren, schließen Sie ein kaufmännisches Und-Zeichen in die Textzeichenfolge ein, die Sie an PSM_SETFINISHTEXT übergeben. Beispielsweise definiert „&Fertig stellen“ „F“ als Tastenkombination.

Dialogfeldvorlagen für Innenseite

Innenseiten haben ein etwas anderes Erscheinungsbild als Außenseiten. Die folgende Abbildung zeigt ein Beispiel für eine Wizard97-Innenseite mit einer Platzhalterkopfzeilenbitmap.

screen shot of a wizard page with title and subtitle text and a graphic at the top, text in the middle, and buttons on the bottom

Der Kopfzeilenbereich oben auf der Seite wird vom Eigenschaftenblatt verarbeitet, sodass er nicht in der Vorlage enthalten ist. Der Inhalt der Kopfzeile wird in der PROPSHEETPAGE-Struktur der Seite und der PROPSHEETHEADER-Struktur des Assistenten angegeben. Da die Innenseite zwischen die Kopfzeile und die Schaltflächen passen muss, ist die Wizard97-Dialogfeldvorlage 317 x 143 Dialogeinheiten, etwas kleiner als die Vorlage für Außenseiten.

Die folgende Abbildung zeigt einen Aero-Assistenten, der aus derselben Vorlage erstellt wurde.

screen shot that differs from the previous one by having a title area at the top, and only next and cancel buttons at the bottom

Definieren der Assistentenseiten

Nachdem Sie die Dialogfeldvorlagen und zugehörige Ressourcen wie Bitmaps und Zeichenfolgentabellen erstellt haben, können Sie die Seiten des Eigenschaftenblatts erstellen. Die Prozedur ist ähnlich wie bei den Standard-Eigenschaftenblättern. Füllen Sie zunächst die entsprechenden Elemente einer PROPSHEETPAGE-Struktur aus. (Einige Elemente sind spezifisch für Assistenten.) Rufen Sie dann die CreatePropertySheetPage-Funktion auf, um den HPROPSHEETPAGE-Handler der Seite zu erstellen.

Die folgenden Assistenten-bezogenen Flags können im dwFlags-Element der PROPSHEETPAGE-Struktur festgelegt werden.

Flag Beschreibung
PSP_HIDEHEADER Legen Sie dieses Flag für Außenseiten in Wizard97 fest. Die Kopfzeile wird nicht angezeigt, und ein Wasserzeichen kann angezeigt werden.
PSP_USEHEADERTITLE Legen Sie dieses Flag für Innenseiten fest, um einen Titel im Kopfzeilenbereich in Wizard97 oder am oberen Rand des Clientbereichs in einem Aero-Assistenten zu platzieren.
PSP_USEHEADERSUBTITLE Legen Sie diese Kennzeichnung für Innenseiten fest, um einen Untertitel im Kopfzeilenbereich in Wizard97 zu setzen.

 

Wenn Sie PSP_USEHEADERTITLE oder PSP_USEHEADERSUBTITLE festgelegt haben, weisen Sie den Elementen pszHeaderTitle und pszHeaderSubtitle den Titel und den Untertiteltext zu. Wenn Sie Elementen der PROPSHEETPAGE- und PROPSHEETHEADER-Strukturen Textzeichenfolgen zuweisen, können Sie entweder einen Zeichenfolgenzeiger zuweisen oder das MAKEINTRESOURCE-Makro verwenden, um einen Wert aus einer Zeichenfolgenressource zuzuweisen. Die Zeichenfolgenressource wird aus dem Modul geladen, das im hInstance-Element der PROPSHEETHEADER-Struktur des Assistenten angegeben ist.

Wenn Sie CreatePropertySheetPage zum Erstellen einer Seite aufrufen, weisen Sie das Ergebnis einem Element eines Arrays von HPROPSHEETPAGE-Handlern zu. Dieses Array wird beim Erstellen des Eigenschaftenblatts verwendet. Der Arrayindex des Handlers einer Seite bestimmt die Standardreihenfolge, in der sie angezeigt wird. Nachdem Sie den HPROPSHEETPAGE-Handler einer Seite erstellt haben, können Sie dieselbe PROPSHEETPAGE-Struktur wiederverwenden, um die nächste Seite zu erstellen, indem Sie den relevanten Elementen neue Werte zuweisen.

Eine alternative Möglichkeit zum Erstellen von Seiten besteht darin, separate PROPSHEETPAGE-Strukturen für jede Seite zu verwenden und ein Array von Strukturen zu erstellen. Dieses Array wird anstelle eines Arrays von HPROPSHEETPAGE-Handlern beim Erstellen des Eigenschaftenblatts verwendet. Durch die Verwendung separater PROPSHEETPAGE-Strukturen ist es nicht erforderlich, CreatePropertySheetPage aufzurufen, aber es wird mehr Arbeitsspeicher benötigt. Ansonsten gibt es keinen signifikanten Unterschied zwischen den beiden Ansätzen.

Im folgenden Beispiel wird eine Wizard97-Innenseite durch Zuweisen von Werten zu einer PROPSHEETPAGE-Struktur definiert. In diesem Beispiel werden der Titel, der Untertitel und die Dialogfeldvorlage der Seite alle durch ihre Ressourcen-IDs identifiziert. Die CreatePropertySheetPage-Funktion wird dann aufgerufen, um den HPROPSHEETPAGE-Handler der Seite zu erstellen. Da es sich um die zweite Seite handelt, die angezeigt wird, wird der Handler dem Array von Handlern, ahpsp, mit einem Index von 1 zugewiesen.

// g_hInstance is the global HINSTANCE of the application.
// IntPage1DlgProc is the dialog procedure for this page.
// ahpsp is an array of HPROPSHEETPAGE handles.

PROPSHEETPAGE psp = { sizeof(psp) };

psp.hInstance         = g_hInstance;
psp.dwFlags           = PSP_USEHEADERTITLE | PSP_USEHEADERSUBTITLE;
psp.lParam            = (LPARAM) &wizdata;
psp.pszHeaderTitle    = MAKEINTRESOURCE(IDS_TITLE1);
psp.pszHeaderSubTitle = MAKEINTRESOURCE(IDS_SUBTITLE1);
psp.pszTemplate       = MAKEINTRESOURCE(IDD_INTERIOR1);
psp.pfnDlgProc        = IntPage1DlgProc;

ahpsp[1] = CreatePropertySheetPage(&psp);

Benutzerdefinierte Seitendaten

Wenn Sie eine Seite erstellen, können Sie ihr benutzerdefinierte Daten zuweisen, indem Sie das lParam-Element der PROPSHEETPAGE-Struktur verwenden, in der Regel durch Zuweisen eines Zeigers zu einer benutzerdefinierten Struktur.

Wenn die Seite zum ersten Mal ausgewählt wird, empfängt die zugehörige Dialogfeldprozedur eine WM_INITDIALOG-Nachricht. Der lParam-Wert der Nachricht zeigt auf eine Kopie der PROPSHEETPAGE-Struktur der Seite, aus der Sie die benutzerdefinierten Daten abrufen können. Sie können diese Daten dann für die Verwendung in nachfolgenden Nachrichten speichern, indem Sie SetWindowLongPtr mit GWL_USERDATA als Indexparameter verwenden. Mehrere Seiten können über einen Zeiger auf dieselben Daten verfügen, und jede Änderung an den Daten, die von einer Seite vorgenommenen werden, steht den anderen Seiten in ihren Dialogfeldprozeduren zur Verfügung.

Definieren des Assistenten-Eigenschaftenblatts

Wie bei normalen Eigenschaftenblättern definieren Sie das Eigenschaftenblatt des Assistenten, indem Sie Elemente einer PROPSHEETHEADER-Struktur ausfüllen. Mit dieser Struktur können Sie die Seiten angeben, aus denen der Assistent besteht, und die Standardreihenfolge, in der sie angezeigt werden, zusammen mit mehreren zugehörigen Parametern. Anschließend starten Sie den Assistenten, indem Sie die PropertySheet-Funktion aufrufen.

Im Wizard97-Stil wird das pszCaption-Element der PROPSHEETHEADER-Struktur ignoriert. Stattdessen zeigt der Assistent die Untertitel an, die in der Dialogfeldvorlage der aktuellen Seite angegeben ist. Wenn die Vorlage keine Untertitel aufweist, wird der Untertitel der vorherigen Seite angezeigt. Um also auf allen Seiten denselben Untertitel anzuzeigen, geben Sie den Untertitel in der Vorlage für die Einführungsseite an.

Im Stil des Aero-Assistenten wird der Untertitel des Dialogfelds von pszCaptionübernommen.

Wenn Sie ein Array von HPROPSHEETPAGE-Handlern für Ihre Seiten erstellt haben, weisen Sie das Array dem phpage-Element zu. Wenn Sie stattdessen ein Array von PROPSHEETPAGE-Strukturen erstellt haben, weisen Sie das Array dem ppsp-Element zu, und legen Sie das PSH_PROPSHEETPAGE-Flag im dwFlags-Element fest.

Das folgende Beispiel weist psh, eine PROPSHEETHEADER-Struktur, Werte zu, und ruft die PropertySheet-Funktion auf, um den Assistenten zu starten. Der Assistent im Wizard97-Stil verfügt sowohl über Wasserzeichen- als auch Kopfzeilengrafiken, die durch ihre Ressourcen-IDs angegeben werden. Das ahpsp-Array enthält alle HPROPSHEETPAGE-Handler und definiert die Standardreihenfolge, in der sie angezeigt werden.

// g_hInstance is the global HINSTANCE of the application.
// ahpsp is an array of HPROPSHEETPAGE handles.

PROPSHEETHEADER psh = { sizeof(psh) };

psh.hInstance      = g_hInstance;
psh.hwndParent     = NULL;
psh.phpage         = ahpsp;
psh.dwFlags        = PSH_WIZARD97 | PSH_WATERMARK | PSH_HEADER;
psh.pszbmWatermark = MAKEINTRESOURCE(IDB_WATERMARK);
psh.pszbmHeader    = MAKEINTRESOURCE(IDB_BANNER);
psh.nStartPage     = 0;
psh.nPages         = 4;

PropertySheet(&psh);

Die Dialogfeldprozedur

Jede Seite des Assistenten benötigt eine Dialogfeldprozedur zum Verarbeiten von Windows-Nachrichten, insbesondere Benachrichtigungen seiner Steuerelemente und des Assistenten. Die drei Nachrichten, die fast alle Assistenten verarbeiten können müssen, sind WM_INITDIALOG, WM_DESTROY und WM_NOTIFY.

Die WM_NOTIFY-Nachricht wird empfangen, bevor die Seite angezeigt wird, und wenn auf eine beliebige Schaltfläche des Assistenten geklickt wird. Der lParam-Parameter der Nachricht ist ein Zeiger auf eine NMHDR-Kopfzeilenstruktur. Die ID der Benachrichtigung ist im Code-Element der Struktur enthalten. Die vier Benachrichtigungen, welche die meisten Assistenten verarbeiten müssen, sind die folgenden.

Code Beschreibung
PSN_SETACTIVE Gesendet, bevor die Seite angezeigt wird.
PSN_WIZBACK Gesendet, wenn auf die Schaltfläche Zurück geklickt wird.
PSN_WIZNEXT Gesendet, wenn auf die Schaltfläche Weiter geklickt wird.
PSN_WIZFINISH Gesendet, wenn auf die Schaltfläche Fertig stellen geklickt wird.

 

Verarbeiten von WM_INITDIALOG und WM_DESTROY

Wenn eine Seite zum ersten Mal angezeigt werden soll, erhält ihre Dialogfeldprozedur eine WM_INITDIALOG-Nachricht. Die Verarbeitung dieser Meldung ermöglicht es dem Assistenten, alle erforderlichen Initialisierungsaufgaben durchzuführen, z. B. das Speichern benutzerdefinierter Daten oder das Festlegen von Schriftarten.

Wenn das Eigenschaftenblatt zerstört ist, erhalten Sie eine WM_DESTROY-Nachricht. Der Assistent wird automatisch vom System zerstört, aber durch die Verarbeitung dieser Nachricht können Sie alle erforderlichen Bereinigungen ausführen.

Verarbeiten von PSN_SETACTIVE

Der PSN_SETACTIVE-Benachrichtigungscode wird jedes Mal gesendet, wenn eine Seite sichtbar gemacht wird. Wenn eine Seite zum ersten Mal besucht wird, folgt PSN_SETACTIVE der WM_INITDIALOG-Nachricht. Wenn die Seite anschließend erneut besucht wird, empfängt sie nur eine PSN_SETACTIVE-Benachrichtigung. Diese Benachrichtigung wird in der Regel verarbeitet, um Daten für die Seite zu initialisieren und die entsprechenden Schaltflächen zu aktivieren.

Standardmäßig zeigt der Assistent die Schaltflächen Zurück, Weiter und Abbrechen an, wobei alle Schaltflächen aktiviert sind. Um eine Schaltfläche zu deaktivieren oder Fertig stellen anstelle von Weiter anzuzeigen, müssen Sie eine PSM_SETWIZBUTTONS-Nachricht senden. Nachdem diese Nachricht gesendet wurde, wird der Status der Schaltflächen beibehalten, bis sie von einer anderen PSM_SETWIZBUTTONS-Nachricht geändert werden, auch wenn eine neue Seite ausgewählt wird. In der Regel senden alle PSN_SETACTIVE-Handler diese Nachricht, um sicherzustellen, dass jede Seite den richtigen Schaltflächenstatus aufweist.

Sie können den Schaltflächenstatus jederzeit mit dieser Nachricht ändern. Sie möchten beispielsweise, dass die Schaltfläche Weiter anfänglich deaktiviert ist. Nachdem ein Benutzer alle erforderlichen Informationen eingegeben hat, können Sie eine weitere PSM_SETWIZBUTTONS-Nachricht senden, um die Schaltfläche Weiter zu aktivieren und den Benutzer mit der nächsten Seite fortfahren zu lassen.

Im folgenden Codefragment wird das PropSheet_SetWizButtons-Makro verwendet, um die Schaltflächen Zurück und Weiter auf einer Innenseite zu aktivieren, bevor sie angezeigt wird.

case WM_NOTIFY :
    {
        LPNMHDR pnmh = (LPNMHDR)lParam;
        
        switch(pnmh->code)
        {
        
        ...
        
        case PSN_SETACTIVE :
        
            ...
            
            // This is an interior page.
            PropSheet_SetWizButtons(hwnd, PSWIZB_NEXT | PSWIZB_BACK);
            
            ...
        }
    ...
    
    }

Verarbeiten von PSN_WIZNEXT, PSNWIZBACK und PSN_WIZFINISH

Wenn auf eine Schaltfläche Weiter oder Zurück geklickt wird, erhalten Sie einen PSN_WIZNEXT- oder PSN_WIZBACK-Benachrichtigungscode. Standardmäßig wechselt der Assistent automatisch zur nächsten oder vorherigen Seite in der Reihenfolge, die beim Erstellen des Eigenschaftenblatts definiert wird. Ein häufiger Grund für die Verarbeitung dieser Benachrichtigungen besteht darin, den Benutzer daran zu hindern, Seiten zu wechseln oder die Standardseitenreihenfolge zu überschreiben.

Um zu verhindern, dass der Benutzer Seiten wechselt, verarbeiten Sie die Schaltflächenbenachrichtigung, rufen Sie die SetWindowLong-Funktion auf, wobei der DWL_MSGRESULT-Wert auf -1 festgelegt ist, und geben Sie WAHR zurück. Beispiel:

case PSN_WIZNEXT :

        ...
        
        // Do not go to the next page yet.
        SetWindowLong(hwnd, DWL_MSGRESULT, -1);
        
        return TRUE;
        
        ...

Um die Standardreihenfolge außer Kraft zu setzen und zu einer bestimmten Seite zu wechseln, rufen Sie SetWindowLong auf, wobei der Wert DWL_MSGRESULT auf die Dialogfeldressourcen-ID der Seite festgelegt ist, und geben Sie WAHR zurück. Beispiel:

case PSN_WIZNEXT :

        ...
        
        // Go straight to the completion page.
        SetWindowLong(hwnd, DWL_MSGRESULT, IDD_FINISH);
        
        return TRUE;
        
        ...

Wenn auf die Schaltfläche Fertig stellen oder Abbrechen geklickt wird, erhalten Sie entweder einen PSN_WIZFINISH- oder einen PSN_RESET- Benachrichtigungscode. Wenn auf eine dieser Schaltflächen geklickt wird, wird der Assistent automatisch vom System zerstört. Sie können diese Benachrichtigungen jedoch verarbeiten, wenn Sie Bereinigungsaufgaben ausführen müssen, bevor der Assistent zerstört wird. Um zu verhindern, dass der Assistent zerstört wird, wenn Sie eine PSN_WIZFINISH-Benachrichtigung erhalten, rufen Sie SetWindowLong auf, wobei der DWL_MSGRESULT-Wert auf WAHR festgelegt ist, und geben Sie WAHRzurück. Beispiel:

case PSN_WIZFINISH :

        ...
        
        // Not finished yet.
        SetWindowLong(hwnd, DWL_MSGRESULT, TRUE);
        
        return TRUE;
        
        ...

Abwärtskompatible Assistenten

Im vorherigen Abschnitt wird davon ausgegangen, dass Sie einen Assistenten für ein System mit Version 5 oder höher der allgemeinen Steuerelemente implementieren.

Wenn Sie einen Assistenten für Systeme mit früheren Versionen der allgemeinen Steuerelemente schreiben, stehen viele der im vorherigen Abschnitt beschriebenen Features nicht zur Verfügung. Eine Reihe der Elemente der PROPSHEETHEADER- und PROPSHEETPAGE-Strukturen, die vom Wizard97-Stil verwendet werden, werden nur von allgemeinen Steuerelementen der Version 5 und höher unterstützt. Es ist jedoch weiterhin möglich, einen abwärtskompatiblen Assistenten mit einem ähnlichen Erscheinungsbild wie dem Wizard97-Stil zu implementieren. Dazu müssen Sie Folgendes explizit implementieren:

  • Fügen Sie die Wasserzeichengrafik zur Dialogfeldvorlage für Ihre Einführungs- und Abschlussseiten hinzu.
  • Erstellen Sie alle Ihre Vorlagen mit der gleichen Größe. Für Innenseiten gibt es keinen separaten systemdefinierten Kopfzeilenbereich.
  • Erstellen Sie den Kopfzeilenbereich der Innenseite explizit in Ihren Vorlagen.
  • Verwenden Sie keine Kopfzeilengrafik, da sie möglicherweise mit dem Titel oder Untertitel in Konflikt steht, wenn der Assistent die Größe ändert.

Weitere Informationen zu abwärtskompatiblen Assistenten finden Sie unter Abwärtskompatibler Wizard97.

Hinweise

Eine vollständige Erläuterung der Entwurfsprobleme für Wizard97 finden Sie in der Wizard97-Spezifikation an anderer Stelle im Windows SDK. Dieses Dokument enthält Richtlinien für Dinge wie die Abmessungen für die Dialogfelder, Abmessungen und Farben der Bitmaps sowie die Platzierung der Steuerelemente.

Verwenden von Eigenschaftenblättern

Demo für allgemeine Windows-Steuerelemente (CppWindowsCommonControls)