/*++ Copyright (c) Microsoft Corporation. All rights reserved. Module Name: Setup.cpp Abstract: Displays the splash screen and runs the message loop for the setup app. Notes: ANSI only - must run on Win9x. History: 01/30/01 rparsons Created 01/10/02 rparsons Revised --*/ #include "demoapp.h" extern APPINFO g_ai; /*++ Routine Description: Thread callback procedure. Arguments: None. Return Value: 0 on failure. --*/ UINT InitSetupThread( IN void* pArguments ) { MSG msg; CSplash splash; HWND hDlg; HINSTANCE hInstance; HRESULT hr; char szError[MAX_PATH]; char szDll[MAX_PATH]; const char szDemoDll[] = "demodll.dll"; hr = StringCchPrintf(szDll, sizeof(szDll), "%hs\\%hs", g_ai.szCurrentDir, szDemoDll); if (FAILED(hr)) { return 0; } // // If the load fails, keep going. This just means we won't // show a splash screen to the user. // hInstance = LoadLibrary(szDll); if (g_ai.fWinXP) { // // Display the XP splash screen. // splash.Create(hInstance, IDB_XP_SPLASH_256, IDB_XP_SPLASH, 5); } else { // // Display the W2K splash screen. // splash.Create(hInstance, IDB_W2K_SPLASH_256, IDB_W2K_SPLASH, 5); } if (hInstance) { FreeLibrary(hInstance); } hDlg = CreateExtractionDialog(g_ai.hInstance); if (!hDlg) { LoadString(g_ai.hInstance, IDS_NO_EXTRACT_DLG, szError, sizeof(szError)); MessageBox(NULL, szError, 0, MB_ICONERROR); return 0; } while (GetMessage(&msg, (HWND)NULL, 0, 0)) { if (!IsDialogMessage(hDlg, &msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } } _endthreadex(0); return (int)msg.wParam; } /*++ Routine Description: Creates our full screen window. Arguments: None. Return Value: The window handle on success, NULL on failure. --*/ HWND CreateFullScreenWindow( void ) { WNDCLASS wc; ATOM aClass = NULL; RECT rcDesktop; HBRUSH hBrush; hBrush = CreateSolidBrush(RGB(0,80,80)); wc.style = CS_NOCLOSE; wc.lpfnWndProc = SetupWndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = g_ai.hInstance; wc.hIcon = LoadIcon(g_ai.hInstance, MAKEINTRESOURCE(IDI_SETUP_APPICON)); wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH)hBrush; // teal wc.lpszMenuName = NULL; wc.lpszClassName = SETUP_APP_CLASS; aClass = RegisterClass(&wc); if (!aClass) { goto exit; } GetWindowRect(GetDesktopWindow(), &rcDesktop); g_ai.hWndMain = CreateWindowEx(0, SETUP_APP_CLASS, SETUP_APP_TITLE, WS_OVERLAPPEDWINDOW, 0, 0, rcDesktop.right - 15, rcDesktop.bottom - 15, NULL, NULL, g_ai.hInstance, NULL); exit: DeleteObject(hBrush); return g_ai.hWndMain; } /*++ Routine Description: Runs the message loop for main window. Arguments: hWnd - Window handle. uMsg - Windows message. wParam - Additional message info. lParam - Additional message info. Return Value: TRUE if the message was processed, FALSE otherwise. --*/ LRESULT CALLBACK SetupWndProc( IN HWND hWnd, IN UINT uMsg, IN WPARAM wParam, IN LPARAM lParam ) { switch (uMsg) { case WM_CREATE: ShowWindow(hWnd, SW_SHOWMAXIMIZED); UpdateWindow(hWnd); // // Welcome dialog. // DialogBox(g_ai.hInstance, MAKEINTRESOURCE(IDD_WELCOME), hWnd, WelcomeDialogProc); if (g_ai.fClosing) { break; } // // Checking for installed components dialog. // DialogBox(g_ai.hInstance, MAKEINTRESOURCE(IDD_CHECK_INSTALL), hWnd, CheckComponentDialogProc); if (g_ai.fClosing) { break; } // // Checking for free disk space dialog. // DialogBox(g_ai.hInstance, MAKEINTRESOURCE(IDD_DISKSPACE), hWnd, CheckFreeDiskSpaceDialogProc); if (g_ai.fClosing) { break; } // // Ready to copy files dialog // DialogBox(g_ai.hInstance, MAKEINTRESOURCE(IDD_READYTO_COPY), hWnd, ReadyToCopyDialogProc); if (g_ai.fClosing) { break; } // // Copying files progress dialog. // DialogBox(g_ai.hInstance, MAKEINTRESOURCE(IDD_COPYFILES), hWnd, CopyFilesDialogProc); if (g_ai.fClosing) { break; } // // Create the shortcuts - even the bad one. // CreateShortcuts(hWnd); // // Readme dialog. // DialogBox(g_ai.hInstance, MAKEINTRESOURCE(IDD_README), hWnd, ViewReadmeDialogProc); if (g_ai.fClosing) { break; } // // Reboot dialog. // DialogBox(g_ai.hInstance, MAKEINTRESOURCE(IDD_REBOOT), hWnd, RebootDialogProc); break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hWnd, uMsg, wParam, lParam); } return FALSE; }