#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
*/
if (clientInfo->nActiveChildren - 1 > MDI_MOREWINDOWSLIMIT)
{
WCHAR szTmp[50];
- LoadStringW(GetModuleHandleA("USER32"), IDS_MDI_MOREWINDOWS, szTmp, sizeof(szTmp)/sizeof(szTmp[0]));
+ LoadStringW(User32Instance, IDS_MDI_MOREWINDOWS, szTmp, sizeof(szTmp)/sizeof(szTmp[0]));
AppendMenuW(clientInfo->hWindowMenu, MF_STRING, clientInfo->idFirstChild + MDI_MOREWINDOWSLIMIT, szTmp);
}
return TRUE;
if (ci->nActiveChildren == MDI_MOREWINDOWSLIMIT + 1)
{
WCHAR szTmp[50];
- LoadStringW(GetModuleHandleA("USER32"), IDS_MDI_MOREWINDOWS, szTmp, sizeof(szTmp)/sizeof(szTmp[0]));
+ LoadStringW(User32Instance, IDS_MDI_MOREWINDOWS, szTmp, sizeof(szTmp)/sizeof(szTmp[0]));
ModifyMenuW(ci->hWindowMenu,
ci->idFirstChild + MDI_MOREWINDOWSLIMIT,
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);
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);
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;
}
HRSRC hRes;
HANDLE hDlgTmpl;
- hRes = FindResourceA(GetModuleHandleA("USER32"), "MDI_MOREWINDOWS", (LPSTR)RT_DIALOG);
+ hRes = FindResourceA(User32Instance, "MDI_MOREWINDOWS", (LPSTR)RT_DIALOG);
if (hRes == 0)
return 0;
- hDlgTmpl = LoadResource(GetModuleHandleA("USER32"), hRes );
+ hDlgTmpl = LoadResource(User32Instance, hRes);
if (hDlgTmpl == 0)
return 0;
if (template == 0)
return 0;
- return (HWND) DialogBoxIndirectParamA(GetModuleHandleA("USER32"),
+ return (HWND) DialogBoxIndirectParamA(User32Instance,
(LPDLGTEMPLATE) template,
hwnd, MDI_MoreWindowsDlgProc, (LPARAM) hwnd);
}