- Add the same protection to MDI_AugmentFrameMenu as one existing in

MDI_RestoreFrameMenu against repetitive calls.
- Use Windows default icon for system menu bitmap if there is no one
  supplied by a child window as Windows does.
- Use GetSystemMenu() to load system menu for a child window,
  otherwise there is no way to generate WM_SYSCOMMAND menu messages.
- Restore check in WM_SIZE MDI child handler erroneously removed
  earlier.
This commit is contained in:
Dmitry Timoshkov 2004-01-27 03:57:10 +00:00 committed by Alexandre Julliard
parent fad2971151
commit ae23340c35

View file

@ -342,24 +342,14 @@ static LRESULT MDISetMenu( HWND hwnd, HMENU hmenuFrame,
}
else
{
INT nItems;
UINT iId;
ci->hFrameMenu = GetMenu(hwndFrame);
nItems = GetMenuItemCount(ci->hFrameMenu) - 1;
iId = GetMenuItemID(ci->hFrameMenu, nItems);
if( !(iId == SC_RESTORE || iId == SC_CLOSE) )
{
/* SetMenu() may already have been called, meaning that this window
* already has its menu. But they may have done a SetMenu() on
* an MDI window, and called MDISetMenu() after the fact, meaning
* that the "if" to this "else" wouldn't catch the need to
* augment the frame menu.
*/
if( IsZoomed(ci->hwndActiveChild) )
MDI_AugmentFrameMenu( hwndFrame, ci->hwndActiveChild );
}
/* SetMenu() may already have been called, meaning that this window
* already has its menu. But they may have done a SetMenu() on
* an MDI window, and called MDISetMenu() after the fact, meaning
* that the "if" to this "else" wouldn't catch the need to
* augment the frame menu.
*/
if( IsZoomed(ci->hwndActiveChild) )
MDI_AugmentFrameMenu( hwndFrame, ci->hwndActiveChild );
}
return 0;
@ -815,22 +805,23 @@ static void MDITile( HWND client, MDICLIENTINFO *ci, WPARAM wParam )
static BOOL MDI_AugmentFrameMenu( HWND frame, HWND hChild )
{
HMENU menu = GetMenu( frame );
WND* child = WIN_FindWndPtr(hChild);
HMENU hSysPopup = 0;
HBITMAP hSysMenuBitmap = 0;
HBITMAP hSysMenuBitmap = 0;
INT nItems;
UINT iId;
TRACE("frame %p,child %p\n",frame,hChild);
if( !menu || !child->hSysMenu )
{
WIN_ReleaseWndPtr(child);
if( !menu ) return 0;
/* if the system buttons already exist do not add them again */
nItems = GetMenuItemCount(menu) - 1;
iId = GetMenuItemID(menu,nItems) ;
if (iId == SC_RESTORE || iId == SC_CLOSE)
return 0;
}
WIN_ReleaseWndPtr(child);
/* create a copy of sysmenu popup and insert it into frame menu bar */
if (!(hSysPopup = LoadMenuA(GetModuleHandleA("USER32"), "SYSMENU")))
if (!(hSysPopup = GetSystemMenu(hChild, FALSE)))
return 0;
AppendMenuA(menu,MF_HELP | MF_BITMAP,
@ -849,9 +840,11 @@ static BOOL MDI_AugmentFrameMenu( HWND frame, HWND hChild )
if(TWEAK_WineLook > WIN31_LOOK)
{
HICON hIcon = (HICON)GetClassLongA(hChild, GCL_HICONSM);
HICON hIcon = (HICON)GetClassLongW(hChild, GCL_HICONSM);
if (!hIcon)
hIcon = (HICON)GetClassLongA(hChild, GCL_HICON);
hIcon = (HICON)GetClassLongW(hChild, GCL_HICON);
if (!hIcon)
hIcon = LoadImageW(0, MAKEINTRESOURCEW(IDI_WINLOGO), IMAGE_ICON, 0, 0, LR_DEFAULTCOLOR);
if (hIcon)
{
HDC hMemDC;
@ -912,6 +905,7 @@ static BOOL MDI_RestoreFrameMenu( HWND frame, HWND hChild )
TRACE("frame %p,child %p,nIt=%d,iId=%d\n",frame,hChild,nItems,iId);
/* if there is no system buttons then nothing to do */
if(!(iId == SC_RESTORE || iId == SC_CLOSE) )
return 0;
@ -1512,7 +1506,7 @@ LRESULT WINAPI DefMDIChildProcW( HWND hwnd, UINT message,
break;
case WM_SIZE:
if( wParam != SIZE_MAXIMIZED )
if( hwnd == ci->hwndActiveChild && wParam != SIZE_MAXIMIZED )
{
MDI_RestoreFrameMenu( GetParent(client), hwnd );
MDI_UpdateFrameText( GetParent(client), client, TRUE, NULL );