/* * Message boxes * * Copyright 1995 Bernd Schmidt * */ #include "windows.h" #include "dlgs.h" #include "selectors.h" #include "alias.h" #include "relay32.h" #include "win.h" #include "resource.h" #include "task.h" typedef struct { LPCSTR title; LPCSTR text; WORD type; } MSGBOX, *LPMSGBOX; LRESULT SystemMessageBoxProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam) { LPMSGBOX lpmb; RECT rect, textrect; HWND hItem; HDC hdc; LONG lRet; int i, buttons, bwidth, bheight, theight, wwidth, bpos; int borheight, iheight, tiheight; switch(message) { case WM_INITDIALOG: lpmb = (LPMSGBOX)lParam; if (lpmb->title != NULL) { SetWindowText(hwnd, lpmb->title); } SetWindowText(GetDlgItem(hwnd, 100), lpmb->text); /* Hide not selected buttons */ switch(lpmb->type & MB_TYPEMASK) { case MB_OK: ShowWindow(GetDlgItem(hwnd, 2), SW_HIDE); /* fall through */ case MB_OKCANCEL: ShowWindow(GetDlgItem(hwnd, 3), SW_HIDE); ShowWindow(GetDlgItem(hwnd, 4), SW_HIDE); ShowWindow(GetDlgItem(hwnd, 5), SW_HIDE); ShowWindow(GetDlgItem(hwnd, 6), SW_HIDE); ShowWindow(GetDlgItem(hwnd, 7), SW_HIDE); break; case MB_ABORTRETRYIGNORE: ShowWindow(GetDlgItem(hwnd, 1), SW_HIDE); ShowWindow(GetDlgItem(hwnd, 2), SW_HIDE); ShowWindow(GetDlgItem(hwnd, 6), SW_HIDE); ShowWindow(GetDlgItem(hwnd, 7), SW_HIDE); break; case MB_YESNO: ShowWindow(GetDlgItem(hwnd, 2), SW_HIDE); /* fall through */ case MB_YESNOCANCEL: ShowWindow(GetDlgItem(hwnd, 1), SW_HIDE); ShowWindow(GetDlgItem(hwnd, 3), SW_HIDE); ShowWindow(GetDlgItem(hwnd, 4), SW_HIDE); ShowWindow(GetDlgItem(hwnd, 5), SW_HIDE); break; } /* Set the icon */ switch(lpmb->type & MB_ICONMASK) { case MB_ICONEXCLAMATION: SendDlgItemMessage(hwnd, stc1, STM_SETICON, (WPARAM)LoadIcon(0, IDI_EXCLAMATION), 0); break; case MB_ICONQUESTION: SendDlgItemMessage(hwnd, stc1, STM_SETICON, (WPARAM)LoadIcon(0, IDI_QUESTION), 0); break; case MB_ICONASTERISK: SendDlgItemMessage(hwnd, stc1, STM_SETICON, (WPARAM)LoadIcon(0, IDI_ASTERISK), 0); break; case MB_ICONHAND: default: SendDlgItemMessage(hwnd, stc1, STM_SETICON, (WPARAM)LoadIcon(0, IDI_HAND), 0); break; } /* Position everything */ GetWindowRect(hwnd, &rect); borheight = rect.bottom - rect.top; wwidth = rect.right - rect.left; GetClientRect(hwnd, &rect); borheight -= rect.bottom - rect.top; /* Get the icon height */ GetWindowRect(GetDlgItem(hwnd, 1088), &rect); iheight = rect.bottom - rect.top; /* Get the number of visible buttons and their width */ GetWindowRect(GetDlgItem(hwnd, 2), &rect); bheight = rect.bottom - rect.top; bwidth = rect.left; GetWindowRect(GetDlgItem(hwnd, 1), &rect); bwidth -= rect.left; for (buttons = 0, i = 1; i < 8; i++) { hItem = GetDlgItem(hwnd, i); if (GetWindowLong(hItem, GWL_STYLE) & WS_VISIBLE) { buttons++; } } /* Get the text size */ hItem = GetDlgItem(hwnd, 100); GetWindowRect(hItem, &textrect); MapWindowPoints(0, hwnd, (LPPOINT)&textrect, 2); GetClientRect(hItem, &rect); hdc = GetDC(hItem); lRet = DrawText(hdc, lpmb->text, -1, &rect, DT_LEFT | DT_EXPANDTABS | DT_WORDBREAK | DT_CALCRECT); theight = rect.bottom - rect.top; tiheight = 16 + MAX(iheight, theight); ReleaseDC(hItem, hdc); /* Position the text */ SetWindowPos(hItem, 0, textrect.left, (tiheight - theight) / 2, rect.right - rect.left, theight, SWP_NOZORDER | SWP_NOACTIVATE | SWP_NOREDRAW); /* Position the icon */ hItem = GetDlgItem(hwnd, 1088); GetWindowRect(hItem, &rect); MapWindowPoints(0, hwnd, (LPPOINT)&rect, 2); SetWindowPos(hItem, 0, rect.left, (tiheight - iheight) / 2, 0, 0, SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE | SWP_NOREDRAW); /* Resize the window */ SetWindowPos(hwnd, 0, 0, 0, wwidth, 8 + tiheight + bheight + borheight, SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE | SWP_NOREDRAW); /* Position the buttons */ bpos = (wwidth - bwidth * buttons) / 2; GetWindowRect(GetDlgItem(hwnd, 1), &rect); for (buttons = i = 0; i < 7; i++) { /* some arithmetic to get the right order for YesNoCancel windows */ hItem = GetDlgItem(hwnd, (i + 5) % 7 + 1); if (GetWindowLong(hItem, GWL_STYLE) & WS_VISIBLE) { if (buttons++ == ((lpmb->type & MB_DEFMASK) >> 8)) { SetFocus(hItem); SendMessage(hItem, BM_SETSTYLE, BS_DEFPUSHBUTTON, TRUE); } SetWindowPos(hItem, 0, bpos, tiheight, 0, 0, SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE | SWP_NOREDRAW); bpos += bwidth; } } return 0; break; case WM_COMMAND: switch (wParam) { case IDOK: case IDCANCEL: case IDABORT: case IDRETRY: case IDIGNORE: case IDYES: case IDNO: EndDialog(hwnd, wParam); break; } break; } return 0; } /************************************************************************** * MessageBox [USER.1] */ int MessageBox(HWND hWnd, LPCSTR text, LPCSTR title, WORD type) { HANDLE handle; MSGBOX mbox; int ret; DWORD WineProc,Win16Proc,Win32Proc; static int initialized = 0; mbox.title = title; mbox.text = text; mbox.type = type; if (!initialized) { WineProc=(DWORD)SystemMessageBoxProc; Win16Proc=(DWORD)GetWndProcEntry16("SystemMessageBoxProc"); Win32Proc=(DWORD)RELAY32_GetEntryPoint(RELAY32_GetBuiltinDLL("WINPROCS32"), "SystemMessageBoxProc",0); ALIAS_RegisterAlias(WineProc,Win16Proc,Win32Proc); initialized=1; } handle = SYSRES_LoadResource( SYSRES_DIALOG_MSGBOX ); if (!handle) return 0; ret = DialogBoxIndirectParam( WIN_GetWindowInstance(hWnd), handle, hWnd, GetWndProcEntry16("SystemMessageBoxProc"), (LONG)&mbox ); SYSRES_FreeResource( handle ); return ret; } /************************************************************************** * FatalAppExit [USER.137] */ void FatalAppExit(UINT fuAction, LPCSTR str) { MessageBox(0, str, NULL, MB_SYSTEMMODAL | MB_OK); TASK_KillCurrentTask(0); }