...someplace, where there isn't any trouble? Do you suppose there is such a place, Toto?

AERO Wizards und MFC - Ein Trauerspiel in zwei Akten...(Zweiter Akt)

Im letzten Posting habe ich auf einige prinzipielle Besonderheiten von AERO Wizards hingewiesen, die mit MFCs CPropertySheet/CPropertyPage erstellt wurden. In diesem Posting will ich auf ein paar Spezialitäten hinweisen, die weitere Erwähnung verdient haben und außerdem meinen Workaround aus dem ganzen Dilemma vorstellen.

Zunächst einmal ist es wichtig zu wissen, daß CPropertySheet::DoModal einen anderen Rückgabewert hat, wenn man ihn als AERO-Wizard betreibt. Drückt der geneigte Benutzer den Finish-Button, dann geben herkömmliche Wizards, einschließlich Wizard97-basierte Wizards, den Wert ID_WIZFINISH von DoModal zurück. Ein AERO-basierter Wizard liefert den Wert IDOK zurück.

Um einzelne Wizardbuttons zu enabeln oder zu disablen, benutzt man bei AERO-Wizards die neue Nachricht PSM_ENABLEWIZBUTTONS (WM_USER + 139) oder das Makro PropSheet_EnableWizButtons. Für hekömmliche Wizards benutzt man PSM_SETWIZBUTTONS (WM_USER + 112). Natürlich verwendet CPropertySheet::SetWizardButtons ausschliesslich PSM_SETWIZBUTTONS und weiß an dieser Stelle nichts von AERO Wizards. Dann gibt es da noch drei neue Nachrichten nur für AERO-Wizards namens PSM_SHOWWIZBUTTONS (zeigt oder verbirgt einzelne Wizard-Buttons), PSM_SETBUTTONTEXT (setzt Button-Texte) und PSM_SETNEXTTEXT (setzt den Text des Next-Buttons), für die es keine Pendants für herkömmliche Wizards gibt. Zum Ausgleich funktioniert dafür so rund die Hälfte der herkömmlichen Wizard-Nachrichten mit AERO-Wizards gar nimmer, als da wären:

PSM_APPLY
PSM_CANCELTOCLOSE
PSM_CHANGED
PSM_GETCURRENTPAGEHWND
PSM_GETRESULT
PSM_GETTABCONTROL
PSM_INSERTPAGE
PSM_ISDIALOGMESSAGE
PSM_PRESSBUTTON (in Teilen)
PSM_REBOOTSYSTEM
PSM_RECALCPAGESIZES
PSM_RESTARTWINDOWS
PSM_SETHEADERBITMAP
PSM_SETHEADERBITMAPRESOURCE
PSM_SETHEADERSUBTITLE
PSM_SETTITLE
PSM_UNCHANGED

Und das sind nun erstmal nur diejenigen Nachrichten, für die auch dokumentiert ist, daß sie mit AERO-Wizards nicht funktionieren. Wenn man also einen bestehenden Wizard in einen AERO-Wizard umwandeln will, sollte man also zuerst einmal abklären, ob unter der Haube irgendwo eine dieser Nachrichten oder seine Verkapselung in Methoden von CPropertySheet/CPropertyPage verwendet wird. Ich für meinen Teil habe begonnen, mir Klassen zu schreiben, die die Eigentümlichkeiten der AERO-Wizards kapseln und mir eine Auswahl des Stils, also Wizard97 oder AERO, zum Instanziierungszeitpunkt gestatten. Die Klassen, CWiz97AeroPropertySheet und CWiz97AeroPropertyPage, haben bisher nur das, was ich bis jetzt brauche und werden sicherlich im Lauf der nächsten Jahre noch anwachsen. Man setzt sie einfach statt CPropertySheet/CPropertyPage ein und kann sie hier downloaden.

Trackback address for this post

This is a captcha-picture. It is used to prevent mass-access by robots.
Please enter the characters from the image above. (case insensitive)

No feedback yet

Comments are closed for this post.