Convert MessageBox family functions to unicode
Dmitry Timoshkov
dmitry at baikal.ru
Sat Oct 19 07:30:45 CDT 2002
Hello.
Changelog:
Convert MessageBox family functions to unicode.
diff -u cvs/hq/wine/include/winuser.h wine/include/winuser.h
--- cvs/hq/wine/include/winuser.h Wed Oct 16 13:29:08 2002
+++ wine/include/winuser.h Sat Oct 19 20:25:50 2002
@@ -2330,7 +2330,7 @@
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 @@
LPCSTR lpszCaption;
DWORD dwStyle;
LPCSTR lpszIcon;
- DWORD dwContextHelpId;
+ DWORD_PTR dwContextHelpId;
MSGBOXCALLBACK lpfnMsgBoxCallback;
DWORD dwLanguageId;
} MSGBOXPARAMSA, *PMSGBOXPARAMSA, *LPMSGBOXPARAMSA;
@@ -2359,7 +2359,7 @@
LPCWSTR lpszCaption;
DWORD dwStyle;
LPCWSTR lpszIcon;
- DWORD dwContextHelpId;
+ DWORD_PTR dwContextHelpId;
MSGBOXCALLBACK lpfnMsgBoxCallback;
DWORD dwLanguageId;
} MSGBOXPARAMSW, *PMSGBOXPARAMSW, *LPMSGBOXPARAMSW;
diff -u cvs/hq/wine/windows/msgbox.c wine/windows/msgbox.c
--- cvs/hq/wine/windows/msgbox.c Wed Oct 16 13:29:14 2002
+++ wine/windows/msgbox.c Sat Oct 19 21:20:59 2002
@@ -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 @@
#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 @@
/* 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 @@
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 @@
/* 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 @@
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 @@
*
* 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 @@
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 @@
*/
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="<WINE-NULL>";
- 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 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 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 MessageBoxIndirectA( LPMSGBOXPARAMSA msgbox )
{
- LPVOID template;
- HRSRC hRes;
-
- WARN("Messagebox\n");
-
- if(!(hRes = FindResourceA(GetModuleHandleA("USER32"), "MSGBOX", RT_DIALOGA)))
- return 0;
- if(!(template = (LPVOID)LoadResource(GetModuleHandleA("USER32"), hRes)))
- return 0;
-
- return DialogBoxIndirectParamA( msgbox->hInstance, template,
- msgbox->hwndOwner, (DLGPROC)MSGBOX_DlgProc,
- (LPARAM)msgbox );
+ MSGBOXPARAMSW msgboxW;
+ UNICODE_STRING textW, captionW, iconW;
+ int ret;
+
+ 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;
+
+ 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;
+
+ 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 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);
}
More information about the wine-patches
mailing list