mirror of
https://github.com/reactos/reactos.git
synced 2024-12-27 09:34:43 +00:00
Patch by Dmitry Timoshkov dmitry@baikal.ru. 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.
svn path=/trunk/; revision=16890
This commit is contained in:
parent
8fe920ee49
commit
af30e6342b
1 changed files with 29 additions and 10 deletions
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue