mirror of
https://github.com/reactos/reactos.git
synced 2024-12-28 10:04:49 +00:00
Added Messagebox support.
Patch by Thomas Weidenmueller. svn path=/trunk/; revision=5301
This commit is contained in:
parent
70d7e57a1d
commit
1acf351783
7 changed files with 517 additions and 54 deletions
|
@ -4919,7 +4919,6 @@ GetScrollRange(
|
|||
LPINT lpMinPos,
|
||||
LPINT lpMaxPos);
|
||||
|
||||
|
||||
WINBOOL
|
||||
STDCALL
|
||||
ShowScrollBar(
|
||||
|
@ -4927,7 +4926,6 @@ ShowScrollBar(
|
|||
int wBar,
|
||||
WINBOOL bShow);
|
||||
|
||||
|
||||
WINBOOL
|
||||
STDCALL
|
||||
EnableScrollBar(
|
||||
|
@ -4935,11 +4933,12 @@ EnableScrollBar(
|
|||
UINT wSBflags,
|
||||
UINT wArrows);
|
||||
|
||||
BOOL STDCALL GetScrollBarInfo(
|
||||
BOOL
|
||||
STDCALL
|
||||
GetScrollBarInfo(
|
||||
HWND hwnd,
|
||||
LONG idObject,
|
||||
PSCROLLBARINFO psbi
|
||||
);
|
||||
PSCROLLBARINFO psbi);
|
||||
|
||||
WINBOOL
|
||||
STDCALL
|
||||
|
@ -4947,14 +4946,12 @@ GetClientRect(
|
|||
HWND hWnd,
|
||||
LPRECT lpRect);
|
||||
|
||||
|
||||
WINBOOL
|
||||
STDCALL
|
||||
GetWindowRect(
|
||||
HWND hWnd,
|
||||
LPRECT lpRect);
|
||||
|
||||
|
||||
WINBOOL
|
||||
STDCALL
|
||||
AdjustWindowRect(
|
||||
|
@ -4962,7 +4959,6 @@ AdjustWindowRect(
|
|||
DWORD dwStyle,
|
||||
WINBOOL bMenu);
|
||||
|
||||
|
||||
WINBOOL
|
||||
STDCALL
|
||||
AdjustWindowRectEx(
|
||||
|
@ -4973,33 +4969,36 @@ AdjustWindowRectEx(
|
|||
|
||||
WINBOOL
|
||||
STDCALL
|
||||
SetWindowContextHelpId(HWND, DWORD);
|
||||
SetWindowContextHelpId(
|
||||
HWND hwnd,
|
||||
DWORD dwContextHelpId);
|
||||
|
||||
DWORD
|
||||
STDCALL
|
||||
GetWindowContextHelpId(HWND);
|
||||
GetWindowContextHelpId(
|
||||
HWND hwnd);
|
||||
|
||||
WINBOOL
|
||||
STDCALL
|
||||
SetMenuContextHelpId(HMENU, DWORD);
|
||||
SetMenuContextHelpId(
|
||||
HMENU hmenu,
|
||||
DWORD dwContextHelpId);
|
||||
|
||||
DWORD
|
||||
STDCALL
|
||||
GetMenuContextHelpId(HMENU);
|
||||
|
||||
GetMenuContextHelpId(
|
||||
HMENU hmenu);
|
||||
|
||||
WINBOOL
|
||||
STDCALL
|
||||
MessageBeep(
|
||||
UINT uType);
|
||||
|
||||
|
||||
int
|
||||
STDCALL
|
||||
ShowCursor(
|
||||
WINBOOL bShow);
|
||||
|
||||
|
||||
WINBOOL
|
||||
STDCALL
|
||||
SetCursorPos(
|
||||
|
|
|
@ -291,7 +291,7 @@ GetListBoxInfo@4
|
|||
GetMenu@4
|
||||
GetMenuBarInfo@16
|
||||
GetMenuCheckMarkDimensions@0
|
||||
;GetMenuContextHelpId
|
||||
GetMenuContextHelpId@4
|
||||
GetMenuDefaultItem@12
|
||||
GetMenuInfo@8
|
||||
GetMenuItemCount@4
|
||||
|
@ -345,7 +345,7 @@ GetUserObjectInformationW@20
|
|||
;GetUserObjectSecurity
|
||||
;GetWinStationInfo
|
||||
GetWindow@8
|
||||
;GetWindowContextHelpId
|
||||
GetWindowContextHelpId@4
|
||||
GetWindowDC@4
|
||||
GetWindowInfo@8
|
||||
GetWindowLongA@8
|
||||
|
@ -574,7 +574,7 @@ SetLastErrorEx@8
|
|||
SetLayeredWindowAttributes@16
|
||||
;SetLogonNotifyWindow
|
||||
SetMenu@8
|
||||
;SetMenuContextHelpId
|
||||
SetMenuContextHelpId@8
|
||||
SetMenuDefaultItem@12
|
||||
SetMenuInfo@8
|
||||
SetMenuItemBitmaps@20
|
||||
|
@ -607,7 +607,7 @@ SetUserObjectInformationA@16
|
|||
SetUserObjectInformationW@16
|
||||
;SetUserObjectSecurity
|
||||
;SetWinEventHook
|
||||
;SetWindowContextHelpId
|
||||
SetWindowContextHelpId@8
|
||||
SetWindowLongA@12
|
||||
SetWindowLongW@12
|
||||
SetWindowPlacement@8
|
||||
|
|
|
@ -291,7 +291,7 @@ GetListBoxInfo=GetListBoxInfo@4
|
|||
GetMenu=GetMenu@4
|
||||
GetMenuBarInfo=GetMenuBarInfo@16
|
||||
GetMenuCheckMarkDimensions=GetMenuCheckMarkDimensions@0
|
||||
;GetMenuContextHelpId
|
||||
GetMenuContextHelpId=GetMenuContextHelpId@4
|
||||
GetMenuDefaultItem=GetMenuDefaultItem@12
|
||||
GetMenuInfo=GetMenuInfo@8
|
||||
GetMenuItemCount=GetMenuItemCount@4
|
||||
|
@ -345,7 +345,7 @@ GetUserObjectInformationW=GetUserObjectInformationW@20
|
|||
;GetUserObjectSecurity
|
||||
;GetWinStationInfo
|
||||
GetWindow=GetWindow@8
|
||||
;GetWindowContextHelpId
|
||||
GetWindowContextHelpId=GetWindowContextHelpId@4
|
||||
GetWindowDC=GetWindowDC@4
|
||||
GetWindowInfo=GetWindowInfo@8
|
||||
GetWindowLongA=GetWindowLongA@8
|
||||
|
@ -574,7 +574,7 @@ SetLastErrorEx=SetLastErrorEx@8
|
|||
SetLayeredWindowAttributes=SetLayeredWindowAttributes@16
|
||||
;SetLogonNotifyWindow
|
||||
SetMenu=SetMenu@8
|
||||
;SetMenuContextHelpId
|
||||
SetMenuContextHelpId=SetMenuContextHelpId@8
|
||||
SetMenuDefaultItem=SetMenuDefaultItem@12
|
||||
SetMenuInfo=SetMenuInfo@8
|
||||
SetMenuItemBitmaps=SetMenuItemBitmaps@20
|
||||
|
@ -607,7 +607,7 @@ SetUserObjectInformationA=SetUserObjectInformationA@16
|
|||
SetUserObjectInformationW=SetUserObjectInformationW@16
|
||||
;SetUserObjectSecurity
|
||||
;SetWinEventHook
|
||||
;SetWindowContextHelpId
|
||||
SetWindowContextHelpId=SetWindowContextHelpId@8
|
||||
SetWindowLongA=SetWindowLongA@12
|
||||
SetWindowLongW=SetWindowLongW@12
|
||||
SetWindowPlacement=SetWindowPlacement@8
|
||||
|
|
|
@ -16,10 +16,10 @@
|
|||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
/* $Id: dialog.c,v 1.13 2003/07/27 17:48:43 ekohl Exp $
|
||||
/* $Id: dialog.c,v 1.14 2003/07/28 08:09:51 ekohl Exp $
|
||||
*
|
||||
* PROJECT: ReactOS user32.dll
|
||||
* FILE: lib/user32/windows/input.c
|
||||
* FILE: lib/user32/windows/dialog.c
|
||||
* PURPOSE: Input
|
||||
* PROGRAMMER: Casper S. Hornstrup (chorns@users.sourceforge.net)
|
||||
* Thomas Weidenmueller (w3seek@users.sourceforge.net)
|
||||
|
@ -777,9 +777,8 @@ static HWND DIALOG_CreateIndirect( HINSTANCE hInst, LPCVOID dlgTemplate,
|
|||
return 0;
|
||||
}
|
||||
|
||||
/* FIXME: implement SetWindowContextHelpId and enable following line
|
||||
if (template.helpId) SetWindowContextHelpId( hwnd, template.helpId );
|
||||
*/
|
||||
if (template.helpId)
|
||||
SetWindowContextHelpId( hwnd, template.helpId );
|
||||
|
||||
if (unicode)
|
||||
{
|
||||
|
|
|
@ -16,7 +16,7 @@
|
|||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
/* $Id: menu.c,v 1.10 2003/07/27 11:54:41 dwelch Exp $
|
||||
/* $Id: menu.c,v 1.11 2003/07/28 08:09:51 ekohl Exp $
|
||||
*
|
||||
* PROJECT: ReactOS user32.dll
|
||||
* FILE: lib/user32/windows/menu.c
|
||||
|
@ -1115,6 +1115,32 @@ TrackPopupMenuEx(
|
|||
return FALSE;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* @unimplemented
|
||||
*/
|
||||
WINBOOL
|
||||
STDCALL
|
||||
SetMenuContextHelpId(HMENU hmenu,
|
||||
DWORD dwContextHelpId)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
return(FALSE);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* @unimplemented
|
||||
*/
|
||||
DWORD
|
||||
STDCALL
|
||||
GetMenuContextHelpId(HMENU hmenu)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
return(0);
|
||||
}
|
||||
|
||||
|
||||
static BOOL
|
||||
MenuIsBitmapItem(ULONG TypeData)
|
||||
{
|
||||
|
|
|
@ -16,24 +16,366 @@
|
|||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
/* $Id: messagebox.c,v 1.7 2003/07/10 21:04:32 chorns Exp $
|
||||
/* $Id: messagebox.c,v 1.8 2003/07/28 08:09:51 ekohl Exp $
|
||||
*
|
||||
* PROJECT: ReactOS user32.dll
|
||||
* FILE: lib/user32/windows/input.c
|
||||
* FILE: lib/user32/windows/messagebox.c
|
||||
* PURPOSE: Input
|
||||
* PROGRAMMER: Casper S. Hornstrup (chorns@users.sourceforge.net)
|
||||
* Thomas Weidenmueller (w3seek@users.sourceforge.net)
|
||||
* UPDATE HISTORY:
|
||||
* 07-27-2003 Code ported from wine
|
||||
* 09-05-2001 CSH Created
|
||||
*/
|
||||
|
||||
/* INCLUDES ******************************************************************/
|
||||
|
||||
#include <windows.h>
|
||||
#include <messages.h>
|
||||
#include <user32.h>
|
||||
#include <string.h>
|
||||
#include <ntos/rtl.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <debug.h>
|
||||
|
||||
|
||||
/* DEFINES *******************************************************************/
|
||||
|
||||
#define MSGBOX_IDICON 1088
|
||||
#define MSGBOX_IDTEXT 100
|
||||
#define IDS_ERROR 2
|
||||
|
||||
#define RT_DIALOGA MAKEINTRESOURCEA(5)
|
||||
#define RT_DIALOGW MAKEINTRESOURCEW(5)
|
||||
#define IDI_HANDA MAKEINTRESOURCEA(32513)
|
||||
#define IDI_HANDW MAKEINTRESOURCEW(32513)
|
||||
#define IDI_QUESTIONA MAKEINTRESOURCEA(32514)
|
||||
#define IDI_QUESTIONW MAKEINTRESOURCEW(32514)
|
||||
#define IDI_EXCLAMATIONA MAKEINTRESOURCEA(32515)
|
||||
#define IDI_EXCLAMATIONW MAKEINTRESOURCEW(32515)
|
||||
#define IDI_ASTERISKA MAKEINTRESOURCEA(32516)
|
||||
#define IDI_ASTERISKW MAKEINTRESOURCEW(32516)
|
||||
#define IDI_WINLOGOA MAKEINTRESOURCEA(32517)
|
||||
#define IDI_WINLOGOW MAKEINTRESOURCEW(32517)
|
||||
|
||||
#ifndef MB_TYPEMASK
|
||||
#define MB_TYPEMASK 0x0000000F
|
||||
#endif
|
||||
#ifndef MB_ICONMASK
|
||||
#define MB_ICONMASK 0x000000F0
|
||||
#endif
|
||||
#ifndef MB_DEFMASK
|
||||
#define MB_DEFMASK 0x00000F00
|
||||
#endif
|
||||
|
||||
|
||||
/* FUNCTIONS *****************************************************************/
|
||||
|
||||
static HFONT MSGBOX_OnInit(HWND hwnd, LPMSGBOXPARAMS lpmb)
|
||||
{
|
||||
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;
|
||||
LPCWSTR lpszText;
|
||||
WCHAR buf[256];
|
||||
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++)
|
||||
SendDlgItemMessageW (hwnd, i, WM_SETFONT, (WPARAM)hFont, 0);
|
||||
/* set text font */
|
||||
SendDlgItemMessageW (hwnd, MSGBOX_IDTEXT, WM_SETFONT, (WPARAM)hFont, 0);
|
||||
|
||||
if (HIWORD(lpmb->lpszCaption))
|
||||
{
|
||||
SetWindowTextW(hwnd, (LPCWSTR)lpmb->lpszCaption);
|
||||
}
|
||||
else
|
||||
{
|
||||
UINT res_id = LOWORD((UINT)lpmb->lpszCaption); /* FIXME: (UINT) ??? */
|
||||
if (res_id)
|
||||
{
|
||||
if (LoadStringW(lpmb->hInstance, res_id, buf, 256))
|
||||
SetWindowTextW(hwnd, buf);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (LoadStringW(GetModuleHandleA("user32.dll"), IDS_ERROR, buf, 256))
|
||||
SetWindowTextW(hwnd, buf);
|
||||
}
|
||||
}
|
||||
if (HIWORD(lpmb->lpszText))
|
||||
{
|
||||
lpszText = (LPCWSTR)lpmb->lpszText;
|
||||
}
|
||||
else
|
||||
{
|
||||
lpszText = buf;
|
||||
if (!LoadStringW(lpmb->hInstance, LOWORD((UINT)lpmb->lpszText), buf, 256)) /* FIXME: (UINT) ??? */
|
||||
*buf = 0; /* FIXME ?? */
|
||||
}
|
||||
SetWindowTextW(GetDlgItem(hwnd, MSGBOX_IDTEXT), lpszText);
|
||||
|
||||
/* Hide not selected buttons */
|
||||
switch(lpmb->dwStyle & MB_TYPEMASK) {
|
||||
case MB_OK:
|
||||
ShowWindow(GetDlgItem(hwnd, IDCANCEL), SW_HIDE);
|
||||
/* fall through */
|
||||
case MB_OKCANCEL:
|
||||
ShowWindow(GetDlgItem(hwnd, IDABORT), SW_HIDE);
|
||||
ShowWindow(GetDlgItem(hwnd, IDRETRY), SW_HIDE);
|
||||
ShowWindow(GetDlgItem(hwnd, IDIGNORE), SW_HIDE);
|
||||
ShowWindow(GetDlgItem(hwnd, IDYES), SW_HIDE);
|
||||
ShowWindow(GetDlgItem(hwnd, IDNO), SW_HIDE);
|
||||
break;
|
||||
case MB_ABORTRETRYIGNORE:
|
||||
ShowWindow(GetDlgItem(hwnd, IDOK), SW_HIDE);
|
||||
ShowWindow(GetDlgItem(hwnd, IDCANCEL), SW_HIDE);
|
||||
ShowWindow(GetDlgItem(hwnd, IDYES), SW_HIDE);
|
||||
ShowWindow(GetDlgItem(hwnd, IDNO), SW_HIDE);
|
||||
break;
|
||||
case MB_YESNO:
|
||||
ShowWindow(GetDlgItem(hwnd, IDCANCEL), SW_HIDE);
|
||||
/* fall through */
|
||||
case MB_YESNOCANCEL:
|
||||
ShowWindow(GetDlgItem(hwnd, IDOK), SW_HIDE);
|
||||
ShowWindow(GetDlgItem(hwnd, IDABORT), SW_HIDE);
|
||||
ShowWindow(GetDlgItem(hwnd, IDRETRY), SW_HIDE);
|
||||
ShowWindow(GetDlgItem(hwnd, IDIGNORE), SW_HIDE);
|
||||
break;
|
||||
case MB_RETRYCANCEL:
|
||||
ShowWindow(GetDlgItem(hwnd, IDOK), SW_HIDE);
|
||||
ShowWindow(GetDlgItem(hwnd, IDABORT), SW_HIDE);
|
||||
ShowWindow(GetDlgItem(hwnd, IDIGNORE), SW_HIDE);
|
||||
ShowWindow(GetDlgItem(hwnd, IDYES), SW_HIDE);
|
||||
ShowWindow(GetDlgItem(hwnd, IDNO), SW_HIDE);
|
||||
break;
|
||||
}
|
||||
/* Set the icon */
|
||||
switch(lpmb->dwStyle & MB_ICONMASK) {
|
||||
case MB_ICONEXCLAMATION:
|
||||
SendDlgItemMessageW(hwnd, 0x0440, STM_SETICON,
|
||||
(WPARAM)LoadIconW(0, IDI_EXCLAMATIONW), 0);
|
||||
break;
|
||||
case MB_ICONQUESTION:
|
||||
SendDlgItemMessageW(hwnd, 0x0440, STM_SETICON,
|
||||
(WPARAM)LoadIconW(0, IDI_QUESTIONW), 0);
|
||||
break;
|
||||
case MB_ICONASTERISK:
|
||||
SendDlgItemMessageW(hwnd, 0x0440, STM_SETICON,
|
||||
(WPARAM)LoadIconW(0, IDI_ASTERISKW), 0);
|
||||
break;
|
||||
case MB_ICONHAND:
|
||||
SendDlgItemMessageW(hwnd, 0x0440, STM_SETICON,
|
||||
(WPARAM)LoadIconW(0, IDI_HANDW), 0);
|
||||
break;
|
||||
case MB_USERICON:
|
||||
SendDlgItemMessageW(hwnd, 0x0440, STM_SETICON,
|
||||
(WPARAM)LoadIconW(lpmb->hInstance, (LPCWSTR)lpmb->lpszIcon), 0);
|
||||
break;
|
||||
default:
|
||||
/* By default, Windows 95/98/NT do not associate an icon to message boxes.
|
||||
* So wine should do the same.
|
||||
*/
|
||||
break;
|
||||
}
|
||||
|
||||
/* Position everything */
|
||||
GetWindowRect(hwnd, &rect);
|
||||
borheight = rect.bottom - rect.top;
|
||||
borwidth = rect.right - rect.left;
|
||||
GetClientRect(hwnd, &rect);
|
||||
borheight -= rect.bottom - rect.top;
|
||||
borwidth -= rect.right - rect.left;
|
||||
|
||||
/* Get the icon height */
|
||||
GetWindowRect(GetDlgItem(hwnd, MSGBOX_IDICON), &rect);
|
||||
MapWindowPoints(0, hwnd, (LPPOINT)&rect, 2);
|
||||
if (!(lpmb->dwStyle & MB_ICONMASK))
|
||||
{
|
||||
rect.bottom = rect.top;
|
||||
rect.right = rect.left;
|
||||
}
|
||||
iheight = rect.bottom - rect.top;
|
||||
ileft = rect.left;
|
||||
iwidth = rect.right - ileft;
|
||||
|
||||
hdc = GetDC(hwnd);
|
||||
if (hFont)
|
||||
hPrevFont = SelectObject(hdc, hFont);
|
||||
|
||||
/* Get the number of visible buttons and their size */
|
||||
bh = bw = 1; /* Minimum button sizes */
|
||||
for (buttons = 0, i = 1; i < 8; i++)
|
||||
{
|
||||
hItem = GetDlgItem(hwnd, i);
|
||||
if (GetWindowLongW(hItem, GWL_STYLE) & WS_VISIBLE)
|
||||
{
|
||||
WCHAR buttonText[1024];
|
||||
int w, h;
|
||||
buttons++;
|
||||
if (GetWindowTextW(hItem, buttonText, 1024))
|
||||
{
|
||||
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;
|
||||
if (w > bw)
|
||||
bw = w ;
|
||||
}
|
||||
}
|
||||
}
|
||||
bw = max(bw, bh * 2);
|
||||
/* Button white space */
|
||||
bh = bh * 2;
|
||||
bw = bw * 2;
|
||||
bspace = bw/3; /* Space between buttons */
|
||||
|
||||
/* Get the text size */
|
||||
GetClientRect(GetDlgItem(hwnd, MSGBOX_IDTEXT), &rect);
|
||||
rect.top = rect.left = rect.bottom = 0;
|
||||
DrawTextW( hdc, lpszText, -1, &rect,
|
||||
DT_LEFT | DT_EXPANDTABS | DT_WORDBREAK | DT_CALCRECT);
|
||||
/* Min text width corresponds to space for the buttons */
|
||||
tleft = ileft;
|
||||
if (iwidth)
|
||||
tleft += ileft + iwidth;
|
||||
twidth = max((bw + bspace) * buttons + bspace - tleft, rect.right);
|
||||
theight = rect.bottom;
|
||||
|
||||
if (hFont)
|
||||
SelectObject(hdc, hPrevFont);
|
||||
ReleaseDC(hItem, hdc);
|
||||
|
||||
tiheight = 16 + max(iheight, theight);
|
||||
wwidth = tleft + twidth + ileft + borwidth;
|
||||
wheight = 8 + tiheight + bh + borheight;
|
||||
|
||||
/* Resize the window */
|
||||
SetWindowPos(hwnd, 0, 0, 0, wwidth, wheight,
|
||||
SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE | SWP_NOREDRAW);
|
||||
|
||||
/* Position the icon */
|
||||
SetWindowPos(GetDlgItem(hwnd, MSGBOX_IDICON), 0, ileft, (tiheight - iheight) / 2, 0, 0,
|
||||
SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE | SWP_NOREDRAW);
|
||||
|
||||
/* Position the text */
|
||||
SetWindowPos(GetDlgItem(hwnd, MSGBOX_IDTEXT), 0, tleft, (tiheight - theight) / 2, twidth, theight,
|
||||
SWP_NOZORDER | SWP_NOACTIVATE | SWP_NOREDRAW);
|
||||
|
||||
/* Position the buttons */
|
||||
bpos = (wwidth - (bw + bspace) * buttons + bspace) / 2;
|
||||
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 (GetWindowLongW(hItem, GWL_STYLE) & WS_VISIBLE)
|
||||
{
|
||||
if (buttons++ == ((lpmb->dwStyle & MB_DEFMASK) >> 8))
|
||||
{
|
||||
SetFocus(hItem);
|
||||
SendMessageW( hItem, BM_SETSTYLE, BS_DEFPUSHBUTTON, TRUE );
|
||||
}
|
||||
SetWindowPos(hItem, 0, bpos, tiheight, bw, bh,
|
||||
SWP_NOZORDER|SWP_NOACTIVATE|SWP_NOREDRAW);
|
||||
bpos += bw + bspace;
|
||||
}
|
||||
}
|
||||
|
||||
/* handle modal MessageBoxes */
|
||||
if (lpmb->dwStyle & (MB_TASKMODAL|MB_SYSTEMMODAL))
|
||||
{
|
||||
DbgPrint("%s modal msgbox ! Not modal yet.\n",
|
||||
lpmb->dwStyle & MB_TASKMODAL ? "task" : "system");
|
||||
/* Probably do EnumTaskWindows etc. here for TASKMODAL
|
||||
* and work your way up to the top - I'm lazy (HWND_TOP) */
|
||||
SetWindowPos(hwnd, HWND_TOP, 0, 0, 0, 0,
|
||||
SWP_NOSIZE | SWP_NOMOVE);
|
||||
if (lpmb->dwStyle & MB_TASKMODAL)
|
||||
/* at least MB_TASKMODAL seems to imply a ShowWindow */
|
||||
ShowWindow(hwnd, SW_SHOW);
|
||||
}
|
||||
|
||||
if (lpmb->dwStyle & MB_APPLMODAL)
|
||||
DbgPrint("app modal msgbox ! Not modal yet.\n");
|
||||
|
||||
return hFont;
|
||||
}
|
||||
|
||||
|
||||
/**************************************************************************
|
||||
* MSGBOX_DlgProc
|
||||
*
|
||||
* Dialog procedure for message boxes.
|
||||
*/
|
||||
static INT_PTR CALLBACK MSGBOX_DlgProc( HWND hwnd, UINT message,
|
||||
WPARAM wParam, LPARAM lParam )
|
||||
{
|
||||
HFONT hFont;
|
||||
|
||||
switch(message)
|
||||
{
|
||||
case WM_INITDIALOG:
|
||||
{
|
||||
LPMSGBOXPARAMS mbp = (LPMSGBOXPARAMS)lParam;
|
||||
SetWindowContextHelpId(hwnd, mbp->dwContextHelpId);
|
||||
hFont = MSGBOX_OnInit(hwnd, mbp);
|
||||
SetPropA(hwnd, "ROS_MSGBOX_HFONT", (HANDLE)hFont);
|
||||
SetPropA(hwnd, "ROS_MSGBOX_HELPCALLBACK", (HANDLE)mbp->lpfnMsgBoxCallback);
|
||||
break;
|
||||
}
|
||||
|
||||
case WM_COMMAND:
|
||||
switch (LOWORD(wParam))
|
||||
{
|
||||
case IDOK:
|
||||
case IDCANCEL:
|
||||
case IDABORT:
|
||||
case IDRETRY:
|
||||
case IDIGNORE:
|
||||
case IDYES:
|
||||
case IDNO:
|
||||
hFont = GetPropA(hwnd, "ROS_MSGBOX_HFONT");
|
||||
EndDialog(hwnd, wParam);
|
||||
if (hFont)
|
||||
DeleteObject(hFont);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
case WM_HELP:
|
||||
{
|
||||
MSGBOXCALLBACK callback = (MSGBOXCALLBACK)GetPropA(hwnd, "ROS_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 */
|
||||
DbgPrint("Message number 0x%04x is being ignored.\n", message);
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* @implemented
|
||||
*/
|
||||
|
@ -45,12 +387,12 @@ MessageBoxA(
|
|||
LPCSTR lpCaption,
|
||||
UINT uType)
|
||||
{
|
||||
return MessageBoxExA(hWnd, lpText, lpCaption, uType, 0);
|
||||
return MessageBoxExA(hWnd, lpText, lpCaption, uType, LANG_NEUTRAL);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* @unimplemented
|
||||
* @implemented
|
||||
*/
|
||||
int
|
||||
STDCALL
|
||||
|
@ -61,13 +403,25 @@ MessageBoxExA(
|
|||
UINT uType,
|
||||
WORD wLanguageId)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
return 0;
|
||||
MSGBOXPARAMS msgbox;
|
||||
|
||||
msgbox.cbSize = sizeof(msgbox);
|
||||
msgbox.hwndOwner = hWnd;
|
||||
msgbox.hInstance = 0;
|
||||
msgbox.lpszText = lpText;
|
||||
msgbox.lpszCaption = lpCaption;
|
||||
msgbox.dwStyle = uType;
|
||||
msgbox.lpszIcon = NULL;
|
||||
msgbox.dwContextHelpId = 0;
|
||||
msgbox.lpfnMsgBoxCallback = NULL;
|
||||
msgbox.dwLanguageId = wLanguageId;
|
||||
|
||||
return MessageBoxIndirectA(&msgbox);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* @unimplemented
|
||||
* @implemented
|
||||
*/
|
||||
int
|
||||
STDCALL
|
||||
|
@ -78,39 +432,102 @@ MessageBoxExW(
|
|||
UINT uType,
|
||||
WORD wLanguageId)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
return 0;
|
||||
MSGBOXPARAMS msgbox;
|
||||
|
||||
msgbox.cbSize = sizeof(msgbox);
|
||||
msgbox.hwndOwner = hWnd;
|
||||
msgbox.hInstance = 0;
|
||||
msgbox.lpszText = (LPCSTR)lpText;
|
||||
msgbox.lpszCaption =(LPCSTR) lpCaption;
|
||||
msgbox.dwStyle = uType;
|
||||
msgbox.lpszIcon = NULL;
|
||||
msgbox.dwContextHelpId = 0;
|
||||
msgbox.lpfnMsgBoxCallback = NULL;
|
||||
msgbox.dwLanguageId = wLanguageId;
|
||||
|
||||
return MessageBoxIndirectW(&msgbox);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* @unimplemented
|
||||
* @implemented
|
||||
*/
|
||||
int
|
||||
STDCALL
|
||||
MessageBoxIndirectA(
|
||||
CONST LPMSGBOXPARAMS lpMsgBoxParams)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
return 0;
|
||||
MSGBOXPARAMS msgboxW;
|
||||
UNICODE_STRING textW, captionW, iconW;
|
||||
int ret;
|
||||
|
||||
if (HIWORD((UINT)lpMsgBoxParams->lpszText))
|
||||
RtlCreateUnicodeStringFromAsciiz(&textW, (PCSZ)lpMsgBoxParams->lpszText);
|
||||
else
|
||||
textW.Buffer = (LPWSTR)lpMsgBoxParams->lpszText;
|
||||
|
||||
if (HIWORD((UINT)lpMsgBoxParams->lpszCaption))
|
||||
RtlCreateUnicodeStringFromAsciiz(&captionW, (PCSZ)lpMsgBoxParams->lpszCaption);
|
||||
else
|
||||
captionW.Buffer = (LPWSTR)lpMsgBoxParams->lpszCaption;
|
||||
|
||||
if (HIWORD((UINT)lpMsgBoxParams->lpszIcon))
|
||||
RtlCreateUnicodeStringFromAsciiz(&iconW, (PCSZ)lpMsgBoxParams->lpszIcon);
|
||||
else
|
||||
iconW.Buffer = (LPWSTR)lpMsgBoxParams->lpszIcon;
|
||||
|
||||
msgboxW.cbSize = sizeof(msgboxW);
|
||||
msgboxW.hwndOwner = lpMsgBoxParams->hwndOwner;
|
||||
msgboxW.hInstance = lpMsgBoxParams->hInstance;
|
||||
msgboxW.lpszText = (LPCSTR)textW.Buffer;
|
||||
msgboxW.lpszCaption = (LPCSTR)captionW.Buffer;
|
||||
msgboxW.dwStyle = lpMsgBoxParams->dwStyle;
|
||||
msgboxW.lpszIcon = (LPCSTR)iconW.Buffer;
|
||||
msgboxW.dwContextHelpId = lpMsgBoxParams->dwContextHelpId;
|
||||
msgboxW.lpfnMsgBoxCallback = lpMsgBoxParams->lpfnMsgBoxCallback;
|
||||
msgboxW.dwLanguageId = lpMsgBoxParams->dwLanguageId;
|
||||
|
||||
ret = MessageBoxIndirectW(&msgboxW);
|
||||
|
||||
if (HIWORD(textW.Buffer))
|
||||
RtlFreeUnicodeString(&textW);
|
||||
|
||||
if (HIWORD(captionW.Buffer))
|
||||
RtlFreeUnicodeString(&captionW);
|
||||
|
||||
if (HIWORD(iconW.Buffer))
|
||||
RtlFreeUnicodeString(&iconW);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* @unimplemented
|
||||
* @implemented
|
||||
*/
|
||||
int
|
||||
STDCALL
|
||||
MessageBoxIndirectW(
|
||||
CONST LPMSGBOXPARAMS lpMsgBoxParams)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
LPVOID tmplate;
|
||||
HRSRC hRes;
|
||||
HMODULE hUser32;
|
||||
|
||||
hUser32 = GetModuleHandleW(L"user32.dll");
|
||||
if (!(hRes = FindResourceExW(hUser32, RT_DIALOGW, L"MSGBOX", lpMsgBoxParams->dwLanguageId)))
|
||||
return 0;
|
||||
|
||||
if (!(tmplate = (LPVOID)LoadResource(hUser32, hRes)))
|
||||
return 0;
|
||||
|
||||
return DialogBoxIndirectParamW(lpMsgBoxParams->hInstance, tmplate, lpMsgBoxParams->hwndOwner,
|
||||
MSGBOX_DlgProc, (LPARAM)lpMsgBoxParams);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* @unimplemented
|
||||
* @implemented
|
||||
*/
|
||||
int
|
||||
STDCALL
|
||||
|
@ -120,7 +537,7 @@ MessageBoxW(
|
|||
LPCWSTR lpCaption,
|
||||
UINT uType)
|
||||
{
|
||||
return MessageBoxExW(hWnd, lpText, lpCaption, uType, 0);
|
||||
return MessageBoxExW(hWnd, lpText, lpCaption, uType, LANG_NEUTRAL);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $Id: window.c,v 1.48 2003/07/27 11:54:41 dwelch Exp $
|
||||
/* $Id: window.c,v 1.49 2003/07/28 08:09:51 ekohl Exp $
|
||||
*
|
||||
* COPYRIGHT: See COPYING in the top level directory
|
||||
* PROJECT: ReactOS user32.dll
|
||||
|
@ -1602,4 +1602,26 @@ ClientToScreen(HWND hWnd, LPPOINT lpPoint)
|
|||
return (MapWindowPoints( hWnd, NULL, lpPoint, 1 ));
|
||||
}
|
||||
|
||||
|
||||
WINBOOL
|
||||
STDCALL
|
||||
SetWindowContextHelpId(HWND hwnd,
|
||||
DWORD dwContextHelpId)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
return(FALSE);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* @unimplemented
|
||||
*/
|
||||
DWORD
|
||||
STDCALL
|
||||
GetWindowContextHelpId(HWND hwnd)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
return(0);
|
||||
}
|
||||
|
||||
/* EOF */
|
||||
|
|
Loading…
Reference in a new issue