/* * 'Wine' MessageBox function handling * * Copyright 1993 Martin Ayotte */ static char Copyright[] = "Copyright Martin Ayotte, 1993"; #include "windows.h" #include "heap.h" #include "win.h" typedef struct tagMSGBOX { LPSTR Title; LPSTR Str; WORD wType; WORD wRetVal; BOOL ActiveFlg; HWND hWndYes; HWND hWndNo; HWND hWndCancel; HICON hIcon; RECT rectIcon; RECT rectStr; } MSGBOX; typedef MSGBOX FAR* LPMSGBOX; LONG SystemMessageBoxProc(HWND hwnd, WORD message, WORD wParam, LONG lParam); /************************************************************************** * MessageBox [USER.1] */ int MessageBox( HWND hWnd, LPSTR str, LPSTR title, WORD type ) { HWND hDlg; WND *wndPtr; WNDCLASS wndClass; MSG msg; MSGBOX mb; wndPtr = WIN_FindWndPtr(hWnd); printf( "MessageBox: '%s'\n", str ); wndClass.style = CS_HREDRAW | CS_VREDRAW ; wndClass.lpfnWndProc = (WNDPROC)SystemMessageBoxProc; wndClass.cbClsExtra = 0; wndClass.cbWndExtra = 0; wndClass.hInstance = wndPtr->hInstance; wndClass.hIcon = (HICON)NULL; wndClass.hCursor = LoadCursor((HANDLE)NULL, IDC_ARROW); wndClass.hbrBackground = GetStockObject(WHITE_BRUSH); wndClass.lpszMenuName = NULL; wndClass.lpszClassName = "MESSAGEBOX"; if (!RegisterClass(&wndClass)) return 0; memset(&mb, 0, sizeof(MSGBOX)); mb.Title = title; mb.Str = str; mb.wType = type; mb.ActiveFlg = TRUE; hDlg = CreateWindow("MESSAGEBOX", title, WS_POPUP | WS_DLGFRAME | WS_VISIBLE, 100, 150, 400, 120, (HWND)NULL, (HMENU)NULL, wndPtr->hInstance, (LPSTR)&mb); if (hDlg == 0) return 0; while(TRUE) { if (!mb.ActiveFlg) break; if (!GetMessage(&msg, (HWND)NULL, 0, 0)) break; TranslateMessage(&msg); DispatchMessage(&msg); } printf( "after MessageBox !\n"); if (!UnregisterClass("MESSAGEBOX", wndPtr->hInstance)) return 0; return(mb.wRetVal); } LPMSGBOX MsgBoxGetStorageHeader(HWND hwnd) { WND *wndPtr; LPMSGBOX lpmb; wndPtr = WIN_FindWndPtr(hwnd); if (wndPtr == 0) { printf("Bad Window handle on MessageBox !\n"); return 0; } lpmb = *((LPMSGBOX *)&wndPtr->wExtra[1]); return lpmb; } LONG SystemMessageBoxProc(HWND hWnd, WORD message, WORD wParam, LONG lParam) { WND *wndPtr; CREATESTRUCT *createStruct; PAINTSTRUCT ps; HDC hDC; RECT rect; LPMSGBOX lpmb; LPMSGBOX lpmbInit; BITMAP bm; HBITMAP hBitMap; HDC hMemDC; HICON hIcon; HINSTANCE hInst2; int x; switch(message) { case WM_CREATE: wndPtr = WIN_FindWndPtr(hWnd); createStruct = (CREATESTRUCT *)lParam; lpmbInit = (LPMSGBOX)createStruct->lpCreateParams; if (lpmbInit == 0) break; *((LPMSGBOX *)&wndPtr->wExtra[1]) = lpmbInit; lpmb = MsgBoxGetStorageHeader(hWnd); GetClientRect(hWnd, &rect); CopyRect(&lpmb->rectStr, &rect); lpmb->rectStr.bottom -= 32; switch(lpmb->wType & MB_TYPEMASK) { case MB_OK : lpmb->hWndYes = CreateWindow("BUTTON", "&Ok", WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | BS_PUSHBUTTON, rect.right / 2 - 30, rect.bottom - 25, 60, 18, hWnd, 1, wndPtr->hInstance, 0L); break; case MB_OKCANCEL : lpmb->hWndYes = CreateWindow("BUTTON", "&Ok", WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | BS_PUSHBUTTON, rect.right / 2 - 65, rect.bottom - 25, 60, 18, hWnd, 1, wndPtr->hInstance, 0L); lpmb->hWndCancel = CreateWindow("BUTTON", "&Cancel", WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | BS_PUSHBUTTON, rect.right / 2 + 5, rect.bottom - 25, 60, 18, hWnd, 2, wndPtr->hInstance, 0L); break; case MB_ABORTRETRYIGNORE : lpmb->hWndYes = CreateWindow("BUTTON", "&Retry", WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | BS_PUSHBUTTON, rect.right / 2 - 100, rect.bottom - 25, 60, 18, hWnd, 1, wndPtr->hInstance, 0L); lpmb->hWndNo = CreateWindow("BUTTON", "&Ignore", WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | BS_PUSHBUTTON, rect.right / 2 - 30, rect.bottom - 25, 60, 18, hWnd, 2, wndPtr->hInstance, 0L); lpmb->hWndCancel = CreateWindow("BUTTON", "&Abort", WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | BS_PUSHBUTTON, rect.right / 2 + 40, rect.bottom - 25, 60, 18, hWnd, 3, wndPtr->hInstance, 0L); break; case MB_YESNO : lpmb->hWndYes = CreateWindow("BUTTON", "&Yes", WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | BS_PUSHBUTTON, rect.right / 2 - 65, rect.bottom - 25, 60, 18, hWnd, 1, wndPtr->hInstance, 0L); lpmb->hWndNo = CreateWindow("BUTTON", "&No", WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | BS_PUSHBUTTON, rect.right / 2 + 5, rect.bottom - 25, 60, 18, hWnd, 2, wndPtr->hInstance, 0L); break; case MB_YESNOCANCEL : lpmb->hWndYes = CreateWindow("BUTTON", "&Yes", WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | BS_PUSHBUTTON, rect.right / 2 - 100, rect.bottom - 25, 60, 18, hWnd, 1, wndPtr->hInstance, 0L); lpmb->hWndNo = CreateWindow("BUTTON", "&No", WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | BS_PUSHBUTTON, rect.right / 2 - 30, rect.bottom - 25, 60, 18, hWnd, 2, wndPtr->hInstance, 0L); lpmb->hWndCancel = CreateWindow("BUTTON", "&Cancel", WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | BS_PUSHBUTTON, rect.right / 2 + 40, rect.bottom - 25, 60, 18, hWnd, 3, wndPtr->hInstance, 0L); break; } switch(lpmb->wType & MB_ICONMASK) { case MB_ICONEXCLAMATION: printf("MsgBox LoadIcon Exclamation !\n"); lpmb->hIcon = LoadIcon((HINSTANCE)NULL, IDI_EXCLAMATION); break; case MB_ICONQUESTION: printf("MsgBox LoadIcon Question !\n"); lpmb->hIcon = LoadIcon((HINSTANCE)NULL, IDI_QUESTION); break; case MB_ICONASTERISK: printf("MsgBox LoadIcon Asterisk !\n"); lpmb->hIcon = LoadIcon((HINSTANCE)NULL, IDI_ASTERISK); break; case MB_ICONHAND: printf("MsgBox LoadIcon Hand !\n"); lpmb->hIcon = LoadIcon((HINSTANCE)NULL, IDI_HAND); break; } if (lpmb->hIcon != (HICON)NULL) { SetRect(&lpmb->rectIcon, 16, lpmb->rectStr.bottom / 2 - 16, 48, lpmb->rectStr.bottom / 2 + 16); lpmb->rectStr.left += 64; } break; case WM_PAINT: lpmb = MsgBoxGetStorageHeader(hWnd); CopyRect(&rect, &lpmb->rectStr); hDC = BeginPaint(hWnd, &ps); if (lpmb->hIcon) DrawIcon(hDC, lpmb->rectIcon.left, lpmb->rectIcon.top, lpmb->hIcon); DrawText(hDC, lpmb->Str, -1, &rect, DT_CALCRECT | DT_CENTER | DT_WORDBREAK); rect.top = lpmb->rectStr.bottom / 2 - rect.bottom / 2; rect.bottom = lpmb->rectStr.bottom / 2 + rect.bottom / 2; DrawText(hDC, lpmb->Str, -1, &rect, DT_CENTER | DT_WORDBREAK); EndPaint(hWnd, &ps); break; case WM_DESTROY: printf("MessageBox WM_DESTROY !\n"); ReleaseCapture(); lpmb = MsgBoxGetStorageHeader(hWnd); lpmb->ActiveFlg = FALSE; if (lpmb->hIcon) DestroyIcon(lpmb->hIcon); if (lpmb->hWndYes) DestroyWindow(lpmb->hWndYes); if (lpmb->hWndNo) DestroyWindow(lpmb->hWndNo); if (lpmb->hWndCancel) DestroyWindow(lpmb->hWndCancel); break; case WM_COMMAND: lpmb = MsgBoxGetStorageHeader(hWnd); switch(wParam) { case 1: lpmb->wRetVal = IDOK; break; case 2: wndPtr = WIN_FindWndPtr(hWnd); hDC = GetDC(hWnd); /* for (x = 1; x < 50; x++) { hBitMap = LoadBitmap(wndPtr->hInstance, MAKEINTRESOURCE(x)); GetObject(hBitMap, sizeof(BITMAP), (LPSTR)&bm); hMemDC = CreateCompatibleDC(hDC); SelectObject(hMemDC, hBitMap); printf(" bm.bmWidth=%d bm.bmHeight=%d\n", bm.bmWidth, bm.bmHeight); BitBlt(hDC, x * 20, 30, bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY); DeleteDC(hMemDC); } */ hBitMap = LoadBitmap((HINSTANCE)NULL, "WINELOGO"); GetObject(hBitMap, sizeof(BITMAP), (LPSTR)&bm); printf("bm.bmWidth=%d bm.bmHeight=%d\n", bm.bmWidth, bm.bmHeight); hMemDC = CreateCompatibleDC(hDC); SelectObject(hMemDC, hBitMap); BitBlt(hDC, 100, 30, bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY); DeleteDC(hMemDC); ReleaseDC(hWnd, hDC); lpmb->wRetVal = IDCANCEL; /* SetWindowPos(lpmb->hWndNo, (HWND)NULL, 20, 20, 0, 0, SWP_NOSIZE | SWP_NOZORDER); */ return 0; break; case 3: hDC = GetDC(hWnd); hInst2 = LoadImage("ev3lite.exe"); printf("hInst2=%04X\n", hInst2); hIcon = LoadIcon(hInst2, "EV3LITE"); DrawIcon(hDC, 20, 20, hIcon); DestroyIcon(hIcon); hInst2 = LoadImage("moricons.dll"); printf("hInst2=%04X\n", hInst2); hIcon = LoadIcon(hInst2, MAKEINTRESOURCE(1)); /* hIcon = LoadIcon(hInst2, "WINEICON"); */ DrawIcon(hDC, 60, 20, hIcon); DestroyIcon(hIcon); hIcon = LoadIcon((HINSTANCE)NULL, IDI_EXCLAMATION); DrawIcon(hDC, 1000, 20, hIcon); DestroyIcon(hIcon); ReleaseDC(hWnd, hDC); lpmb->wRetVal = IDIGNORE; return(0); break; default: return(0); } CloseWindow(hWnd); break; default: return DefWindowProc(hWnd, message, wParam, lParam ); } return(0); }