diff --git a/reactos/lib/user32/windows/mdi.c b/reactos/lib/user32/windows/mdi.c index 9fb4524f3c4..0b2edd10451 100644 --- a/reactos/lib/user32/windows/mdi.c +++ b/reactos/lib/user32/windows/mdi.c @@ -264,6 +264,20 @@ static MDICLIENTINFO *get_client_info( HWND client ) #endif } +static BOOL is_close_enabled(HWND hwnd, HMENU hSysMenu) +{ + if (GetClassLongW(hwnd, GCL_STYLE) & CS_NOCLOSE) return FALSE; + + if (!hSysMenu) hSysMenu = GetSystemMenu(hwnd, FALSE); + if (hSysMenu) + { + UINT state = GetMenuState(hSysMenu, SC_CLOSE, MF_BYCOMMAND); + if (state == 0xFFFFFFFF || (state & (MF_DISABLED | MF_GRAYED))) + return FALSE; + } + return TRUE; +} + /********************************************************************** * MDI_MenuModifyItem */ @@ -1108,13 +1122,13 @@ static BOOL MDI_AugmentFrameMenu( HWND frame, HWND hChild ) if (!(hSysPopup = GetSystemMenu(hChild, FALSE))) return 0; - AppendMenuA(menu,MF_HELP | MF_BITMAP, - SC_MINIMIZE, (LPSTR)(DWORD)HBMMENU_MBAR_MINIMIZE ) ; - AppendMenuA(menu,MF_HELP | MF_BITMAP, - SC_RESTORE, (LPSTR)(DWORD)HBMMENU_MBAR_RESTORE ); - - AppendMenuA(menu,MF_HELP | MF_BITMAP, - SC_CLOSE, (LPSTR)(DWORD)HBMMENU_MBAR_CLOSE ); + AppendMenuW(menu, MF_HELP | MF_BITMAP, + SC_MINIMIZE, (LPCWSTR)HBMMENU_MBAR_MINIMIZE ) ; + AppendMenuW(menu, MF_HELP | MF_BITMAP, + SC_RESTORE, (LPCWSTR)HBMMENU_MBAR_RESTORE ); + AppendMenuW(menu, MF_HELP | MF_BITMAP, + SC_CLOSE, is_close_enabled(hChild, hSysPopup) ? + (LPCWSTR)HBMMENU_MBAR_CLOSE : (LPCWSTR)HBMMENU_MBAR_CLOSE_D ); /* The system menu is replaced by the child icon */ hIcon = (HICON)GetClassLongW(hChild, GCL_HICONSM); @@ -1612,13 +1626,14 @@ LRESULT WINAPI DefFrameProcW( HWND hwnd, HWND hwndMDIClient, if( !ci->hwndChildMaximized ) break; switch( id ) { + case SC_CLOSE: + if (!is_close_enabled(ci->hwndActiveChild, 0)) break; case SC_SIZE: case SC_MOVE: case SC_MINIMIZE: case SC_MAXIMIZE: case SC_NEXTWINDOW: case SC_PREVWINDOW: - case SC_CLOSE: case SC_RESTORE: return SendMessageW( ci->hwndChildMaximized, WM_SYSCOMMAND, wParam, lParam); @@ -2033,8 +2048,12 @@ BOOL WINAPI TranslateMDISysAccel( HWND hwndClient, LPMSG msg ) break; case VK_F4: case VK_RBUTTON: - wParam = SC_CLOSE; - break; + if (is_close_enabled(ci->hwndActiveChild, 0)) + { + wParam = SC_CLOSE; + break; + } + /* fall through */ default: return 0; }