windows-nt/Source/XPSP1/NT/windows/winstate/cobra/app/loader/dialog.c
2020-09-26 16:20:57 +08:00

303 lines
8.5 KiB
C

#include "pch.h"
#include "loader.h"
#include "resource.h"
#include "resrc1.h"
#include <winuser.h>
#include <commctrl.h>
#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; x<dwArraySize; x++)
{
if (ecValue == ErrorMap[x].ecValue)
{
dwResId = ErrorMap[x].uResourceID;
break;
}
}
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)
{
lpszBoxTitleW = GetResourceStringW( hInst, IDS_WINDOWTITLE );
if (lpszBoxTitleW)
{
MessageBoxW( hWnd, lpszNewTextW, lpszBoxTitleW, MB_OK | MB_ICONERROR | MB_TASKMODAL );
FREE( lpszBoxTitleW );
}
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)
{
lpszBoxTitleA = GetResourceStringA( hInst, IDS_WINDOWTITLE );
if (lpszBoxTitleA)
{
MessageBoxA( hWnd, lpszNewTextA, lpszBoxTitleA, MB_OK | MB_ICONERROR | MB_TASKMODAL );
FREE( lpszBoxTitleA );
}
LocalFree( lpszNewTextA );
}
}
}
}
BOOL
CALLBACK
_SetMigwizActive(
HWND hWnd,
LPARAM lParam
)
{
SetForegroundWindow( hWnd );
return FALSE;
}
INT_PTR
CALLBACK
DlgProc (
HWND Dlg,
UINT Msg,
WPARAM wParam,
LPARAM lParam
)
{
static HWND hWndParent = NULL;
static HINSTANCE hInstParent = NULL;
static HCURSOR Cursor = NULL;
static HWND hWndAnim = NULL;
static DWORD dwCurrentAnim = 0;
static DWORD dwThreadId = 0;
switch (Msg)
{
case WM_ACTIVATE:
if (dwThreadId != 0)
{
EnumThreadWindows( dwThreadId, _SetMigwizActive, (LPARAM)NULL );
}
break;
case WM_INITDIALOG:
hWndParent = ((LPTHREADSTARTUPINFO)lParam)->hWnd;
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;
}