/*++ Copyright (c) 1996 Microsoft Corporation Module Name: wizard.c Abstract: Routines to run the wizard for the suite. Author: Ted Miller (tedm) 1-Oct-1996 Revision History: --*/ #include "precomp.h" #pragma hdrstop HPROPSHEETPAGE CreateInstallationAndProgressPage( VOID ); INT_PTR FinalPageDlgProc( IN HWND hdlg, IN UINT msg, IN WPARAM wParam, IN LPARAM lParam ); // // Bogus global variable necessary because there's no way to get // a value through to the PropSheetCallback. // PVOID _CBx; int CALLBACK PropSheetCallback( IN HWND DialogHandle, IN UINT msg, IN LPARAM lparam ) { DWORD oldp; LPDLGTEMPLATE dtemplate; switch (msg) { case PSCB_PRECREATE: dtemplate = (LPDLGTEMPLATE)lparam; if (QuietMode) { VirtualProtect(dtemplate, sizeof(DLGTEMPLATE), PAGE_READWRITE, &oldp); dtemplate->style = dtemplate->style & ~WS_VISIBLE; } break; case PSCB_INITIALIZED: OcRememberWizardDialogHandle(_CBx,DialogHandle); break; } return 0; } BOOL DoWizard( IN PVOID OcManagerContext, IN HWND StartingMsgWindow, IN HCURSOR hOldCursor ) /*++ Routine Description: This routine creates and displays the wizard. Arguments: OcManagerContext - value returned from OcInitialize(). Return Value: Boolean value indicating whether the wizard was successfully displayed. --*/ { PSETUP_REQUEST_PAGES PagesFromOcManager[WizPagesTypeMax]; BOOL b; UINT u; UINT PageCount; UINT i; HPROPSHEETPAGE *PageHandles; HPROPSHEETPAGE OcPage = NULL; HPROPSHEETPAGE SetupPage; HPROPSHEETPAGE FinalPage; PROPSHEETPAGE PageDescrip; PROPSHEETHEADER PropSheet; OC_PAGE_CONTROLS WizardPageControlsInfo; OC_PAGE_CONTROLS DetailsPageControlsInfo; SETUP_PAGE_CONTROLS SetupPageControlsInfo; HDC hdc; HWND PsHwnd; b = FALSE; u = OcGetWizardPages(OcManagerContext,PagesFromOcManager); if(u != NO_ERROR) { MessageBoxFromMessageAndSystemError( NULL, MSG_CANT_INIT, u, MAKEINTRESOURCE(AppTitleStringId), MB_OK | MB_ICONERROR | MB_SYSTEMMODAL | MB_SETFOREGROUND ); goto c0; } // // There must be a final page, because the final page comes right after the // setup page, and we don't want the setup page to have to know whether to // simulate pressing next or finish to advance. // if(!PagesFromOcManager[WizPagesFinal] || !PagesFromOcManager[WizPagesFinal]->MaxPages) { PageDescrip.dwSize = sizeof(PROPSHEETPAGE); PageDescrip.dwFlags = PSP_DEFAULT; PageDescrip.hInstance = hInst; PageDescrip.pszTemplate = MAKEINTRESOURCE(IDD_FINAL); PageDescrip.pfnDlgProc = FinalPageDlgProc; FinalPage = CreatePropertySheetPage(&PageDescrip); if(!FinalPage) { MessageBoxFromMessageAndSystemError( NULL, MSG_CANT_INIT, ERROR_NOT_ENOUGH_MEMORY, MAKEINTRESOURCE(AppTitleStringId), MB_OK | MB_ICONERROR | MB_SYSTEMMODAL | MB_SETFOREGROUND ); goto c1; } } else { FinalPage = NULL; } // // Calculate the number of pages. There's two extra pages (the OC and setup pages). // Also leave room for a potential dummy final page. // PageCount = FinalPage ? 3 : 2; for(u=0; uMaxPages; } } // // Allocate space for the page structures. // PageHandles = MyMalloc(PageCount * sizeof(HPROPSHEETPAGE)); if(!PageHandles) { MessageBoxFromMessageAndSystemError( NULL, MSG_CANT_INIT, ERROR_NOT_ENOUGH_MEMORY, MAKEINTRESOURCE(AppTitleStringId), MB_OK | MB_ICONERROR | MB_SYSTEMMODAL | MB_SETFOREGROUND ); goto c1; } ZeroMemory(PageHandles,PageCount*sizeof(HPROPSHEETPAGE)); // // Create the OC Page. // WizardPageControlsInfo.TemplateModule = hInst; WizardPageControlsInfo.TemplateResource = MAKEINTRESOURCE(IDD_OC_WIZARD_PAGE); WizardPageControlsInfo.ListBox = IDC_LISTBOX; WizardPageControlsInfo.TipText = IDT_TIP; WizardPageControlsInfo.DetailsButton = IDB_DETAILS; WizardPageControlsInfo.ResetButton = IDB_RESET; WizardPageControlsInfo.InstalledCountText = IDT_INSTALLED_COUNT; WizardPageControlsInfo.SpaceNeededText = IDT_SPACE_NEEDED_NUM; WizardPageControlsInfo.SpaceAvailableText = IDT_SPACE_AVAIL_NUM; WizardPageControlsInfo.InstructionsText = IDT_INSTRUCTIONS; WizardPageControlsInfo.HeaderText = IDS_OCPAGE_HEADER; WizardPageControlsInfo.SubheaderText = IDS_OCPAGE_SUBHEAD; WizardPageControlsInfo.ComponentHeaderText = IDT_COMP_TITLE; DetailsPageControlsInfo = WizardPageControlsInfo; DetailsPageControlsInfo.TemplateResource = MAKEINTRESOURCE(IDD_OC_DETAILS_PAGE); if (OcSubComponentsPresent(OcManagerContext)) { OcPage = OcCreateOcPage(OcManagerContext,&WizardPageControlsInfo,&DetailsPageControlsInfo); if(!OcPage) { MessageBoxFromMessageAndSystemError( NULL, MSG_CANT_INIT, ERROR_NOT_ENOUGH_MEMORY, MAKEINTRESOURCE(AppTitleStringId), MB_OK | MB_ICONERROR | MB_SYSTEMMODAL | MB_SETFOREGROUND ); goto c2; } } SetupPageControlsInfo.TemplateModule = hInst; SetupPageControlsInfo.TemplateResource = MAKEINTRESOURCE(IDD_PROGRESS_PAGE); SetupPageControlsInfo.ProgressBar = IDC_PROGRESS; SetupPageControlsInfo.ProgressLabel = IDT_THERM_LABEL; SetupPageControlsInfo.ProgressText = IDT_TIP; SetupPageControlsInfo.AnimationControl = IDA_EXTERNAL_PROGRAM; SetupPageControlsInfo.AnimationResource = IDA_FILECOPY; SetupPageControlsInfo.ForceExternalProgressIndicator = ForceExternalProgressIndicator; SetupPageControlsInfo.AllowCancel = AllowCancel; SetupPageControlsInfo.HeaderText = IDS_PROGPAGE_HEADER; SetupPageControlsInfo.SubheaderText = IDS_PROGPAGE_SUBHEAD; SetupPage = OcCreateSetupPage(OcManagerContext,&SetupPageControlsInfo); if(!SetupPage) { MessageBoxFromMessageAndSystemError( NULL, MSG_CANT_INIT, ERROR_NOT_ENOUGH_MEMORY, MAKEINTRESOURCE(AppTitleStringId), MB_OK | MB_ICONERROR | MB_SYSTEMMODAL | MB_SETFOREGROUND ); goto c2; } for(PageCount=0,u=0; uPages, PagesFromOcManager[u]->MaxPages * sizeof(HPROPSHEETPAGE) ); PageCount += PagesFromOcManager[u]->MaxPages; } } // // OK, we're ready. Set up and go. // PropSheet.dwSize = sizeof(PROPSHEETHEADER); PropSheet.dwFlags = PSH_WIZARD | PSH_USECALLBACK | PSH_WIZARD97 | PSH_WATERMARK | PSH_HEADER; PropSheet.hwndParent = NULL; PropSheet.hInstance = hInst; PropSheet.nPages = PageCount; PropSheet.nStartPage = 0; PropSheet.phpage = PageHandles; PropSheet.pfnCallback = PropSheetCallback; PropSheet.pszbmHeader = MAKEINTRESOURCE(IDB_WATERMARK1_16); PropSheet.pszbmWatermark = MAKEINTRESOURCE(IDB_WELCOME); if(hdc = GetDC(NULL)) { if(GetDeviceCaps(hdc,BITSPIXEL) >= 8) { PropSheet.pszbmHeader = MAKEINTRESOURCE(IDB_WATERMARK1_256); } ReleaseDC(NULL,hdc); } // // Bogus global var used because we need to get a value through to // the property sheet callback routine. // _CBx = OcManagerContext; // make sure our new window can hold the focus before killing the wait window if(StartingMsgWindow) { AllowSetForegroundWindow(GetCurrentProcessId()); PostMessage(StartingMsgWindow,WM_APP,0,0); } SetCursor(hOldCursor); PsHwnd = (HWND) PropertySheet( &PropSheet ); if((LONG_PTR)PsHwnd == -1) { MessageBoxFromMessageAndSystemError( NULL, MSG_CANT_INIT, ERROR_NOT_ENOUGH_MEMORY, MAKEINTRESOURCE(AppTitleStringId), MB_OK | MB_ICONERROR | MB_SYSTEMMODAL | MB_SETFOREGROUND ); } else { b = TRUE; } c2: MyFree(PageHandles); c1: for(u=0; ucode) { case PSN_SETACTIVE: // We don't dispaly this page. Just use it to end the Wizard set PropSheet_SetWizButtons(GetParent(hdlg),PSWIZB_FINISH); PropSheet_PressButton(GetParent(hdlg),PSBTN_FINISH); // fall through case PSN_KILLACTIVE: case PSN_WIZBACK: case PSN_WIZNEXT: case PSN_WIZFINISH: // // Allow activation/motion. // SetWindowLongPtr(hdlg,DWLP_MSGRESULT,0); b = TRUE; break; } } return(b); }