#include "pch.h" #include "loader.h" #include "resource.h" #include "resrc1.h" #include #include #define ANIMATE_OPEN(x) SendDlgItemMessage(Dlg,IDC_ANIMATE1,ACM_OPEN,(WPARAM)NULL,(LPARAM)(LPTSTR)MAKEINTRESOURCE(x)) #define ANIMATE_PLAY() SendDlgItemMessage(Dlg,IDC_ANIMATE1,ACM_PLAY,(WPARAM)-1,(LPARAM)MAKELONG(0,-1)) #define ANIMATE_STOP() SendDlgItemMessage(Dlg,IDC_ANIMATE1,ACM_STOP,(WPARAM)0,(LPARAM)0); #define ANIMATE_CLOSE() SendDlgItemMessage(Dlg,IDC_ANIMATE1,ACM_OPEN,(WPARAM)NULL,(LPARAM)NULL); VOID _CenterWindowOnDesktop ( HWND WndToCenter ) { RECT rcFrame, rcWindow; LONG x, y, w, h; POINT point; HWND Desktop = GetDesktopWindow (); point.x = point.y = 0; ClientToScreen(Desktop, &point); GetWindowRect(WndToCenter, &rcWindow); GetClientRect(Desktop, &rcFrame); w = rcWindow.right - rcWindow.left + 1; h = rcWindow.bottom - rcWindow.top + 1; x = point.x + ((rcFrame.right - rcFrame.left + 1 - w) / 2); y = point.y + ((rcFrame.bottom - rcFrame.top + 1 - h) / 2); // // Get the work area for the current desktop (i.e., the area that // the tray doesn't occupy). // if(!SystemParametersInfo (SPI_GETWORKAREA, 0, (PVOID)&rcFrame, 0)) { // // For some reason SPI failed, so use the full screen. // rcFrame.top = rcFrame.left = 0; rcFrame.right = GetSystemMetrics(SM_CXSCREEN); rcFrame.bottom = GetSystemMetrics(SM_CYSCREEN); } if(x + w > rcFrame.right) { x = rcFrame.right - w; } else if(x < rcFrame.left) { x = rcFrame.left; } if(y + h > rcFrame.bottom) { y = rcFrame.bottom - h; } else if(y < rcFrame.top) { y = rcFrame.top; } MoveWindow(WndToCenter, x, y, w, h, FALSE); } VOID _DialogSetTextByResource( HWND hWnd, HINSTANCE hInst, DWORD dwResID, LPARAM Extra ) { PSTR lpszMsgFmtA; PWSTR lpszMsgFmtW; PSTR lpszNewTextA; PWSTR lpszNewTextW; if (g_VersionInfo.dwPlatformId == VER_PLATFORM_WIN32_NT) { // WinNT lpszMsgFmtW = GetResourceStringW( hInst, dwResID ); if (lpszMsgFmtW) { FormatMessageW( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_ARGUMENT_ARRAY, lpszMsgFmtW, 0, 0, (LPWSTR)(&lpszNewTextW), 0, (va_list *)&Extra ); FREE( lpszMsgFmtW ); if (lpszNewTextW) { SetDlgItemTextW( hWnd, IDC_TEXT, (PWSTR)lpszNewTextW ); LocalFree( lpszNewTextW ); } } } else { // Win9x lpszMsgFmtA = GetResourceStringA( hInst, dwResID ); if (lpszMsgFmtA) { FormatMessageA( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_ARGUMENT_ARRAY, lpszMsgFmtA, 0, 0, (LPSTR)(&lpszNewTextA), 0, (va_list *)&Extra ); FREE( lpszMsgFmtA ); if (lpszNewTextA) { SetDlgItemTextA( hWnd, IDC_TEXT, (PSTR)lpszNewTextA ); LocalFree( lpszNewTextA ); } } } } VOID _DisplayError( HWND hWnd, HINSTANCE hInst, DWORD ecValue, LPARAM Extra ) { ERRORMAPPINGSTRUCT ErrorMap[] = ERROR_MAPPING; DWORD dwArraySize; DWORD x; DWORD dwResId = IDS_MSG_SUCCESS; PSTR lpszMsgFmtA; PWSTR lpszMsgFmtW; PSTR lpszBoxTitleA; PWSTR lpszBoxTitleW; PSTR lpszNewTextA; PWSTR lpszNewTextW; dwArraySize = sizeof(ErrorMap) / sizeof(ERRORMAPPINGSTRUCT); for (x=0; xhWnd; hInstParent = ((LPTHREADSTARTUPINFO)lParam)->hInstance; ANIMATE_OPEN( IDA_STARTUP ); ANIMATE_PLAY( ); dwCurrentAnim = IDA_STARTUP; Cursor = SetCursor (LoadCursor (NULL, IDC_WAIT)); ShowCursor (TRUE); _CenterWindowOnDesktop( Dlg ); return TRUE; case WM_COMMAND: switch (LOWORD(wParam)) { case IDOK: case IDCANCEL: SendMessage( hWndParent, WM_USER_DIALOG_COMPLETE, wParam, 0 ); return TRUE; break; } break; case WM_USER_UNPACKING_FILE: if (dwCurrentAnim == IDA_STARTUP) { ANIMATE_STOP(); ANIMATE_CLOSE(); ANIMATE_OPEN( IDA_FILECOPY ); ANIMATE_PLAY(); dwCurrentAnim = IDA_FILECOPY; } if (g_VersionInfo.dwPlatformId == VER_PLATFORM_WIN32_NT) { // WinNT _DialogSetTextByResource( Dlg, hInstParent, IDS_MSG_UNPACKING_FILEW, lParam ); } else { // Win9x _DialogSetTextByResource( Dlg, hInstParent, IDS_MSG_UNPACKING_FILEA, lParam ); } break; case WM_USER_THREAD_ERROR: ANIMATE_STOP(); ANIMATE_CLOSE(); ShowWindow( Dlg, SW_HIDE ); _DisplayError( Dlg, hInstParent, (DWORD)wParam, lParam ); SendMessage( hWndParent, WM_USER_DIALOG_COMPLETE, wParam, 0 ); break; case WM_USER_SUBTHREAD_CREATED: ShowWindow( Dlg, SW_HIDE ); dwThreadId = (DWORD)lParam; break; case WM_USER_THREAD_COMPLETE: ANIMATE_STOP(); ANIMATE_CLOSE(); if ((ERRORCODE)lParam == E_OK) { SendMessage( hWndParent, WM_USER_DIALOG_COMPLETE, 0, 0 ); } dwThreadId = 0; break; case WM_DESTROY: ShowCursor (FALSE); if (Cursor) { SetCursor (Cursor); Cursor = NULL; } break; } return FALSE; }