diff --git a/reactos/include/win32k/ntuser.h b/reactos/include/win32k/ntuser.h index 303667e4617..a7276756ee4 100644 --- a/reactos/include/win32k/ntuser.h +++ b/reactos/include/win32k/ntuser.h @@ -115,10 +115,10 @@ NtUserCallHwnd( DWORD Unknown0, DWORD Unknown1); -DWORD +BOOL STDCALL NtUserCallHwndLock( - DWORD Unknown0, + HWND hWnd, DWORD Unknown1); DWORD @@ -814,11 +814,11 @@ DWORD STDCALL NtUserGetScrollBarInfo(HWND hWnd, LONG idObject, PSCROLLBARINFO psbi); -DWORD +HMENU STDCALL NtUserGetSystemMenu( - DWORD Unknown0, - DWORD Unknown1); + HWND hWnd, + BOOL bRevert); HDESK STDCALL @@ -1372,12 +1372,12 @@ STDCALL NtUserSetLogonNotifyWindow( DWORD Unknown0); -DWORD +BOOL STDCALL NtUserSetMenu( - DWORD Unknown0, - DWORD Unknown1, - DWORD Unknown2); + HWND hWnd, + HMENU hMenu, + BOOL bRepaint); BOOL STDCALL @@ -1453,11 +1453,11 @@ NtUserSetSystemCursor( DWORD Unknown0, DWORD Unknown1); -DWORD +BOOL STDCALL NtUserSetSystemMenu( - DWORD Unknown0, - DWORD Unknown1); + HWND hWnd, + HMENU hMenu); DWORD STDCALL diff --git a/reactos/lib/user32/windows/defwnd.c b/reactos/lib/user32/windows/defwnd.c index c4cdb7534c4..073ce7e8205 100644 --- a/reactos/lib/user32/windows/defwnd.c +++ b/reactos/lib/user32/windows/defwnd.c @@ -1,4 +1,4 @@ -/* $Id: defwnd.c,v 1.60 2003/08/06 11:32:17 weiden Exp $ +/* $Id: defwnd.c,v 1.61 2003/08/06 13:17:43 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS user32.dll @@ -490,7 +490,6 @@ DefWndDoPaintNC(HWND hWnd, HRGN clip) { RECT r = rect; r.bottom = rect.top + GetSystemMetrics(SM_CYMENU); -DbgPrint("Calling MenuDrawMenuBar()\n"); rect.top += MenuDrawMenuBar(hDC, &r, hWnd, FALSE); } @@ -1389,7 +1388,6 @@ DefWndNCCalcSize(HWND hWnd, RECT* Rect) Rect->bottom -= TmpRect.bottom; if (UserHasMenu(hWnd, GetWindowLong(hWnd, GWL_EXSTYLE))) { - DbgPrint("Calling MenuGetMenuBarHeight()\n"); Rect->top += MenuGetMenuBarHeight(hWnd, Rect->right - Rect->left, -TmpRect.left, diff --git a/reactos/lib/user32/windows/menu.c b/reactos/lib/user32/windows/menu.c index ee1cb738eaf..6e515558c51 100644 --- a/reactos/lib/user32/windows/menu.c +++ b/reactos/lib/user32/windows/menu.c @@ -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.18 2003/08/06 11:32:17 weiden Exp $ +/* $Id: menu.c,v 1.19 2003/08/06 13:17:43 weiden Exp $ * * PROJECT: ReactOS user32.dll * FILE: lib/user32/windows/menu.c @@ -119,6 +119,9 @@ STATIC HEAP_strdupA2W ( HANDLE hHeap, LPWSTR* ppszW, LPCSTR lpszA, UINT* NewLen #define GET_DWORD(ptr) (*(DWORD *)(ptr)) #endif +HFONT hMenuFont = NULL; +HFONT hMenuFontBold = NULL; + /********************************************************************** * MENUEX_ParseResource * @@ -241,39 +244,34 @@ static LPCSTR MENU_ParseResource( LPCSTR res, HMENU hMenu, BOOL unicode ) BOOL MenuInit(VOID) { - return TRUE; -/* NONCLIENTMETRICSW ncm; - BITMAP bm; - - hStdMnArrow = LoadBitmapA(0, MAKEINTRESOURCEA(OBM_MNARROW)); - if (hStdMnArrow == NULL) - { - return(FALSE); - } - GetObjectA(hStdMnArrow, sizeof(bm), &bm); - ArrowBitmapWidth = bm.bmWidth; - ArrowBitmapHeight = bm.bmHeight; - - if (!SystemParametersInfoW(SPI_GETNONCLIENTMETRICS, sizeof(ncm), &ncm, 0)) - { - return(FALSE); - } - - hMenuFont = CreateFontIndirect(&ncm.lfMenuFont); - if (hMenuFont == NULL) - { - return(FALSE); - } - - ncm.lfMenuFont.lfWeight = max(ncm.lfMenuFont.lfWeight + 300, 1000); + NONCLIENTMETRICSW ncm; - hMenuFontBold = CreateFontIndirect(&ncm.lfMenuFont); - if (hMenuFontBold == NULL) + /* get the menu font */ + if(!hMenuFont || !hMenuFontBold) + { + if(!SystemParametersInfoW(SPI_GETNONCLIENTMETRICS, sizeof(ncm), &ncm, 0)) { - return(FALSE); + DbgPrint("MenuInit(): SystemParametersInfoW(SPI_GETNONCLIENTMETRICS) failed!\n"); + return FALSE; } + + hMenuFont = CreateFontIndirect(&ncm.lfMenuFont); + if(hMenuFont == NULL) + { + DbgPrint("MenuInit(): CreateFontIndirect(hMenuFont) failed!\n"); + return FALSE; + } + + ncm.lfMenuFont.lfWeight = max(ncm.lfMenuFont.lfWeight + 300, 1000); + hMenuFontBold = CreateFontIndirect(&ncm.lfMenuFont); + if(hMenuFontBold == NULL) + { + DbgPrint("MenuInit(): CreateFontIndirect(hMenuFontBold) failed!\n"); + return FALSE; + } + } - return(TRUE);*/ + return TRUE; } @@ -304,6 +302,9 @@ MenuGetMenuBarHeight(HWND hWnd, ULONG MenuBarWidth, LONG OrgX, LONG OrgY) UINT MenuDrawMenuBar(HDC hDC, LPRECT Rect, HWND hWnd, BOOL Draw) { + HFONT hFontOld = SelectObject(hDC, hMenuFont); + //DrawTextA(hDC, "This is the menu bar", 19, Rect, DT_SINGLELINE); + SelectObject(hDC, hFontOld); return(GetSystemMetrics(SM_CYMENU)); /* ULONG MenuID; @@ -482,6 +483,7 @@ WINBOOL STDCALL DrawMenuBar(HWND hWnd) { UNIMPLEMENTED + /* FIXME - return NtUserCallHwndLock(hWnd, 0x55); */ return FALSE; } @@ -504,12 +506,13 @@ WINBOOL STDCALL EndMenu(VOID) { UNIMPLEMENTED; + /* FIXME - return NtUserEndMenu(); */ return FALSE; } /* - * @unimplemented + * @implemented */ HMENU STDCALL GetMenu(HWND hWnd) @@ -1051,21 +1054,13 @@ RemoveMenu( /* - * @unimplemented + * @implemented */ WINBOOL STDCALL SetMenu(HWND hWnd, HMENU hMenu) { - UNIMPLEMENTED; - /* from wine - if (IsWindowVisible(hWnd)) - { - SetWindowPos(hWnd, 0, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | - SWP_NOACTIVATE | SWP_NOZORDER | SWP_FRAMECHANGED); - } - */ - return FALSE; + return NtUserSetMenu(hWnd, hMenu, TRUE); } diff --git a/reactos/subsys/win32k/include/menu.h b/reactos/subsys/win32k/include/menu.h index b33447142eb..513b9138a31 100644 --- a/reactos/subsys/win32k/include/menu.h +++ b/reactos/subsys/win32k/include/menu.h @@ -34,6 +34,58 @@ typedef struct _MENU_OBJECT BOOL RtoL; } MENU_OBJECT, *PMENU_OBJECT; +PMENU_OBJECT FASTCALL +W32kGetMenuObject(HMENU hMenu); + +VOID FASTCALL +W32kReleaseMenuObject(PMENU_OBJECT MenuObject); + +BOOL FASTCALL +W32kFreeMenuItem(PMENU_OBJECT MenuObject, PMENU_ITEM MenuItem, + BOOL RemoveFromList, BOOL bRecurse); + +UINT FASTCALL +W32kDeleteMenuItems(PMENU_OBJECT MenuObject, BOOL bRecurse); + +BOOL FASTCALL +W32kDestroyMenuObject(PMENU_OBJECT MenuObject); + +PMENU_OBJECT FASTCALL +W32kCreateMenu(PHANDLE Handle); + +BOOL FASTCALL +W32kSetMenuFlagRtoL(PMENU_OBJECT MenuObject); + +BOOL FASTCALL +W32kSetMenuContextHelpId(PMENU_OBJECT MenuObject, DWORD dwContextHelpId); + +BOOL FASTCALL +W32kGetMenuInfo(PMENU_OBJECT MenuObject, LPMENUINFO lpmi); + +BOOL FASTCALL +W32kSetMenuInfo(PMENU_OBJECT MenuObject, LPMENUINFO lpmi); + +int FASTCALL +W32kGetMenuItemByFlag(PMENU_OBJECT MenuObject, UINT uSearchBy, UINT fFlag, PMENU_ITEM *MenuItem); + +BOOL FASTCALL +W32kSetMenuItemInfo(PMENU_OBJECT MenuObject, PMENU_ITEM MenuItem, LPCMENUITEMINFOW lpmii); + +BOOL FASTCALL +W32kInsertMenuItem(PMENU_OBJECT MenuObject, UINT uItem, WINBOOL fByPosition, + LPCMENUITEMINFOW lpmii); + +UINT FASTCALL +W32kEnableMenuItem(PMENU_OBJECT MenuObject, UINT uIDEnableItem, UINT uEnable); + +DWORD FASTCALL +W32kCheckMenuItem(PMENU_OBJECT MenuObject, UINT uIDCheckItem, UINT uCheck); + +BOOL FASTCALL +W32kSetMenuDefaultItem(PMENU_OBJECT MenuObject, UINT uItem, UINT fByPos); + + + NTSTATUS FASTCALL InitMenuImpl(VOID); diff --git a/reactos/subsys/win32k/ntuser/menu.c b/reactos/subsys/win32k/ntuser/menu.c index ec6a8dca36f..7d122f037e8 100644 --- a/reactos/subsys/win32k/ntuser/menu.c +++ b/reactos/subsys/win32k/ntuser/menu.c @@ -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/08/06 11:32:17 weiden Exp $ +/* $Id: menu.c,v 1.11 2003/08/06 13:17:44 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -884,7 +884,7 @@ BOOL STDCALL NtUserEndMenu(VOID) { UNIMPLEMENTED - + return 0; } diff --git a/reactos/subsys/win32k/ntuser/misc.c b/reactos/subsys/win32k/ntuser/misc.c index 5defd35157a..b7447b018d9 100644 --- a/reactos/subsys/win32k/ntuser/misc.c +++ b/reactos/subsys/win32k/ntuser/misc.c @@ -1,4 +1,4 @@ -/* $Id: misc.c,v 1.2 2003/08/06 11:32:17 weiden Exp $ +/* $Id: misc.c,v 1.3 2003/08/06 13:17:44 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -55,9 +55,9 @@ NtUserCallOneParam( return FALSE; } Result = WindowObject->Menu; - DbgPrint("ONEPARAM_ROUTINE_GETMENU = 0x%x\n", Result); W32kReleaseWindowObject(WindowObject); return Result; + case ONEPARAM_ROUTINE_ISWINDOWUNICODE: WindowObject = W32kGetWindowObject((HWND)Param); if(!WindowObject) diff --git a/reactos/subsys/win32k/ntuser/stubs.c b/reactos/subsys/win32k/ntuser/stubs.c index 60bf15a664d..dafa44f84b7 100644 --- a/reactos/subsys/win32k/ntuser/stubs.c +++ b/reactos/subsys/win32k/ntuser/stubs.c @@ -1,4 +1,4 @@ -/* $Id: stubs.c,v 1.23 2003/08/06 11:32:17 weiden Exp $ +/* $Id: stubs.c,v 1.24 2003/08/06 13:17:44 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -91,17 +91,6 @@ NtUserCallHwnd( return 0; } -DWORD -STDCALL -NtUserCallHwndLock( - DWORD Unknown0, - DWORD Unknown1) -{ - UNIMPLEMENTED - - return 0; -} - DWORD STDCALL NtUserCallHwndOpt( @@ -710,17 +699,6 @@ NtUserGetPriorityClipboardFormat( return 0; } -DWORD -STDCALL -NtUserGetSystemMenu( - DWORD Unknown0, - DWORD Unknown1) -{ - UNIMPLEMENTED - - return 0; -} - DWORD STDCALL NtUserGetThreadState( @@ -1055,19 +1033,6 @@ NtUserSetImeHotKey( return 0; } - -DWORD -STDCALL -NtUserSetMenu( - DWORD Unknown0, - DWORD Unknown1, - DWORD Unknown2) -{ - UNIMPLEMENTED - - return 0; -} - DWORD STDCALL NtUserSetParent( @@ -1103,17 +1068,6 @@ NtUserSetSysColors( return 0; } -DWORD -STDCALL -NtUserSetSystemMenu( - DWORD Unknown0, - DWORD Unknown1) -{ - UNIMPLEMENTED - - return 0; -} - DWORD STDCALL NtUserSetThreadState( diff --git a/reactos/subsys/win32k/ntuser/window.c b/reactos/subsys/win32k/ntuser/window.c index 1b42c640d61..3bd45e80984 100644 --- a/reactos/subsys/win32k/ntuser/window.c +++ b/reactos/subsys/win32k/ntuser/window.c @@ -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: window.c,v 1.77 2003/08/05 15:41:03 weiden Exp $ +/* $Id: window.c,v 1.78 2003/08/06 13:17:44 weiden Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -46,6 +46,7 @@ #include #include #include +#include #define NDEBUG #include @@ -2287,4 +2288,103 @@ NtUserGetLastActivePopup(HWND hWnd) } +/* + * @implemented + */ +BOOL +STDCALL +NtUserSetMenu( + HWND hWnd, + HMENU hMenu, + BOOL bRepaint) +{ + PWINDOW_OBJECT WindowObject; + PMENU_OBJECT MenuObject; + WindowObject = W32kGetWindowObject((HWND)hWnd); + if(!WindowObject) + { + SetLastWin32Error(ERROR_INVALID_HANDLE); + return FALSE; + } + + if(hMenu) + { + /* assign new menu handle */ + MenuObject = W32kGetMenuObject((HWND)hMenu); + if(!MenuObject) + { + W32kReleaseWindowObject(WindowObject); + SetLastWin32Error(ERROR_INVALID_MENU_HANDLE); + return FALSE; + } + + WindowObject->Menu = hMenu; + } + else + { + /* remove the menu handle */ + WindowObject->Menu = 0; + } + + W32kReleaseMenuObject(MenuObject); + W32kReleaseWindowObject(WindowObject); + + /* FIXME (from wine) + if(bRepaint) + { + if (IsWindowVisible(hWnd)) + SetWindowPos( hWnd, 0, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | + SWP_NOACTIVATE | SWP_NOZORDER | SWP_FRAMECHANGED ); + } + */ + + return TRUE; +} + + +/* + * @unimplemented + */ +HMENU +STDCALL +NtUserGetSystemMenu( + HWND hWnd, + BOOL bRevert) +{ + UNIMPLEMENTED + + return 0; +} + + +/* + * @unimplemented + */ +BOOL +STDCALL +NtUserSetSystemMenu( + HWND hWnd, + HMENU hMenu) +{ + UNIMPLEMENTED + + return 0; +} + + +/* + * @unimplemented + */ +BOOL +STDCALL +NtUserCallHwndLock( + HWND hWnd, + DWORD Unknown1) +{ + UNIMPLEMENTED + /* DrawMenuBar() calls it with Unknown1==0x55 */ + return 0; +} + + /* EOF */