Take into account CS_NOCLOSE window class style and SC_CLOSE system

menu item state while adding MDI system menu buttons and generating
WM_SYSCOMMAND messages.
This commit is contained in:
Dmitry Timoshkov 2005-07-25 11:08:59 +00:00 committed by Alexandre Julliard
parent a726387a07
commit bc07b2aca4
1 changed files with 29 additions and 10 deletions

View File

@ -200,6 +200,20 @@ static MDICLIENTINFO *get_client_info( HWND client )
return ret; return ret;
} }
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_GetWindow * MDI_GetWindow
* *
@ -812,13 +826,13 @@ static BOOL MDI_AugmentFrameMenu( HWND frame, HWND hChild )
if (!(hSysPopup = GetSystemMenu(hChild, FALSE))) if (!(hSysPopup = GetSystemMenu(hChild, FALSE)))
return 0; return 0;
AppendMenuA(menu,MF_HELP | MF_BITMAP, AppendMenuW(menu, MF_HELP | MF_BITMAP,
SC_MINIMIZE, (LPSTR)(DWORD)HBMMENU_MBAR_MINIMIZE ) ; SC_MINIMIZE, (LPCWSTR)HBMMENU_MBAR_MINIMIZE ) ;
AppendMenuA(menu,MF_HELP | MF_BITMAP, AppendMenuW(menu, MF_HELP | MF_BITMAP,
SC_RESTORE, (LPSTR)(DWORD)HBMMENU_MBAR_RESTORE ); SC_RESTORE, (LPCWSTR)HBMMENU_MBAR_RESTORE );
AppendMenuW(menu, MF_HELP | MF_BITMAP,
AppendMenuA(menu,MF_HELP | MF_BITMAP, SC_CLOSE, is_close_enabled(hChild, hSysPopup) ?
SC_CLOSE, (LPSTR)(DWORD)HBMMENU_MBAR_CLOSE ); (LPCWSTR)HBMMENU_MBAR_CLOSE : (LPCWSTR)HBMMENU_MBAR_CLOSE_D );
/* The system menu is replaced by the child icon */ /* The system menu is replaced by the child icon */
hIcon = (HICON)GetClassLongPtrW(hChild, GCLP_HICONSM); hIcon = (HICON)GetClassLongPtrW(hChild, GCLP_HICONSM);
@ -1306,13 +1320,14 @@ LRESULT WINAPI DefFrameProcW( HWND hwnd, HWND hwndMDIClient,
if( !IsZoomed(ci->hwndActiveChild) ) break; if( !IsZoomed(ci->hwndActiveChild) ) break;
switch( id ) switch( id )
{ {
case SC_CLOSE:
if (!is_close_enabled(ci->hwndActiveChild, 0)) break;
case SC_SIZE: case SC_SIZE:
case SC_MOVE: case SC_MOVE:
case SC_MINIMIZE: case SC_MINIMIZE:
case SC_MAXIMIZE: case SC_MAXIMIZE:
case SC_NEXTWINDOW: case SC_NEXTWINDOW:
case SC_PREVWINDOW: case SC_PREVWINDOW:
case SC_CLOSE:
case SC_RESTORE: case SC_RESTORE:
return SendMessageW( ci->hwndActiveChild, WM_SYSCOMMAND, return SendMessageW( ci->hwndActiveChild, WM_SYSCOMMAND,
wParam, lParam); wParam, lParam);
@ -1617,8 +1632,12 @@ BOOL WINAPI TranslateMDISysAccel( HWND hwndClient, LPMSG msg )
break; break;
case VK_F4: case VK_F4:
case VK_RBUTTON: case VK_RBUTTON:
wParam = SC_CLOSE; if (is_close_enabled(ci->hwndActiveChild, 0))
break; {
wParam = SC_CLOSE;
break;
}
/* fall through */
default: default:
return 0; return 0;
} }