///////////////////////////////////////////////////////////////////////////// // // Copyright (c) 1996-2002 Microsoft Corporation // // Module Name: // AtlBaseWiz.cpp // // Abstract: // Implementation of the CWizardWindow class. // // Author: // David Potter (davidp) December 2, 1997 // // Revision History: // // Notes: // ///////////////////////////////////////////////////////////////////////////// #include #include "AtlBaseWiz.h" #include "AtlBaseWizPage.h" #include "AtlExtDll.h" #include "StlUtils.h" #include "ExcOper.h" #include "AdmCommonRes.h" ///////////////////////////////////////////////////////////////////////////// // Local Type Definitions ///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// // // class CAltExtWizardGuardPage // // Purpose: // Guard page transferring control between the main wizard and the // alternate extension wizard. // ///////////////////////////////////////////////////////////////////////////// template < class T > class CAltExtWizardGuardPage : public CExtensionWizardPageImpl< T > { typedef CAltExtWizardGuardPage< T > thisClass; typedef CExtensionWizardPageImpl< T > baseClass; public: // // Construction. // // Standard constructor CAltExtWizardGuardPage( DLGTEMPLATE * pdt ) : m_pdt( pdt ) { ATLASSERT( pdt != NULL ); } //*** CAltExtWizardGuardPage() // Destructor ~CAltExtWizardGuardPage( void ) { delete m_pdt; } //*** ~CAltExtWizardGuardPage() WIZARDPAGE_HEADERTITLEID( 0 ) WIZARDPAGE_HEADERSUBTITLEID( 0 ) enum { IDD = 0 }; DECLARE_CLASS_NAME() // Return the help ID map static const DWORD * PidHelpMap( void ) { static const DWORD s_aHelpIDs[] = { 0, 0 }; return s_aHelpIDs; } //*** PidHelpMap() // Create the page DWORD ScCreatePage( void ) { ATLASSERT( m_hpage == NULL ); m_psp.dwFlags |= PSP_DLGINDIRECT; m_psp.pResource = m_pdt; m_hpage = CreatePropertySheetPage( &m_psp ); if ( m_hpage == NULL ) { return GetLastError(); } // if: error creating the page return ERROR_SUCCESS; } //*** ScCreatePage() public: // // Message map. // BEGIN_MSG_MAP( thisClass ) MESSAGE_HANDLER( WM_ACTIVATE, OnActivate ) CHAIN_MSG_MAP( baseClass ) END_MSG_MAP() // // Message handler functions. // // Handler for the WM_ACTIVATE message LRESULT OnActivate( UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL & bHandled ) { // // Don't allow us to be activated. // //WORD fActive = LOWORD( wParam ); HWND hwndPrevious = (HWND) lParam; if ( wParam != WA_INACTIVE ) { ::SetActiveWindow( hwndPrevious ); } return 0; } //*** OnActivate() // // Message handler override functions. // protected: DLGTEMPLATE * m_pdt; }; //*** class CAltExtWizardGuardPage ///////////////////////////////////////////////////////////////////////////// // // class CAltExtWizardPreLauncherPage // // Purpose: // Extension launcher wizard page used to display Wizard97 pages in // a non-Wizard97 sheet or vice-versa. // ///////////////////////////////////////////////////////////////////////////// class CAltExtWizardPreLauncherPage : public CAltExtWizardGuardPage< CAltExtWizardPreLauncherPage > { typedef CAltExtWizardGuardPage< CAltExtWizardPreLauncherPage > baseClass; public: // // Construction. // // Standard constructor CAltExtWizardPreLauncherPage( DLGTEMPLATE * pdt ) : baseClass( pdt ) { } //*** CAltExtWizardPreLauncherPage() DECLARE_CLASS_NAME() public: // // Message map. // //BEGIN_MSG_MAP( CAltExtWizardPreLauncherPage ) // CHAIN_MSG_MAP( baseClass ) //END_MSG_MAP() // // Message handler functions. // // // Message handler overrides functions. // // Handler for PSN_SETACTIVE BOOL OnSetActive( void ); }; //*** class CAltExtWizardPreLauncherPage ///////////////////////////////////////////////////////////////////////////// // // class CAltExtWizardPostLauncherPage // // Purpose: // Page use to switch between the main wizard and the alternate // extension wizard when moving backwards. // ///////////////////////////////////////////////////////////////////////////// class CAltExtWizardPostLauncherPage : public CAltExtWizardGuardPage< CAltExtWizardPostLauncherPage > { typedef CAltExtWizardGuardPage< CAltExtWizardPostLauncherPage > baseClass; public: // // Construction. // // Standard constructor CAltExtWizardPostLauncherPage( DLGTEMPLATE * pdt ) : baseClass( pdt ) { } //*** CAltExtWizardPostLauncherPage() DECLARE_CLASS_NAME() public: // // Message map. // //BEGIN_MSG_MAP( CAltExtWizardPostLauncherPage ) // CHAIN_MSG_MAP( baseClass ) //END_MSG_MAP() // // Message handler functions. // // // Message handler override functions. // // Handler for PSN_SETACTIVE BOOL OnSetActive( void ); }; //*** class CAltExtWizardPostLauncherPage ///////////////////////////////////////////////////////////////////////////// // // class CAltExtWizard // // Purpose: // Dummy wizard to host pages that are not of the same type as the main // wizard, e.g. non-Wizard97 pages in a Wizard97 wizard. // ///////////////////////////////////////////////////////////////////////////// class CAltExtWizard : public CWizardImpl< CAltExtWizard > { typedef CWizardImpl< CAltExtWizard > baseClass; friend class CWizardWindow; friend class CAltExtWizardPreLauncherPage; friend class CAltExtWizardPostLauncherPage; friend class CAltExtWizardPrefixPage; friend class CAltExtWizardPostfixPage; public: // // Construction // // Standard constructor CAltExtWizard( void ) : CWizardImpl< CAltExtWizard >( _T("") ) , m_pwizMain( NULL ) , m_bWindowMoved( FALSE ) , m_bExitMsgLoop( FALSE ) , m_nExitButton( 0 ) { } //*** CExtensionAltWizard() // Initialize the sheet BOOL BInit( IN CWizardWindow * pwiz ); public: // // Message map. // BEGIN_MSG_MAP( CAltExtWizard ) COMMAND_HANDLER( IDCANCEL, BN_CLICKED, OnCancel ) CHAIN_MSG_MAP( baseClass ) END_MSG_MAP() // // Message handler functions. // // Handler for BN_CLICKED on the Cancel button LRESULT OnCancel( WORD wNotifyCode, WORD idCtrl, HWND hwndCtrl, BOOL & bHandled ) { // // Notify the main wizard that the user pressed the cancel button. // ExitMessageLoop( PSBTN_CANCEL ); bHandled = FALSE; return 0; } //*** OnCancel() // // Message handler override functions. // // Handler for the final message after WM_DESTROY void OnFinalMessage( HWND hWnd ) { PwizMain()->DeleteAlternateWizard(); } //*** OnFinalMessage() protected: CWizardWindow * m_pwizMain; // Pointer to the main wizard. BOOL m_bWindowMoved; // Indicates whether this window has been // repositioned over main wizard or not. BOOL m_bExitMsgLoop; // Indicates whether the message loop // should be exited or not. DWORD m_nExitButton; // Button to press after exiting. protected: // Return a pointer to the main wizard CWizardWindow * PwizMain( void ) { return m_pwizMain; } // Return whether the wizard has been moved yet BOOL BWindowMoved( void ) const { return m_bWindowMoved; } // Return whether the message loop should be exited or not BOOL BExitMessageLoop( void ) const { return m_bExitMsgLoop; } // Change whether the message loop should be exited or not void ExitMessageLoop( IN DWORD nButton ) { ATLASSERT( (nButton == PSBTN_BACK) || (nButton == PSBTN_NEXT) || (nButton == PSBTN_CANCEL) ); m_bExitMsgLoop = TRUE; m_nExitButton = nButton; } //*** ExitMessageLoop() // Return the button to press in the main wizard after exiting DWORD NExitButton( void ) const { return m_nExitButton; } protected: // Add the prefix page BOOL BAddPrefixPage( IN WORD cx, IN WORD cy ); // Add the postfix page BOOL BAddPostfixPage( IN WORD cx, IN WORD cy ); // Display the alternate wizard void DisplayAlternateWizard( void ); // Display the main wizard void DisplayMainWizard( void ); // Destroy the alternate extension wizard void DestroyAlternateWizard( void ); // Message loop for the modeless wizard void MessageLoop( void ); }; //*** class CAltExtWizard ///////////////////////////////////////////////////////////////////////////// // // class CAltExtWizardPrefixPage // // Purpose: // Wizard page which precedes the first alternate page. This page // handles transferring control between the main wizard and the // alternate wizard. // ///////////////////////////////////////////////////////////////////////////// class CAltExtWizardPrefixPage : public CAltExtWizardGuardPage< CAltExtWizardPrefixPage > { typedef CAltExtWizardGuardPage< CAltExtWizardPrefixPage > baseClass; public: // // Construction. // // Standard constructor CAltExtWizardPrefixPage( DLGTEMPLATE * pdt ) : baseClass( pdt ) { } //*** CAltExtWizardPrefixPage() DECLARE_CLASS_NAME() public: // // Message map. // //BEGIN_MSG_MAP( CAltExtWizardPrefixPage ) // CHAIN_MSG_MAP( baseClass ) //END_MSG_MAP() // // Message handler functions. // // // Message handler override functions. // // Handler for PSN_SETACTIVE BOOL OnSetActive( void ); protected: // Return the alternate wizard object CAltExtWizard * PwizThis( void ) { return (CAltExtWizard *) Pwiz(); } }; //*** class CAltExtWizardPrefixPage ///////////////////////////////////////////////////////////////////////////// // // class CAltExtWizardPostfixPage // // Purpose: // Wizard page which follows the last alternate page. This page // handles transferring control between the main wizard and the // alternate wizard. // ///////////////////////////////////////////////////////////////////////////// class CAltExtWizardPostfixPage : public CAltExtWizardGuardPage< CAltExtWizardPostfixPage > { typedef CAltExtWizardGuardPage< CAltExtWizardPostfixPage > baseClass; public: // // Construction. // // Standard constructor CAltExtWizardPostfixPage( DLGTEMPLATE * pdt ) : baseClass( pdt ) { } //*** CAltExtWizardPostfixPage() DECLARE_CLASS_NAME() public: // // Message map. // //BEGIN_MSG_MAP( CAltExtWizardPostfixPage ) // CHAIN_MSG_MAP( baseClass ) //END_MSG_MAP() // // Message handler functions. // // // Message handler override functions. // // Handler for PSN_SETACTIVE BOOL OnSetActive( void ); protected: // Return the alternate wizard object CAltExtWizard * PwizThis( void ) { return (CAltExtWizard *) Pwiz(); } }; //*** class CAltExtWizardPostfixPage //*************************************************************************// ///////////////////////////////////////////////////////////////////////////// // class CWizardWindow ///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// //++ // // CWizardWindow::~CWizardWindow // // Routine Description: // Destructor. // // Arguments: // None. // // Return Value: // None. // // Exceptions Thrown: // None. // //-- ///////////////////////////////////////////////////////////////////////////// CWizardWindow::~CWizardWindow( void ) { // // Delete the alternate wizard, if it exists. // if ( (PwizAlternate() != NULL) && (PwizAlternate()->m_hWnd != NULL) ) { reinterpret_cast< CAltExtWizard * >( PwizAlternate() )->DestroyAlternateWizard(); } // if: alternate wizard exists // // Delete pages from the page list. // if ( m_plwpPages != NULL ) { DeleteAllPtrListItems( m_plwpPages ); delete m_plwpPages; } // if: page array has been allocated if ( m_plewpNormal != NULL ) { DeleteAllPtrListItems( m_plewpNormal ); delete m_plewpNormal; } // if: list already exists if ( m_plewpAlternate != NULL ) { DeleteAllPtrListItems( m_plewpAlternate ); delete m_plewpAlternate; } // if: list already exists } //*** CWizardWindow::~CWizardWindow() ///////////////////////////////////////////////////////////////////////////// //++ // // CWizardWindow::BAddPage // // Routine Description: // Add a page to the page list. If it is the first page, it won't have // a BACK button. If it isn't the first page, the last page will have // its FINISH button changed to a NEXT button and this page will have // both a FINISH button and a BACK button. // // Arguments: // pwp [IN] Wizard page to add. // // Return Value: // TRUE Page added successfully. // FALSE Error adding page. // //-- ///////////////////////////////////////////////////////////////////////////// BOOL CWizardWindow::BAddPage( IN CWizardPageWindow * pwp ) { ATLASSERT( pwp != NULL ); // Make sure specified page hasn't already been added. ATLASSERT( (m_plwpPages == NULL) || (std::find( PlwpPages()->begin(), PlwpPages()->end(), pwp ) == PlwpPages()->end()) ); BOOL bSuccess = FALSE; ULONG fWizardButtons = PSWIZB_FINISH; ULONG fPrevWizardButtons; // Loop to avoid goto's. do { // // Allocate the page list if it doesn't exist yet. // if ( m_plwpPages == NULL ) { m_plwpPages = new CWizardPageList; if ( m_plwpPages == NULL ) { CNTException nte( static_cast< DWORD >( E_OUTOFMEMORY ), ADMC_IDS_ADD_FIRST_PAGE_TO_PROP_SHEET_ERROR, NULL, // pszOperArg1 NULL, // pszOperArg2 FALSE // bAutoDelete ); nte.ReportError(); break; } // if: error allocating page list } // if: no page array yet // // If this is not the first page in the list, set the previous // page's wizard buttons to have a NEXT button instead of a // FINISH button and set this page to have a BACK button. // if ( PlwpPages()->size() > 0 ) { // // Get the current last page. // CWizardPageList::iterator itFirst = PlwpPages()->begin(); CWizardPageList::iterator itLast = PlwpPages()->end(); ATLASSERT( itFirst != itLast ); CWizardPageWindow * pwpPrev = *(--PlwpPages()->end()); ATLASSERT( pwpPrev != NULL ); // // Set the wizard buttons on that page. // fPrevWizardButtons = pwpPrev->FWizardButtons(); fPrevWizardButtons &= ~PSWIZB_FINISH; fPrevWizardButtons |= PSWIZB_NEXT; pwpPrev->SetDefaultWizardButtons( fPrevWizardButtons ); fWizardButtons |= PSWIZB_BACK; } // if: not the first page added pwp->SetDefaultWizardButtons( fWizardButtons ); // // Insert the page at the end of the list. // PlwpPages()->insert( PlwpPages()->end(), pwp ); // // Add the page to the sheet. If the sheet hasn't been created yet, // add it to the sheet header list. If the sheet has been created, // add it to the sheet dynamically. Note that the page must not be a // static page. // if ( m_hWnd == NULL ) { // // If this is a dynamic page, add it using its hpage. Otherwise // it must be a static page. Add it by its property sheet page header. // CDynamicWizardPageWindow * pdwp = dynamic_cast< CDynamicWizardPageWindow * >( pwp ); if ( pdwp != NULL ) { if ( pdwp->Hpage() != NULL ) { ATLASSERT( ! pdwp->BPageAddedToSheet() ); bSuccess = BAddPageToSheetHeader( pdwp->Hpage() ); if ( ! bSuccess ) { CNTException nte( GetLastError(), ADMC_IDS_ADD_PAGE_TO_WIZARD_ERROR, NULL, NULL, FALSE ); nte.ReportError(); break; } // if: error adding the page to the sheet header pdwp->SetPageAdded( TRUE ); } // if: page already created } // if: dynamic page else { // Must be static page ATLASSERT( dynamic_cast< CStaticWizardPageWindow * >( pwp ) != NULL ); // // Initialize the page. // bSuccess = pwp->BInit( this ); if ( ! bSuccess ) { break; } // if: error initializing the page // // Add the page. // bSuccess = AddPage( pwp->Ppsp() ); if ( ! bSuccess ) { CNTException nte( GetLastError(), ADMC_IDS_ADD_PAGE_TO_WIZARD_ERROR, NULL, NULL, FALSE ); nte.ReportError(); break; } // if: error adding the page } // else: not dynamic page } // if: sheet has been created else { // Can't be static page. Must be dynamic page. ATLASSERT( dynamic_cast< CStaticWizardPageWindow * >( pwp ) == NULL ); CDynamicWizardPageWindow * pdwp = dynamic_cast< CDynamicWizardPageWindow * >( pwp ); ATLASSERT( pdwp != NULL ); AddPage( pdwp->Hpage() ); pdwp->SetPageAdded( TRUE ); } // else: sheet already created // // If we get to here we are successfully. // bSuccess = TRUE; } while ( 0 ); return bSuccess; } //*** CWizardWindow::BAddPage() ///////////////////////////////////////////////////////////////////////////// //++ // // CWizardWindow::OnSheetInitialized // // Routine Description: // Handler for PSCB_INITIALIZED. // Add pages that haven't been added yet, which will only be dynamic // pages. // // Arguments: // None. // // Return Value: // None. // // Exceptions Thrown: // None. // //-- ///////////////////////////////////////////////////////////////////////////// void CWizardWindow::OnSheetInitialized( void ) { // // Remove the system menu. // ModifyStyle( WS_SYSMENU, 0 ); // // Add dynamic pages, including extension pages, if not added yet. // { // // Get pointers to beginning and end of list. // CWizardPageList::iterator itCurrent = PlwpPages()->begin(); CWizardPageList::iterator itLast = PlwpPages()->end(); // // Loop through the list and add each dynamic page. // for ( ; itCurrent != itLast ; itCurrent++ ) { CDynamicWizardPageWindow * pdwp = dynamic_cast< CDynamicWizardPageWindow * >( *itCurrent ); if ( pdwp != NULL ) { if ( ! pdwp->BPageAddedToSheet() && (pdwp->Hpage() != NULL) ) { AddPage( pdwp->Hpage() ); pdwp->SetPageAdded( TRUE ); } // if: page not added yet and page has already been created } // if: dynamic page found } // for: each item in the list } // Add dynamic pages, including extension pages // // Call the base class method. // CBaseSheetWindow::OnSheetInitialized(); } //*** CWizardWindow::OnSheetInitialized() ///////////////////////////////////////////////////////////////////////////// //++ // // CWizardWindow::SetNextPage // // Routine Description: // Set the next page to be displayed. // // Arguments: // pwCurrentPage [IN] Current page whose next page is to be enabled. // pszNextPage [IN] Page ID. // // Return Value: // pwizpg // //-- ///////////////////////////////////////////////////////////////////////////// void CWizardWindow::SetNextPage( IN CWizardPageWindow * pwCurrentPage, IN LPCTSTR pszNextPage ) { ATLASSERT( pwCurrentPage != NULL ); ATLASSERT( pszNextPage != NULL ); BOOL bFoundCurrent = FALSE; CWizardPageWindow * pwPage; CWizardPageList::iterator itCurrent = PlwpPages()->begin(); CWizardPageList::iterator itLast = PlwpPages()->end(); // // Skip pages until the current page is found. // for ( ; itCurrent != itLast ; itCurrent++ ) { pwPage = *itCurrent; if ( pwPage == pwCurrentPage ) { bFoundCurrent = TRUE; break; } // if: found the current page } // for: each page in the list ATLASSERT( bFoundCurrent ); // // Disable all succeeding pages until the desired next page // is found. Enable that page and then exit. // for ( itCurrent++ ; itCurrent != itLast ; itCurrent++ ) { if ( (*itCurrent)->Ppsp()->pszTemplate == pszNextPage ) { (*itCurrent)->EnablePage( TRUE ); break; } // if: found the page (*itCurrent)->EnablePage( FALSE ); } // for: each page in the list ATLASSERT( itCurrent != itLast ); } //*** CWizardWindow::SetNextPage( pszNextPage ) ///////////////////////////////////////////////////////////////////////////// //++ // // CWizardWindow::AddExtensionPages // // Routine Description: // Add extension pages to the sheet. // // Arguments: // hfont [IN] Font to use for the extension pages. // hicon [IN] Icon to use for the extension pages. // // Return Value: // None. // //-- ///////////////////////////////////////////////////////////////////////////// void CWizardWindow::AddExtensionPages( IN HFONT hfont, IN HICON hicon ) { ATLASSERT( PcoObjectToExtend() != NULL ); // // Add extension pages if there any extensions. // if ( (PcoObjectToExtend()->PlstrAdminExtensions() != NULL) && (PcoObjectToExtend()->PlstrAdminExtensions()->size() > 0) ) { // // Get the currently selected page so we can reset it when we're done. // CTabCtrl tabc( GetTabControl() ); int nCurPage = tabc.GetCurSel(); // // Prepare to add extension pages. // CDynamicWizardPageList ldwp; PrepareToAddExtensionPages( ldwp ); // // If no extensions object has been created yet, create it now. // if ( Pext() == NULL ) { m_pext = new CCluAdmExtensions; ATLASSERT( m_pext != NULL ); if ( m_pext == NULL ) { return; } // if: error allocating the extension object } // if: no extensions list yet // // Enclose the loading of the extension in a try/catch block so // that a failure to load the extension won't prevent all pages // from being displayed. // try { if ( BWizard97() ) { Pext()->CreateWizard97Pages( this, *PcoObjectToExtend()->PlstrAdminExtensions(), PcoObjectToExtend(), hfont, hicon ); } // if: Wizard97 wizard else { Pext()->CreateWizardPages( this, *PcoObjectToExtend()->PlstrAdminExtensions(), PcoObjectToExtend(), hfont, hicon ); } // else: non-Wizard97 wizard } // try catch (...) { } // catch: anything // // Complete the process of adding extension pages. // CompleteAddingExtensionPages( ldwp ); // // Restore the current selection. // This has to be done because sometimes the above process causes // the current page to be set to the last page added, which prevents // the next page from being displayed. // SetActivePage( nCurPage ); } // if: object has extensions else { // // Remove extension pages. // RemoveAllExtensionPages(); } // else: object doesn't have extensions } //*** CWizardWindow::AddExtensionPages() ///////////////////////////////////////////////////////////////////////////// //++ // // CWizardWindow::PrepareToAddExtensionPages // // Routine Description: // Prepare to add extension pages by deleting existing extension // pages and removing dynamic pages. // // Arguments: // rldwp [IN OUT] List of dynamic wizard pages. // // Return Value: // None. // //-- ///////////////////////////////////////////////////////////////////////////// void CWizardWindow::PrepareToAddExtensionPages( IN OUT CDynamicWizardPageList & rldwp ) { // // Delete all extension pages from this wizard. This also // includes destroy the alternate wizard if it exists. // RemoveAllExtensionPages(); // // Delete the lists of extension pages and make sure the lists exist. // if ( PlewpNormal() != NULL ) { DeleteAllPtrListItems( PlewpNormal() ); } // if: list already exists else { m_plewpNormal = new CExtensionWizardPageList; if ( m_plewpNormal == NULL ) { return; } // if: error allocating the page list } // else: list doesn't exist yet if ( PlewpAlternate() != NULL ) { DeleteAllPtrListItems( PlewpAlternate() ); } // if: list already exists else { m_plewpAlternate = new CExtensionWizardPageList; if ( m_plewpAlternate == NULL ) { return; } // if: error allocating the page list } // else: list doesn't exist yet // // Move all dynamic pages to the temporary list. // ATLASSERT( rldwp.size() == 0 ); MovePtrListItems< CWizardPageWindow *, CDynamicWizardPageWindow * >( PlwpPages(), &rldwp ); // // Remove all pages in the temporary list from the wizard. // { CDynamicWizardPageList::iterator itCurrent; CDynamicWizardPageList::iterator itLast; itCurrent = rldwp.begin(); itLast = rldwp.end(); for ( ; itCurrent != itLast ; itCurrent++ ) { CDynamicWizardPageWindow * pdwp = *itCurrent; ATLASSERT( pdwp != NULL ); if ( pdwp->Hpage() != NULL ) { RemovePage( pdwp->Hpage() ); pdwp->SetPageAdded( FALSE ); } // if: page already created } // for: each page in the list } // Remove dynamic pages } //*** CWizardWindow::PrepareToAddExtensionPages() ///////////////////////////////////////////////////////////////////////////// //++ // // CWizardWindow::HrAddExtensionPage // // Routine Description: // Add an extension page. // // Arguments: // ppage [IN] Page to be added. // // Return Value: // S_OK Page added successfully. // S_FALSE Page not added. // //-- ///////////////////////////////////////////////////////////////////////////// HRESULT CWizardWindow::HrAddExtensionPage( IN CBasePageWindow * ppage ) { ATLASSERT( ppage != NULL ); HRESULT hr = S_OK; // // Make sure this is an extension wizard page object. // CExtensionWizardPageWindow * pewp = dynamic_cast< CExtensionWizardPageWindow * >( ppage ); ATLASSERT( pewp != NULL ); if ( (ppage == NULL) || (pewp == NULL ) ) { return S_FALSE; } // if: invalid arguments // // If the page is not the same as the type of wizard, add it to the // alternate list of extension pages and indicate we need a dummy sheet. // Otherwise, add it to the standard list of extension pages. // CExtensionWizard97PageWindow * pew97p = dynamic_cast< CExtensionWizard97PageWindow * >( ppage ); if ( ((pew97p != NULL) && ! BWizard97()) || ((pew97p == NULL) && BWizard97()) ) { PlewpAlternate()->insert( PlewpAlternate()->end(), pewp ); } // if: trying to add the wrong type of page else { PlewpNormal()->insert( PlewpNormal()->end(), pewp ); } // else: adding page of matching type return hr; } //*** CWizardWindow::HrAddExtensionPage() ///////////////////////////////////////////////////////////////////////////// //++ // // CWizardWindow::CompleteAddingExtensionPages // // Routine Description: // Complete the process of adding extension pages to the wizard by // re-adding dynamic pages. // // Arguments: // rldwp [IN OUT] List of dynamic wizard pages. // // Return Value: // None. // //-- ///////////////////////////////////////////////////////////////////////////// void CWizardWindow::CompleteAddingExtensionPages( IN OUT CDynamicWizardPageList & rldwp ) { // // If there are any normal pages, add them here. // There will be normal pages if pages of the same type as the wizard // were added. // if ( PlewpNormal()->size() > 0 ) { // // Add pages to the sheet. // if ( m_hWnd != NULL ) { CExtensionWizardPageList::iterator itCurrent = PlewpNormal()->begin(); CExtensionWizardPageList::iterator itLast = PlewpNormal()->end(); for ( ; itCurrent != itLast ; itCurrent++ ) { CExtensionWizardPageWindow * pewp = *itCurrent; ATLASSERT( pewp != NULL ); BAddPage( pewp ); } // for: each page in the list } // if: sheet is currently being displayed } // if: there are normal pages // // If there are any alternate pages, add a pre-extension launcher page // and a post-extension launcher page. The pre-extension launcher page // will display an alternate wizard of the appropriate type and hide the // main wizard before displaying these pages. After the final page it // will display the original sheet and hide the other sheet. The // post-extension launcher page is used to transition between the main // wizard and the alternate wizard when moving backwards into the // alternate wizard. // if ( PlewpAlternate()->size() > 0 ) { DLGTEMPLATE * pdt = NULL; CAltExtWizardPreLauncherPage * pelwpPre = NULL; CAltExtWizardPostLauncherPage * pelwpPost = NULL; // Loop to avoid goto's do { // // Add the pre-extension launcher page. // { // // Create the dialog template. // pdt = PdtCreateDummyPageDialogTemplate( 10, 10 ); ATLASSERT( pdt != NULL ); if ( pdt == NULL ) { break; } // if: error creating the dialog template // // Allocate and initialize the launcher page. // pelwpPre = new CAltExtWizardPreLauncherPage( pdt ); ATLASSERT( pelwpPre != NULL ); if ( pelwpPre == NULL ) { break; } // if: error allocating the page pdt = NULL; if ( ! pelwpPre->BInit( this ) ) { break; } // if: error initializing the page // // Create the launcher page. // DWORD sc = pelwpPre->ScCreatePage(); if ( sc != ERROR_SUCCESS ) { CNTException nte( sc, ADMC_IDS_INIT_EXT_PAGES_ERROR, NULL, NULL, FALSE ); nte.ReportError(); break; } // if: error creating the page // // Add the launcher page to the wizard. // BAddPage( pelwpPre ); pelwpPre = NULL; } // Add the pre-extension launcher page // // Add the post-extension launcher page // { // // Create the dialog template. // pdt = PdtCreateDummyPageDialogTemplate( 10, 10 ); ATLASSERT( pdt != NULL ); if ( pdt == NULL ) { break; } // if: error creating the dialog template // // Allocate and initialize the launcher page. // pelwpPost = new CAltExtWizardPostLauncherPage( pdt ); ATLASSERT( pelwpPost != NULL ); if ( pelwpPost == NULL ) { break; } // if: error allocating page pdt = NULL; if ( ! pelwpPost->BInit( this ) ) { break; } // if: error initializing the page // // Create the launcher page. // DWORD sc = pelwpPost->ScCreatePage(); if ( sc != ERROR_SUCCESS ) { CNTException nte( sc, ADMC_IDS_INIT_EXT_PAGES_ERROR, NULL, NULL, FALSE ); nte.ReportError(); break; } // if: error creating the page // // Add the launcher page to the wizard. // BAddPage( pelwpPost ); pelwpPost = NULL; } // Add the post-extension launcher page } while ( 0 ); // // Cleanup; // delete pelwpPre; delete pelwpPost; delete pdt; } // if: there are alternate pages // // Move all pages from the temporary list to the real list and // add them to the end of the wizard. // CDynamicWizardPageList::iterator itCurrent = rldwp.begin(); CDynamicWizardPageList::iterator itLast = rldwp.end(); while ( itCurrent != itLast ) { CDynamicWizardPageWindow * pdwp = *itCurrent; ATLASSERT( pdwp != NULL ); // // Create the page. // DWORD sc = pdwp->ScCreatePage(); if ( sc != ERROR_SUCCESS ) { CNTException nte( sc, ADMC_IDS_INIT_EXT_PAGES_ERROR, NULL, NULL, FALSE ); delete pdwp; itCurrent = rldwp.erase( itCurrent ); continue; } // if: error creating the page // // Add the page to the wizard. // This adds it to the real page list as well. // BAddPage( pdwp ); // // Remove the page from the temporary list. // itCurrent = rldwp.erase( itCurrent ); } // while: not at last page } //*** CWizardWindow::CompleteAddingExtensionPages() ///////////////////////////////////////////////////////////////////////////// //++ // // CWizardWindow::RemoveAllExtensionPages // // Routine Description: // Remove all extension pages from the wizard. // // Arguments: // None. // // Return Value: // None. // //-- ///////////////////////////////////////////////////////////////////////////// void CWizardWindow::RemoveAllExtensionPages( void ) { // // Delete the alternate extension wizard. // if ( PwizAlternate() != NULL ) { reinterpret_cast< CAltExtWizard * >( PwizAlternate() )->DestroyAlternateWizard(); } // if: alternate wizard being displayed // // Remove the extension pages. // CExtensionWizardPageList lewp; MovePtrListItems< CWizardPageWindow *, CExtensionWizardPageWindow * >( PlwpPages(), &lewp ); CExtensionWizardPageList::iterator itCurrent = lewp.begin(); CExtensionWizardPageList::iterator itLast = lewp.end(); for ( ; itCurrent != itLast ; itCurrent++ ) { CExtensionWizardPageWindow * pewp = *itCurrent; ATLASSERT( pewp != NULL ); if ( pewp->Hpage() != NULL ) { RemovePage( pewp->Hpage() ); pewp->SetPageAdded( FALSE ); } // if: page already created } // for: each page in the list DeleteAllPtrListItems( &lewp ); } //*** CWizardWindow::RemoveAllExtensionPages() //*************************************************************************// //////////////////////////////////////////////////////////////////////////// // class CAltExtWizardPreLauncherPage ///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// //++ // // CAltExtWizardPreLauncherPage::OnSetActive // // Routine Description: // Handler for PSN_SETACTIVE. // This page will be displayed if there are pages that are not of the // same type as the wizard (e.g. non-Wizard97 pages in a Wizard97 // wizard). // // Arguments: // None. // // Return Value: // TRUE Page activated successfully. // FALSE Error activating page. // //-- ///////////////////////////////////////////////////////////////////////////// BOOL CAltExtWizardPreLauncherPage::OnSetActive( void ) { CAltExtWizard * pwizAlt; // // When moving forward, create the alternate extension wizard and return // TRUE so that the main wizard will wait here. The alternate wizard // will cause the proper button to be pressed so we can do the proper // thing when we're done. // // When moving backward, just return FALSE so we won't be displayed. // // // Create the alternate wizard if moving forward. // if ( Pwiz()->BNextPressed() ) { // We could have got here by pressing 'Back' on the alternate wizard, // and then pressing 'Next' on the normal wizard. So, first check if // the alternate wizard has already been created. if ( Pwiz()->PwizAlternate() == NULL ) { // // Create the alternate extension wizard. // It is expected that the wizard doesn't exist yet and that there are // alternate extension pages to be displayed. // ATLASSERT( Pwiz()->PlewpAlternate()->size() > 0 ); pwizAlt = new CAltExtWizard; ATLASSERT( pwizAlt != NULL ); if ( pwizAlt == NULL ) { return FALSE; } // if: error allocating the alternate wizard Pwiz()->SetAlternateWizard( pwizAlt ); // // Initialize the alternate extension wizard. // if ( pwizAlt->BInit( Pwiz() ) ) { // // Display the alternate extension wizard. // The alternate extension wizard is being displayed as a modeless // wizard so that when the user presses the Next button in the // wizard and then presses the Back button on the next main wizard // page we need the wizard to still exist. // pwizAlt->Create( GetActiveWindow() ); // // Execute the alternate wizard message loop. // This required so that tabs and accelerator keys will work. // pwizAlt->MessageLoop(); } // if: wizard initialized successfully return TRUE; } // if: alternate wizard does not exist else { // // Display the existing alternate wizard. // Press the alternate wizard's Next button because it is waiting at // the prefix page. // pwizAlt = reinterpret_cast< CAltExtWizard * >( Pwiz()->PwizAlternate() ); pwizAlt->PressButton( PSBTN_NEXT ); pwizAlt->DisplayAlternateWizard(); // // Execute the alternate wizard message loop. // This required so that tabs and accelerator keys will work. // pwizAlt->MessageLoop(); return TRUE; } // else: alternate wizard exists already } // if: next button pressed else { ATLASSERT( Pwiz()->BBackPressed() ); return FALSE; } // else: back button pressed } //*** CAltExtWizardPreLauncherPage::OnSetActive() //*************************************************************************// //////////////////////////////////////////////////////////////////////////// // class CAltExtWizardPostLauncherPage ///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// //++ // // CAltExtWizardPostLauncherPage::OnSetActive // // Routine Description: // Handler for PSN_SETACTIVE. // This page will be displayed if there are pages that are not of the // same type as the wizard (e.g. non-Wizard97 pages in a Wizard97 // wizard). // // Arguments: // None. // // Return Value: // TRUE Page activated successfully. // FALSE Error activating page. // //-- ///////////////////////////////////////////////////////////////////////////// BOOL CAltExtWizardPostLauncherPage::OnSetActive( void ) { // // When moving forward just return FALSE so that we won't be displayed. // // When moving backward, display the alternate extension wizard and // return TRUE so that we will be waiting for the alternate wizard to // move us to the right place. Press the alternate wizard's Back button // because it is waiting at the postfix page. // if ( Pwiz()->BNextPressed() ) { return FALSE; } // if: moving forward else { ATLASSERT( Pwiz()->BBackPressed() ); // // Display the alternate wizard. // CAltExtWizard * pwizAlt = reinterpret_cast< CAltExtWizard * >( Pwiz()->PwizAlternate() ); pwizAlt->PressButton( PSBTN_BACK ); pwizAlt->DisplayAlternateWizard(); // // Execute the alternate wizard message loop. // This required so that tabs and accelerator keys will work. // pwizAlt->MessageLoop(); return TRUE; } // else: moving backward } //*** CAltExtWizardPostLauncherPage::OnSetActive() //*************************************************************************// //////////////////////////////////////////////////////////////////////////// // class CAltExtWizard ///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// //++ // // CAltExtWizard::BInit // // Routine Description: // Initialize the wizard. // This wizard is used to display extension pages that are different // than the type of the main wizard, e.g. displaying non-Wizard97 pages // in a Wizard97 wizard. This wizard will have a dummy prefix page // and a dummy postfix page, which are only here to handle entering and // exiting the wizard. This routine will add the prefix page, add the // alternate extension pages from the main wizard, then add the postfix // page. // // Arguments: // pwizMain [IN] Main wizard. // // Return Value: // TRUE Wizard initialized successfully. // FALSE Error initializing wizard. Error already displayed. // //-- ///////////////////////////////////////////////////////////////////////////// BOOL CAltExtWizard::BInit( IN CWizardWindow * pwizMain ) { ATLASSERT( pwizMain != NULL ); ATLASSERT( m_pwizMain == NULL ); BOOL bSuccess; m_pwizMain = pwizMain; // // Setup the type of wizard to be the opposite of the main wizard. // m_psh.dwFlags &= ~PSH_PROPSHEETPAGE; // Using HPROPSHEETPAGEs. if ( ! PwizMain()->BWizard97() ) { // Don't add a watermark since we don't have a watermark bitmap. m_psh.dwFlags &= ~(PSH_WIZARD | PSH_WATERMARK ); m_psh.dwFlags |= (PSH_WIZARD97 | PSH_HEADER ); } // if: Wizard97 wizard else { m_psh.dwFlags |= PSH_WIZARD; m_psh.dwFlags &= ~(PSH_WIZARD97 | PSH_WATERMARK | PSH_HEADER ); } // else: non-Wizard97 wizard // Loop to avoid goto's do { // // Get the first page in the main wizard. // HWND hwndChild = PwizMain()->GetWindow( GW_CHILD ); ATLASSERT( hwndChild != NULL ); // // Get the current width and height of the child window. // CRect rect; bSuccess = ::GetClientRect( hwndChild, &rect ); if ( ! bSuccess ) { CNTException nte( GetLastError(), ADMC_IDS_INIT_EXT_PAGES_ERROR, NULL, NULL, FALSE ); nte.ReportError(); break; } // if: error getting client rectangle // // Add a prefix page. // bSuccess = BAddPrefixPage( (WORD)rect.Width(), (WORD)rect.Height() ); if ( ! bSuccess ) { break; } // if: error adding the prefix page // // Add alternate pages from the main wizard to the wizard page list. // They will be added to the wizard at sheet initialization time. // CExtensionWizardPageList::iterator itCurrent = PwizMain()->PlewpAlternate()->begin(); CExtensionWizardPageList::iterator itLast = PwizMain()->PlewpAlternate()->end(); while ( itCurrent != itLast ) { CExtensionWizardPageWindow * pewp = *itCurrent; ATLASSERT( pewp != NULL ); PlwpPages()->insert( PlwpPages()->end(), pewp ); PwizMain()->PlewpAlternate()->erase( itCurrent ); itCurrent = PwizMain()->PlewpAlternate()->begin(); } // for: each page in the list // // Add a postfix page. // bSuccess = BAddPostfixPage( (WORD) rect.Width(), (WORD) rect.Height() ); if ( ! bSuccess ) { break; } // if: error adding the postfix page } while ( 0 ); // // Call the base class. // if ( ! baseClass::BInit() ) { return FALSE; } // if: error initializing the base class return bSuccess; } //*** CAltExtWizard::BInit() ///////////////////////////////////////////////////////////////////////////// //++ // // CAltExtWizard::BAddPrefixPage // // Routine Description: // Add a prefix page to the wizard. // // Arguments: // cx [IN] Width of the page. // cy [IN] Height of the page. // // Return Value: // TRUE Page added successfully. // FALSE Error adding the page. Error already displayed. // //-- ///////////////////////////////////////////////////////////////////////////// BOOL CAltExtWizard::BAddPrefixPage( IN WORD cx, IN WORD cy ) { ATLASSERT( cx > 0 ); ATLASSERT( cy > 0 ); BOOL bSuccess; DLGTEMPLATE * pdt = NULL; CAltExtWizardPrefixPage * pwp = NULL; // Loop to avoid goto's do { // // Create the dialog template for the page. // pdt = PdtCreateDummyPageDialogTemplate( cx, cy ); ATLASSERT( pdt != NULL ); if ( pdt == NULL ) { bSuccess = FALSE; break; } // if: error creating the dialog template // // Adjust the page size so that we will be creating the same size // wizard as the main wizard. Non-Wizard97 wizards add padding // (7 DLUs on each side) whereas Wizard97 wizards add no padding // to the first page, which is where we are expecting these // dimensions to come from. // if ( BWizard97() ) { pdt->cx += 7 * 2; pdt->cy += 7 * 2; } // if: Wizard97 wizard else { pdt->cx -= 7 * 2; pdt->cy -= 7 * 2; } // else: non-Wizard97 wizard // // Allocate and initialize the page. // pwp = new CAltExtWizardPrefixPage( pdt ); ATLASSERT( pwp != NULL ); if ( pwp == NULL ) { bSuccess = FALSE; break; } // if: error allocating the page pdt = NULL; bSuccess = pwp->BInit( this ); if ( ! bSuccess ) { break; } // if: error initializing the page // // Create the page. // DWORD sc = pwp->ScCreatePage(); if ( sc != ERROR_SUCCESS ) { CNTException nte( sc, ADMC_IDS_INIT_EXT_PAGES_ERROR, NULL, NULL, FALSE ); nte.ReportError(); bSuccess = FALSE; break; } // if: error creating the page // // Add the page to the wizard. // bSuccess = BAddPage( pwp ); pwp = NULL; } while ( 0 ); delete pwp; delete pdt; return bSuccess; } //*** CAltExtWizard::BAddPrefixPage() ///////////////////////////////////////////////////////////////////////////// //++ // // CAltExtWizard::BAddPostfixPage // // Routine Description: // Add a postfix page to the wizard. // // Arguments: // cx [IN] Width of the page. // cy [IN] Height of the page. // // Return Value: // TRUE Page added successfully. // FALSE Error adding the page. Error already displayed. // //-- ///////////////////////////////////////////////////////////////////////////// BOOL CAltExtWizard::BAddPostfixPage( IN WORD cx, IN WORD cy ) { ATLASSERT( cx > 0 ); ATLASSERT( cy > 0 ); BOOL bSuccess; DLGTEMPLATE * pdt = NULL; CAltExtWizardPostfixPage * pwp = NULL; // Loop to avoid goto's do { // // Create the dialog template for the page. // pdt = PdtCreateDummyPageDialogTemplate( cx, cy ); ATLASSERT( pdt != NULL ); if ( pdt == NULL ) { bSuccess = FALSE; break; } // if: error creating the dialog template // // Adjust the page size so that we will be creating the same size // wizard as the main wizard. Non-Wizard97 wizards add padding // (7 DLUs on each side) whereas Wizard97 wizards add no padding // to the first page, which is where we are expecting these // dimensions to come from. // if ( BWizard97() ) { pdt->cx += 7 * 2; pdt->cy += 7 * 2; } // if: Wizard97 wizard else { pdt->cx -= 7 * 2; pdt->cy -= 7 * 2; } // else: non-Wizard97 wizard // // Allocate and initialize the page. // pwp = new CAltExtWizardPostfixPage( pdt ); ATLASSERT( pwp != NULL ); if ( pwp == NULL ) { bSuccess = FALSE; break; } // if: error allocating the page pdt = NULL; bSuccess = pwp->BInit( this ); if ( ! bSuccess ) { break; } // if: error initializing the page // // Create the page. // DWORD sc = pwp->ScCreatePage(); if ( sc != ERROR_SUCCESS ) { CNTException nte( sc, ADMC_IDS_INIT_EXT_PAGES_ERROR, NULL, NULL, FALSE ); nte.ReportError(); bSuccess = FALSE; break; } // if: error creating the page // // Add the page to the page list. It will be added to the wizard // at sheet initialization time. // PlwpPages()->insert( PlwpPages()->end(), pwp ); pwp = NULL; bSuccess = TRUE; } while ( 0 ); delete pwp; delete pdt; return bSuccess; } //*** CAltExtWizard::BAddPostfixPage() ///////////////////////////////////////////////////////////////////////////// //++ // // CAltExtWizard::DisplayAlternateWizard // // Routine Description: // Display the alternate wizard. This involved the following steps: // -- Move the alternate wizard to the position of the main wizard. // -- Show the alternate wizard. // -- Hide the main wizard. // // Arguments: // None. // // Return Value: // None. // // Exceptions Thrown: // None. // //-- ///////////////////////////////////////////////////////////////////////////// void CAltExtWizard::DisplayAlternateWizard( void ) { // // Move the alternate wizard to where the main wizard is positioned. // CRect rectMain; CRect rectAlt; CRect rectNew; if ( PwizMain()->GetWindowRect( &rectMain ) ) { if ( GetWindowRect( &rectAlt ) ) { //ATLTRACE( _T("CAltExtWizard::DisplayAlternateWizard() - Main = (%d,%d) (%d,%d) Alt = (%d,%d) (%d,%d)\n"), // rectMain.left, rectMain.right, rectMain.top, rectMain.bottom, // rectAlt.left, rectAlt.right, rectAlt.top, rectAlt.bottom ); rectNew.left = rectMain.left; rectNew.top = rectMain.top; rectNew.right = rectNew.left + rectAlt.Width(); rectNew.bottom = rectNew.top + rectAlt.Height(); MoveWindow( &rectNew ); } // if: got the alternate wizard's window rectangle successfully } // if: got the main wizard's window rectangle successfully // // Show the alternate wizard and hide the main wizard. // ShowWindow( SW_SHOW ); PwizMain()->ShowWindow( SW_HIDE ); SetActiveWindow(); PwizMain()->SetCurrentWizard( this ); } //*** CAltExtWizard::DisplayAlternateWizard() ///////////////////////////////////////////////////////////////////////////// //++ // // CAltExtWizard::DisplayMainWizard // // Routine Description: // Display the main wizard. This involved the following steps: // -- Move the main wizard to the position of the alternate wizard. // -- Show the main wizard. // -- Hide the alternate wizard. // // Arguments: // None. // // Return Value: // None. // // Exceptions Thrown: // None. // //-- ///////////////////////////////////////////////////////////////////////////// void CAltExtWizard::DisplayMainWizard( void ) { // // Move the main wizard to where the alternate wizard is positioned. // CRect rectMain; CRect rectAlt; CRect rectNew; if ( PwizMain()->GetWindowRect( &rectMain ) ) { if ( GetWindowRect( &rectAlt ) ) { //ATLTRACE( _T("CAltExtWizard::DisplayMainWizard() - Main = (%d,%d) (%d,%d) Alt = (%d,%d) (%d,%d)\n"), // rectMain.left, rectMain.right, rectMain.top, rectMain.bottom, // rectAlt.left, rectAlt.right, rectAlt.top, rectAlt.bottom ); rectNew.left = rectAlt.left; rectNew.top = rectAlt.top; rectNew.right = rectNew.left + rectMain.Width(); rectNew.bottom = rectNew.top + rectMain.Height(); PwizMain()->MoveWindow( &rectNew ); } // if: got the alternate wizard's window rectangle successfully } // if: got the main wizard's window rectangle successfully // // Show the main wizard and hide the alternate wizard. // PwizMain()->ShowWindow( SW_SHOW ); PwizMain()->SetActiveWindow(); ShowWindow( SW_HIDE ); PwizMain()->SetCurrentWizard( PwizMain() ); } //*** CAltExtWizard::DisplayMainWizard() ///////////////////////////////////////////////////////////////////////////// //++ // // CAltExtWizard::DestroyAlternateWizard // // Routine Description: // Destroy the alternate extension wizard. // // Arguments: // None. // // Return Value: // None. // //-- ///////////////////////////////////////////////////////////////////////////// void CAltExtWizard::DestroyAlternateWizard( void ) { ATLASSERT( m_hWnd != NULL ); // // Press the Cancel button on the alternate wizard. // PressButton( PSBTN_CANCEL ); // // Destroy the wizard. // DestroyWindow(); } //*** CAltExtWizard::DestroyAlternateWizard() ///////////////////////////////////////////////////////////////////////////// //++ // // CAltExtWizard::MessageLoop // // Routine Description: // Message loop for this wizard as a modeless wizard. // // Arguments: // None. // // Return Value: // None. // //-- ///////////////////////////////////////////////////////////////////////////// void CAltExtWizard::MessageLoop( void ) { MSG msg; m_bExitMsgLoop = FALSE; while ( (GetActivePage() != NULL) && GetMessage( &msg, NULL, 0, 0 ) ) { // // Ask the wizard if it wants to process it. If not, go ahead // and translate it and dispatch it. // if ( ! IsDialogMessage( &msg ) ) { TranslateMessage( &msg ); DispatchMessage( &msg ); } // if: not a property sheet dialog message // // If the dialog is done, exit this loop. // if ( BExitMessageLoop() ) { DisplayMainWizard(); PwizMain()->PostMessage( PSM_PRESSBUTTON, NExitButton(), 0 ); break; } // if: exiting the wizard } // while: active page and not quitting } //*** CAltExtWizard::MessageLoop() //*************************************************************************// //////////////////////////////////////////////////////////////////////////// // class CAltExtWizardPrefixPage ///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// //++ // // CAltExtWizardPrefixPage::OnSetActive // // Routine Description: // Handler for PSN_SETACTIVE. // This page manages the transfer of control between the main wizard // and the first page of the alternate wizard. // // Arguments: // None. // // Return Value: // TRUE Page activated successfully. // FALSE Error activating page. // //-- ///////////////////////////////////////////////////////////////////////////// BOOL CAltExtWizardPrefixPage::OnSetActive( void ) { // // When moving forward, display the alternate wizard and return FALSE // so that this page won't be displayed. // // When moving backward, display the main wizard and return TRUE so that // we'll be waiting for the main wizard to do something with us. // if ( Pwiz()->BBackPressed() ) { PwizThis()->ExitMessageLoop( PSBTN_BACK ); return TRUE; } // if: moving backward else { PwizThis()->DisplayAlternateWizard(); return FALSE; } // if: moving forward } //*** CAltExtWizardPrefixPage::OnSetActive() //*************************************************************************// //////////////////////////////////////////////////////////////////////////// // class CAltExtWizardPostfixPage ///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// //++ // // CAltExtWizardPostfixPage::OnSetActive // // Routine Description: // Handler for PSN_SETACTIVE. // This page manages the transfer of control between the main wizard // and the last page of the alternate wizard. // // Arguments: // None. // // Return Value: // TRUE Page activated successfully. // FALSE Error activating page. // //-- ///////////////////////////////////////////////////////////////////////////// BOOL CAltExtWizardPostfixPage::OnSetActive( void ) { // // When moving forward display the main wizard and return TRUE so that // we'll be waiting for the main wizard to tell us what to do next. // // This routine should never be called when moving backward. // ATLASSERT( Pwiz()->BNextPressed() ); // // Display the main wizard. // PwizThis()->ExitMessageLoop( PSBTN_NEXT ); return TRUE; } //*** CAltExtWizardPostfixPage::OnSetActive() //*************************************************************************// ///////////////////////////////////////////////////////////////////////////// // Global Functions ///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// //++ // // PdtCreateDummyPageDialogTemplate // // Routine Description: // Create a dialog template in memory for use on a dummy page. // // Arguments: // cx [IN] Width of the dialog in pixels. // cy [IN] Height of the dialog in pixels. // // Return Value: // ppDlgTemplate Dialog template. // //-- ///////////////////////////////////////////////////////////////////////////// DLGTEMPLATE * PdtCreateDummyPageDialogTemplate( IN WORD cx, IN WORD cy ) { static const WCHAR s_szFontName[] = L"MS Shell Dlg"; struct FULLDLGTEMPLATE : public DLGTEMPLATE { WORD nMenuID; WORD nClassID; WORD nTitle; WORD nFontSize; WCHAR szFontName[ RTL_NUMBER_OF( s_szFontName ) ]; }; HRESULT hr; FULLDLGTEMPLATE * pDlgTemplate = new FULLDLGTEMPLATE; ATLASSERT( pDlgTemplate != NULL ); if ( pDlgTemplate != NULL ) { pDlgTemplate->style = WS_CHILD | WS_DISABLED | WS_SYSMENU | DS_SETFONT; pDlgTemplate->dwExtendedStyle = 0; pDlgTemplate->cdit = 0; pDlgTemplate->x = 0; pDlgTemplate->y = 0; pDlgTemplate->cx = ((cx * 2) + (3 / 2)) / 3; // round off pDlgTemplate->cy = ((cy * 8) + (13 / 2)) / 13; // round off pDlgTemplate->nMenuID = 0; pDlgTemplate->nClassID = 0; pDlgTemplate->nTitle = 0; pDlgTemplate->nFontSize = 8; hr = StringCchCopyNW( pDlgTemplate->szFontName, RTL_NUMBER_OF( pDlgTemplate->szFontName ), s_szFontName, RTL_NUMBER_OF( s_szFontName ) ); ATLASSERT( SUCCEEDED( hr ) ); } // if: dialog template allocated successfully return pDlgTemplate; } //*** PdtCreateDummyPageDialogTemplate()