From 01e82a4fdccfea88e543f3f5252b1d569482e681 Mon Sep 17 00:00:00 2001 From: Dmitry Timoshkov Date: Sat, 19 Oct 2002 19:18:19 +0000 Subject: [PATCH] Convert MessageBox family functions to unicode. --- include/winuser.h | 6 +- windows/msgbox.c | 223 ++++++++++++++++++++++++++++------------------ 2 files changed, 139 insertions(+), 90 deletions(-) diff --git a/include/winuser.h b/include/winuser.h index f7c29ffb3e7..d7a0f6847f3 100644 --- a/include/winuser.h +++ b/include/winuser.h @@ -2330,7 +2330,7 @@ typedef struct INT iContextType; /* Either HELPINFO_WINDOW or HELPINFO_MENUITEM */ INT iCtrlId; /* Control Id or a Menu item Id. */ HANDLE hItemHandle; /* hWnd of control or hMenu. */ - DWORD dwContextId; /* Context Id associated with this item */ + DWORD_PTR dwContextId; /* Context Id associated with this item */ POINT MousePos; /* Mouse Position in screen co-ordinates */ } HELPINFO,*LPHELPINFO; @@ -2345,7 +2345,7 @@ typedef struct LPCSTR lpszCaption; DWORD dwStyle; LPCSTR lpszIcon; - DWORD dwContextHelpId; + DWORD_PTR dwContextHelpId; MSGBOXCALLBACK lpfnMsgBoxCallback; DWORD dwLanguageId; } MSGBOXPARAMSA, *PMSGBOXPARAMSA, *LPMSGBOXPARAMSA; @@ -2359,7 +2359,7 @@ typedef struct LPCWSTR lpszCaption; DWORD dwStyle; LPCWSTR lpszIcon; - DWORD dwContextHelpId; + DWORD_PTR dwContextHelpId; MSGBOXCALLBACK lpfnMsgBoxCallback; DWORD dwLanguageId; } MSGBOXPARAMSW, *PMSGBOXPARAMSW, *LPMSGBOXPARAMSW; diff --git a/windows/msgbox.c b/windows/msgbox.c index 59322edcebe..8ba03b2530c 100644 --- a/windows/msgbox.c +++ b/windows/msgbox.c @@ -24,6 +24,7 @@ #include "wingdi.h" #include "wine/winbase16.h" #include "wine/winuser16.h" +#include "winternl.h" #include "dlgs.h" #include "heap.h" #include "user.h" @@ -34,43 +35,43 @@ WINE_DEFAULT_DEBUG_CHANNEL(dialog); #define MSGBOX_IDICON 1088 #define MSGBOX_IDTEXT 100 -static HFONT MSGBOX_OnInit(HWND hwnd, LPMSGBOXPARAMSA lpmb) +static HFONT MSGBOX_OnInit(HWND hwnd, LPMSGBOXPARAMSW lpmb) { - static HFONT hFont = 0, hPrevFont = 0; + HFONT hFont = 0, hPrevFont = 0; RECT rect; HWND hItem; HDC hdc; int i, buttons; int bspace, bw, bh, theight, tleft, wwidth, wheight, bpos; int borheight, borwidth, iheight, ileft, iwidth, twidth, tiheight; - LPCSTR lpszText; - char buf[256]; + LPCWSTR lpszText; + WCHAR buf[256]; if (TWEAK_WineLook >= WIN95_LOOK) { - NONCLIENTMETRICSA nclm; - nclm.cbSize = sizeof(NONCLIENTMETRICSA); - SystemParametersInfoA (SPI_GETNONCLIENTMETRICS, 0, &nclm, 0); - hFont = CreateFontIndirectA (&nclm.lfMessageFont); + NONCLIENTMETRICSW nclm; + nclm.cbSize = sizeof(nclm); + SystemParametersInfoW (SPI_GETNONCLIENTMETRICS, 0, &nclm, 0); + hFont = CreateFontIndirectW (&nclm.lfMessageFont); /* set button font */ for (i=1; i < 8; i++) - SendDlgItemMessageA (hwnd, i, WM_SETFONT, (WPARAM)hFont, 0); + SendDlgItemMessageW (hwnd, i, WM_SETFONT, (WPARAM)hFont, 0); /* set text font */ - SendDlgItemMessageA (hwnd, MSGBOX_IDTEXT, WM_SETFONT, (WPARAM)hFont, 0); + SendDlgItemMessageW (hwnd, MSGBOX_IDTEXT, WM_SETFONT, (WPARAM)hFont, 0); } if (HIWORD(lpmb->lpszCaption)) { - SetWindowTextA(hwnd, lpmb->lpszCaption); + SetWindowTextW(hwnd, lpmb->lpszCaption); } else { - if (LoadStringA(lpmb->hInstance, LOWORD(lpmb->lpszCaption), buf, sizeof(buf))) - SetWindowTextA(hwnd, buf); + if (LoadStringW(lpmb->hInstance, LOWORD(lpmb->lpszCaption), buf, 256)) + SetWindowTextW(hwnd, buf); } if (HIWORD(lpmb->lpszText)) { lpszText = lpmb->lpszText; } else { lpszText = buf; - if (!LoadStringA(lpmb->hInstance, LOWORD(lpmb->lpszText), buf, sizeof(buf))) + if (!LoadStringW(lpmb->hInstance, LOWORD(lpmb->lpszText), buf, 256)) *buf = 0; /* FIXME ?? */ } - SetWindowTextA(GetDlgItem(hwnd, MSGBOX_IDTEXT), lpszText); + SetWindowTextW(GetDlgItem(hwnd, MSGBOX_IDTEXT), lpszText); /* Hide not selected buttons */ switch(lpmb->dwStyle & MB_TYPEMASK) { @@ -110,20 +111,24 @@ static HFONT MSGBOX_OnInit(HWND hwnd, LPMSGBOXPARAMSA lpmb) /* Set the icon */ switch(lpmb->dwStyle & MB_ICONMASK) { case MB_ICONEXCLAMATION: - SendDlgItemMessageA(hwnd, stc1, STM_SETICON, - (WPARAM)LoadIconA(0, IDI_EXCLAMATIONA), 0); + SendDlgItemMessageW(hwnd, stc1, STM_SETICON, + (WPARAM)LoadIconW(0, IDI_EXCLAMATIONW), 0); break; case MB_ICONQUESTION: - SendDlgItemMessageA(hwnd, stc1, STM_SETICON, - (WPARAM)LoadIconA(0, IDI_QUESTIONA), 0); + SendDlgItemMessageW(hwnd, stc1, STM_SETICON, + (WPARAM)LoadIconW(0, IDI_QUESTIONW), 0); break; case MB_ICONASTERISK: - SendDlgItemMessageA(hwnd, stc1, STM_SETICON, - (WPARAM)LoadIconA(0, IDI_ASTERISKA), 0); + SendDlgItemMessageW(hwnd, stc1, STM_SETICON, + (WPARAM)LoadIconW(0, IDI_ASTERISKW), 0); break; case MB_ICONHAND: - SendDlgItemMessageA(hwnd, stc1, STM_SETICON, - (WPARAM)LoadIconA(0, IDI_HANDA), 0); + SendDlgItemMessageW(hwnd, stc1, STM_SETICON, + (WPARAM)LoadIconW(0, IDI_HANDW), 0); + break; + case MB_USERICON: + SendDlgItemMessageW(hwnd, stc1, STM_SETICON, + (WPARAM)LoadIconW(lpmb->hInstance, lpmb->lpszIcon), 0); break; default: /* By default, Windows 95/98/NT do not associate an icon to message boxes. @@ -156,14 +161,14 @@ static HFONT MSGBOX_OnInit(HWND hwnd, LPMSGBOXPARAMSA lpmb) for (buttons = 0, i = 1; i < 8; i++) { hItem = GetDlgItem(hwnd, i); - if (GetWindowLongA(hItem, GWL_STYLE) & WS_VISIBLE) + if (GetWindowLongW(hItem, GWL_STYLE) & WS_VISIBLE) { - char buttonText[1024]; + WCHAR buttonText[1024]; int w, h; buttons++; - if (GetWindowTextA(hItem, buttonText, sizeof buttonText)) + if (GetWindowTextW(hItem, buttonText, 1024)) { - DrawTextA( hdc, buttonText, -1, &rect, DT_LEFT | DT_EXPANDTABS | DT_CALCRECT); + DrawTextW( hdc, buttonText, -1, &rect, DT_LEFT | DT_EXPANDTABS | DT_CALCRECT); h = rect.bottom - rect.top; w = rect.right - rect.left; if (h > bh) bh = h; @@ -180,7 +185,7 @@ static HFONT MSGBOX_OnInit(HWND hwnd, LPMSGBOXPARAMSA lpmb) /* Get the text size */ GetClientRect(GetDlgItem(hwnd, MSGBOX_IDTEXT), &rect); rect.top = rect.left = rect.bottom = 0; - DrawTextA( hdc, lpszText, -1, &rect, + DrawTextW( hdc, lpszText, -1, &rect, DT_LEFT | DT_EXPANDTABS | DT_WORDBREAK | DT_CALCRECT); /* Min text width corresponds to space for the buttons */ tleft = 2 * ileft + iwidth; @@ -212,10 +217,10 @@ static HFONT MSGBOX_OnInit(HWND hwnd, LPMSGBOXPARAMSA lpmb) 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 (GetWindowLongA(hItem, GWL_STYLE) & WS_VISIBLE) { + if (GetWindowLongW(hItem, GWL_STYLE) & WS_VISIBLE) { if (buttons++ == ((lpmb->dwStyle & MB_DEFMASK) >> 8)) { SetFocus(hItem); - SendMessageA( hItem, BM_SETSTYLE, BS_DEFPUSHBUTTON, TRUE ); + SendMessageW( hItem, BM_SETSTYLE, BS_DEFPUSHBUTTON, TRUE ); } SetWindowPos(hItem, 0, bpos, tiheight, bw, bh, SWP_NOZORDER|SWP_NOACTIVATE|SWP_NOREDRAW); @@ -248,14 +253,21 @@ static HFONT MSGBOX_OnInit(HWND hwnd, LPMSGBOXPARAMSA lpmb) * * Dialog procedure for message boxes. */ -static LRESULT CALLBACK MSGBOX_DlgProc( HWND hwnd, UINT message, +static BOOL CALLBACK MSGBOX_DlgProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam ) { - static HFONT hFont; + HFONT hFont; + switch(message) { case WM_INITDIALOG: - hFont = MSGBOX_OnInit(hwnd, (LPMSGBOXPARAMSA)lParam); - return 0; + { + LPMSGBOXPARAMSW mbp = (LPMSGBOXPARAMSW)lParam; + SetWindowContextHelpId(hwnd, mbp->dwContextHelpId); + hFont = MSGBOX_OnInit(hwnd, mbp); + SetPropA(hwnd, "WINE_MSGBOX_HFONT", (HANDLE)hFont); + SetPropA(hwnd, "WINE_MSGBOX_HELPCALLBACK", (HANDLE)mbp->lpfnMsgBoxCallback); + break; + } case WM_COMMAND: switch (wParam) @@ -267,12 +279,28 @@ static LRESULT CALLBACK MSGBOX_DlgProc( HWND hwnd, UINT message, case IDIGNORE: case IDYES: case IDNO: + hFont = GetPropA(hwnd, "WINE_MSGBOX_HFONT"); EndDialog(hwnd, wParam); if (hFont) DeleteObject(hFont); break; } + case WM_HELP: + { + MSGBOXCALLBACK callback = (MSGBOXCALLBACK)GetPropA(hwnd, "WINE_MSGBOX_HELPCALLBACK"); + HELPINFO hi; + + memcpy(&hi, (void *)lParam, sizeof(hi)); + hi.dwContextId = GetWindowContextHelpId(hwnd); + + if (callback) + callback(&hi); + else + SendMessageW(GetWindow(hwnd, GW_OWNER), WM_HELP, 0, (LPARAM)&hi); + break; + } + default: /* Ok. Ignore all the other messages */ TRACE("Message number 0x%04x is being ignored.\n", message); @@ -291,44 +319,16 @@ static LRESULT CALLBACK MSGBOX_DlgProc( HWND hwnd, UINT message, */ INT WINAPI MessageBoxA(HWND hWnd, LPCSTR text, LPCSTR title, UINT type) { - LPVOID template; - HRSRC hRes; - MSGBOXPARAMSA mbox; - - WARN("Messagebox\n"); - - if(!(hRes = FindResourceA(GetModuleHandleA("USER32"), "MSGBOX", RT_DIALOGA))) - return 0; - if(!(template = (LPVOID)LoadResource(GetModuleHandleA("USER32"), hRes))) - return 0; - - if (!text) text=""; - if (!title) - title="Error"; - mbox.lpszCaption = title; - mbox.lpszText = text; - mbox.dwStyle = type; - return DialogBoxIndirectParamA( GetWindowLongA(hWnd,GWL_HINSTANCE), template, - hWnd, (DLGPROC)MSGBOX_DlgProc, (LPARAM)&mbox ); + return MessageBoxExA(hWnd, text, title, type, LANG_NEUTRAL); } /************************************************************************** * MessageBoxW (USER32.@) */ -INT WINAPI MessageBoxW( HWND hwnd, LPCWSTR text, LPCWSTR title, - UINT type ) +INT WINAPI MessageBoxW( HWND hwnd, LPCWSTR text, LPCWSTR title, UINT type ) { - LPSTR titleA = HEAP_strdupWtoA( GetProcessHeap(), 0, title ); - LPSTR textA = HEAP_strdupWtoA( GetProcessHeap(), 0, text ); - INT ret; - - WARN("Messagebox\n"); - - ret = MessageBoxA( hwnd, textA, titleA, type ); - HeapFree( GetProcessHeap(), 0, titleA ); - HeapFree( GetProcessHeap(), 0, textA ); - return ret; + return MessageBoxExW(hwnd, text, title, type, LANG_NEUTRAL); } @@ -338,9 +338,20 @@ INT WINAPI MessageBoxW( HWND hwnd, LPCWSTR text, LPCWSTR title, INT WINAPI MessageBoxExA( HWND hWnd, LPCSTR text, LPCSTR title, UINT type, WORD langid ) { - WARN("Messagebox\n"); - /* ignore language id for now */ - return MessageBoxA(hWnd,text,title,type); + MSGBOXPARAMSA msgbox; + + msgbox.cbSize = sizeof(msgbox); + msgbox.hwndOwner = hWnd; + msgbox.hInstance = 0; + msgbox.lpszText = text; + msgbox.lpszCaption = title; + msgbox.dwStyle = type; + msgbox.lpszIcon = NULL; + msgbox.dwContextHelpId = 0; + msgbox.lpfnMsgBoxCallback = NULL; + msgbox.dwLanguageId = langid; + + return MessageBoxIndirectA(&msgbox); } /************************************************************************** @@ -349,9 +360,20 @@ INT WINAPI MessageBoxExA( HWND hWnd, LPCSTR text, LPCSTR title, INT WINAPI MessageBoxExW( HWND hWnd, LPCWSTR text, LPCWSTR title, UINT type, WORD langid ) { - WARN("Messagebox\n"); - /* ignore language id for now */ - return MessageBoxW(hWnd,text,title,type); + MSGBOXPARAMSW msgbox; + + msgbox.cbSize = sizeof(msgbox); + msgbox.hwndOwner = hWnd; + msgbox.hInstance = 0; + msgbox.lpszText = text; + msgbox.lpszCaption = title; + msgbox.dwStyle = type; + msgbox.lpszIcon = NULL; + msgbox.dwContextHelpId = 0; + msgbox.lpfnMsgBoxCallback = NULL; + msgbox.dwLanguageId = langid; + + return MessageBoxIndirectW(&msgbox); } /************************************************************************** @@ -359,19 +381,40 @@ INT WINAPI MessageBoxExW( HWND hWnd, LPCWSTR text, LPCWSTR title, */ INT WINAPI MessageBoxIndirectA( LPMSGBOXPARAMSA msgbox ) { - LPVOID template; - HRSRC hRes; + MSGBOXPARAMSW msgboxW; + UNICODE_STRING textW, captionW, iconW; + int ret; - WARN("Messagebox\n"); + if (HIWORD(msgbox->lpszText)) + RtlCreateUnicodeStringFromAsciiz(&textW, msgbox->lpszText); + else + textW.Buffer = (LPWSTR)msgbox->lpszText; + if (HIWORD(msgbox->lpszCaption)) + RtlCreateUnicodeStringFromAsciiz(&captionW, msgbox->lpszCaption); + else + captionW.Buffer = (LPWSTR)msgbox->lpszCaption; + if (HIWORD(msgbox->lpszIcon)) + RtlCreateUnicodeStringFromAsciiz(&iconW, msgbox->lpszIcon); + else + captionW.Buffer = (LPWSTR)msgbox->lpszIcon; - if(!(hRes = FindResourceA(GetModuleHandleA("USER32"), "MSGBOX", RT_DIALOGA))) - return 0; - if(!(template = (LPVOID)LoadResource(GetModuleHandleA("USER32"), hRes))) - return 0; + msgboxW.cbSize = sizeof(msgboxW); + msgboxW.hwndOwner = msgbox->hwndOwner; + msgboxW.hInstance = msgbox->hInstance; + msgboxW.lpszText = textW.Buffer; + msgboxW.lpszCaption = captionW.Buffer; + msgboxW.dwStyle = msgbox->dwStyle; + msgboxW.lpszIcon = iconW.Buffer; + msgboxW.dwContextHelpId = msgbox->dwContextHelpId; + msgboxW.lpfnMsgBoxCallback = msgbox->lpfnMsgBoxCallback; + msgboxW.dwLanguageId = msgbox->dwLanguageId; - return DialogBoxIndirectParamA( msgbox->hInstance, template, - msgbox->hwndOwner, (DLGPROC)MSGBOX_DlgProc, - (LPARAM)msgbox ); + ret = MessageBoxIndirectW(&msgboxW); + + if (HIWORD(textW.Buffer)) RtlFreeUnicodeString(&textW); + if (HIWORD(captionW.Buffer)) RtlFreeUnicodeString(&captionW); + if (HIWORD(iconW.Buffer)) RtlFreeUnicodeString(&iconW); + return ret; } /************************************************************************** @@ -379,10 +422,16 @@ INT WINAPI MessageBoxIndirectA( LPMSGBOXPARAMSA msgbox ) */ INT WINAPI MessageBoxIndirectW( LPMSGBOXPARAMSW msgbox ) { - MSGBOXPARAMSA msgboxa; - memcpy(&msgboxa,msgbox,sizeof(msgboxa)); - msgboxa.lpszCaption = HEAP_strdupWtoA( GetProcessHeap(), 0, msgbox->lpszCaption ); - msgboxa.lpszText = HEAP_strdupWtoA( GetProcessHeap(), 0, msgbox->lpszText ); - msgboxa.lpszIcon = HEAP_strdupWtoA( GetProcessHeap(), 0, msgbox->lpszIcon ); - return MessageBoxIndirectA(&msgboxa); + LPVOID tmplate; + HRSRC hRes; + HMODULE hUser32 = GetModuleHandleA("user32.dll"); + static const WCHAR msg_box_res_nameW[] = { 'M','S','G','B','O','X',0 }; + + if (!(hRes = FindResourceW(hUser32, msg_box_res_nameW, RT_DIALOGW))) + return 0; + if (!(tmplate = (LPVOID)LoadResource(hUser32, hRes))) + return 0; + + return DialogBoxIndirectParamW(msgbox->hInstance, tmplate, msgbox->hwndOwner, + MSGBOX_DlgProc, (LPARAM)msgbox); }