// Copyright (c) 1997-1999 Microsoft Corporation // // wizard base class // // 12-15-97 sburns #ifndef WIZARD_HPP_INCLUDED #define WIZARD_HPP_INCLUDED // A Wizard manages the traversal of 1+ WizardPage instances. class Wizard { public: // These values allow evil hacks to access the buttons on the wizard // control with GetDlgItem. I discovered the control IDs by using spy++, // see also // Don't lecture me about sleazy comctl32 hacks, ok? enum ButtonIds { BACK_BTN_ID = 12323, NEXT_BTN_ID = 12324, FINISH_BTN_ID = 12325, HELP_BTN_ID = 9 }; Wizard( unsigned titleStringResID, unsigned banner16BitmapResID, unsigned banner256BitmapResID, unsigned watermark16BitmapResID, unsigned watermark1256BitmapResID); ~Wizard(); // Adds the page to the wizard. Takes ownership of the instance, and // will delete it when the Wizard is deleted. void AddPage(WizardPage* page); // Invokes Create on all of the pages that have been added. // Calls Win32 ::PropertySheet to display and (modally) execute the // wizard. Returns same values as ::PropertySheet. // // parentWindow - in, optional, handle to parent window. Default is 0, // for which the current desktop window will be used. // // startPageIndex - in, optional, the index of the page to start the // wizard at. Default is 0, which is the first page that is added // using the AddPage method. // // sheetCallback - in, optional, pointer to a property sheet callback // function that will be called by ComCtl32 when the property sheet // is being created and destroyed. INT_PTR ModalExecute( HWND parentWindow = 0, UINT startPageIndex = 0, PFNPROPSHEETCALLBACK sheetCallback = 0); // Pushes the current page id on the backtracking stack, and causes the // given page to be transitioned to. Should be called in the OnSetActive or // OnWizNext method of a WizardPage instance (which is the default behavior // of the WizardPage base class). // // wizardPage - window handle of the current page (the page that is // handling OnSetActive or OnWizNext) // // pageResId - the resource ID of the next page to be shown. void SetNextPageID(HWND wizardPage, int pageResId); // Pops the last page id off the history stack, and sets that page to be // transitioned to. Should be called in the OnSetActive or OnWizBack // method of a WizardPage instance (which is the default behavior of the // WizardPage base class). // // wizardPage - window handle of the current page (the page that is // handling OnSetActive or OnWizBack) void Backtrack(HWND wizardPage); // Returns true if Backtrack was the last function called to cause a page // transition, false if not. By checking IsBacktracking in OnSetActive, a // WizardPage can determine if it was transitioned to by the user backing // up (IsBacktracking = true) or moving forward (IsBacktracking = false). bool IsBacktracking(); private: // not implemented: copy not allowed Wizard(const Wizard&); const Wizard& operator=(const Wizard&); typedef std::list > PageList; typedef std::vector > UIntVector; // we derive a new stack class from std::stack to get at the protected // container member of that base class. We need to do this for our // loop collapsing logic. class PageIdStack : public std::stack { public: typedef std::stack base; PageIdStack() : base() { } void pop_and_remove_loops(); void push(const value_type& x) { LOG(String::format(L"push %1!d!", x)); base::push(x); // dump(); } private: // void // dump() // { // LOG(String::format(L"%1!d!", size())); // // for (int i = 0; i < size(); ++i) // { // LOG(String::format(L"%1!d!", c[i])); // } // // // for( // // UIntVector::iterator i = c.begin(); // // i != c.end(); // // ++i) // // { // // LOG(String::format(L"%1!d!", *i)); // // } // } }; unsigned banner16ResId; unsigned banner256ResId; bool isBacktracking; PageIdStack pageIdHistory; PageList pages; unsigned titleResId; unsigned watermark16ResId; unsigned watermark256ResId; }; #endif // WIZARD_HPP_INCLUDED