📄 mdi.c
字号:
case WM_MDIREFRESHMENU:
return MDI_RefreshMenu( ci );
case WM_MDITILE:
ci->mdiFlags |= MDIF_NEEDUPDATE;
ShowScrollBar( hwnd, SB_BOTH, FALSE );
MDITile( hwnd, ci, wParam );
ci->mdiFlags &= ~MDIF_NEEDUPDATE;
return 0;
case WM_VSCROLL:
case WM_HSCROLL:
ci->mdiFlags |= MDIF_NEEDUPDATE;
ScrollChildren( hwnd, message, wParam, lParam );
ci->mdiFlags &= ~MDIF_NEEDUPDATE;
return 0;
case WM_SETFOCUS:
if (ci->hwndActiveChild && !IsIconic( ci->hwndActiveChild ))
SetFocus( ci->hwndActiveChild );
return 0;
case WM_NCACTIVATE:
if( ci->hwndActiveChild )
SendMessageW(ci->hwndActiveChild, message, wParam, lParam);
break;
case WM_PARENTNOTIFY:
switch (LOWORD(wParam))
{
case WM_CREATE:
if (GetWindowLongW((HWND)lParam, GWL_EXSTYLE) & WS_EX_MDICHILD)
{
ci->nTotalCreated++;
ci->nActiveChildren++;
if (!ci->child)
ci->child = HeapAlloc(GetProcessHeap(), 0, sizeof(HWND));
else
ci->child = HeapReAlloc(GetProcessHeap(), 0, ci->child, sizeof(HWND) * ci->nActiveChildren);
ci->child[ci->nActiveChildren - 1] = (HWND)lParam;
}
break;
case WM_LBUTTONDOWN:
{
HWND child;
POINT pt;
pt.x = (short)LOWORD(lParam);
pt.y = (short)HIWORD(lParam);
child = ChildWindowFromPoint(hwnd, pt);
TRACE("notification from %p (%li,%li)\n",child,pt.x,pt.y);
if( child && child != hwnd && child != ci->hwndActiveChild )
SetWindowPos(child, 0,0,0,0,0, SWP_NOSIZE | SWP_NOMOVE );
break;
}
}
return 0;
case WM_SIZE:
if( IsWindow(ci->hwndActiveChild) && IsZoomed(ci->hwndActiveChild) &&
(GetWindowLongW(ci->hwndActiveChild, GWL_STYLE) & WS_VISIBLE) )
{
RECT rect;
rect.left = 0;
rect.top = 0;
rect.right = LOWORD(lParam);
rect.bottom = HIWORD(lParam);
AdjustWindowRectEx(&rect, GetWindowLongA(ci->hwndActiveChild, GWL_STYLE),
0, GetWindowLongA(ci->hwndActiveChild, GWL_EXSTYLE) );
MoveWindow(ci->hwndActiveChild, rect.left, rect.top,
rect.right - rect.left, rect.bottom - rect.top, 1);
}
else
MDI_PostUpdate(hwnd, ci, SB_BOTH+1);
break;
case WM_MDICALCCHILDSCROLL:
if( (ci->mdiFlags & MDIF_NEEDUPDATE) && ci->sbRecalc )
{
CalcChildScroll(hwnd, ci->sbRecalc-1);
ci->sbRecalc = 0;
ci->mdiFlags &= ~MDIF_NEEDUPDATE;
}
return 0;
}
return unicode ? DefWindowProcW( hwnd, message, wParam, lParam ) :
DefWindowProcA( hwnd, message, wParam, lParam );
}
/***********************************************************************
* MDIClientWndProcA
*/
static LRESULT WINAPI MDIClientWndProcA( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam )
{
if (!IsWindow(hwnd)) return 0;
return MDIClientWndProc_common( hwnd, message, wParam, lParam, FALSE );
}
/***********************************************************************
* MDIClientWndProcW
*/
static LRESULT WINAPI MDIClientWndProcW( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam )
{
if (!IsWindow(hwnd)) return 0;
return MDIClientWndProc_common( hwnd, message, wParam, lParam, TRUE );
}
/***********************************************************************
* DefFrameProcA (USER32.@)
*/
LRESULT WINAPI DefFrameProcA( HWND hwnd, HWND hwndMDIClient,
UINT message, WPARAM wParam, LPARAM lParam)
{
if (hwndMDIClient)
{
switch (message)
{
case WM_SETTEXT:
{
DWORD len = MultiByteToWideChar( CP_ACP, 0, (LPSTR)lParam, -1, NULL, 0 );
LPWSTR text = HeapAlloc( GetProcessHeap(), 0, len * sizeof(WCHAR) );
MultiByteToWideChar( CP_ACP, 0, (LPSTR)lParam, -1, text, len );
MDI_UpdateFrameText( hwnd, hwndMDIClient, text );
HeapFree( GetProcessHeap(), 0, text );
}
return 1; /* success. FIXME: check text length */
case WM_COMMAND:
case WM_NCACTIVATE:
case WM_NEXTMENU:
case WM_SETFOCUS:
case WM_SIZE:
return DefFrameProcW( hwnd, hwndMDIClient, message, wParam, lParam );
}
}
return DefWindowProcA(hwnd, message, wParam, lParam);
}
/***********************************************************************
* DefFrameProcW (USER32.@)
*/
LRESULT WINAPI DefFrameProcW( HWND hwnd, HWND hwndMDIClient,
UINT message, WPARAM wParam, LPARAM lParam)
{
MDICLIENTINFO *ci = get_client_info( hwndMDIClient );
TRACE("%p %p %04x (%s) %08x %08lx\n", hwnd, hwndMDIClient, message, SPY_GetMsgName(message, hwnd), wParam, lParam);
if (ci)
{
switch (message)
{
case WM_COMMAND:
{
WORD id = LOWORD(wParam);
/* check for possible syscommands for maximized MDI child */
if (id < ci->idFirstChild || id >= ci->idFirstChild + ci->nActiveChildren)
{
if( (id - 0xf000) & 0xf00f ) break;
if( !IsZoomed(ci->hwndActiveChild) ) 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_RESTORE:
return SendMessageW( ci->hwndActiveChild, WM_SYSCOMMAND,
wParam, lParam);
}
}
else
{
HWND childHwnd;
if (id - ci->idFirstChild == MDI_MOREWINDOWSLIMIT)
/* User chose "More Windows..." */
childHwnd = MDI_MoreWindowsDialog(hwndMDIClient);
else
/* User chose one of the windows listed in the "Windows" menu */
childHwnd = MDI_GetChildByID(hwndMDIClient, id, ci);
if( childHwnd )
SendMessageW( hwndMDIClient, WM_MDIACTIVATE, (WPARAM)childHwnd, 0 );
}
}
break;
case WM_NCACTIVATE:
SendMessageW(hwndMDIClient, message, wParam, lParam);
break;
case WM_SETTEXT:
MDI_UpdateFrameText( hwnd, hwndMDIClient, (LPWSTR)lParam );
return 1; /* success. FIXME: check text length */
case WM_SETFOCUS:
SetFocus(hwndMDIClient);
break;
case WM_SIZE:
MoveWindow(hwndMDIClient, 0, 0, LOWORD(lParam), HIWORD(lParam), TRUE);
break;
case WM_NEXTMENU:
{
MDINEXTMENU *next_menu = (MDINEXTMENU *)lParam;
if (!IsIconic(hwnd) && ci->hwndActiveChild && !IsZoomed(ci->hwndActiveChild))
{
/* control menu is between the frame system menu and
* the first entry of menu bar */
// WND *wndPtr = WIN_GetPtr(hwnd);
if( (wParam == VK_LEFT && GetMenu(hwnd) == next_menu->hmenuIn) ||
(wParam == VK_RIGHT && GetSubMenu(GetMenu(hwnd), 0) == next_menu->hmenuIn) )
{
// WIN_ReleasePtr(wndPtr);
// wndPtr = WIN_GetPtr(ci->hwndActiveChild);
next_menu->hmenuNext = GetSubMenu(GetMenu(ci->hwndActiveChild), 0);
next_menu->hwndNext = ci->hwndActiveChild;
}
// WIN_ReleasePtr(wndPtr);
}
return 0;
}
}
}
return DefWindowProcW( hwnd, message, wParam, lParam );
}
/***********************************************************************
* DefMDIChildProcA (USER32.@)
*/
LRESULT WINAPI DefMDIChildProcA( HWND hwnd, UINT message,
WPARAM wParam, LPARAM lParam )
{
HWND client = GetParent(hwnd);
MDICLIENTINFO *ci = get_client_info( client );
TRACE("%p %04x (%s) %08x %08lx\n", hwnd, message, SPY_GetMsgName(message, hwnd), wParam, lParam);
#ifndef __REACTOS__
hwnd = WIN_GetFullHandle( hwnd );
#endif
if (!ci) return DefWindowProcA( hwnd, message, wParam, lParam );
switch (message)
{
case WM_SETTEXT:
DefWindowProcA(hwnd, message, wParam, lParam);
if( ci->hwndActiveChild == hwnd && IsZoomed(ci->hwndActiveChild) )
MDI_UpdateFrameText( GetParent(client), client, NULL );
return 1; /* success. FIXME: check text length */
case WM_GETMINMAXINFO:
case WM_MENUCHAR:
case WM_CLOSE:
case WM_SETFOCUS:
case WM_CHILDACTIVATE:
case WM_SYSCOMMAND:
case WM_SHOWWINDOW:
#ifndef __REACTOS__
case WM_SETVISIBLE:
#endif
case WM_SIZE:
case WM_NEXTMENU:
case WM_SYSCHAR:
case WM_DESTROY:
return DefMDIChildProcW( hwnd, message, wParam, lParam );
}
return DefWindowProcA(hwnd, message, wParam, lParam);
}
/***********************************************************************
* DefMDIChildProcW (USER32.@)
*/
LRESULT WINAPI DefMDIChildProcW( HWND hwnd, UINT message,
WPARAM wParam, LPARAM lParam )
{
HWND client = GetParent(hwnd);
MDICLIENTINFO *ci = get_client_info( client );
TRACE("%p %04x (%s) %08x %08lx\n", hwnd, message, SPY_GetMsgName(message, hwnd), wParam, lParam);
#ifndef __REACTOS__
hwnd = WIN_GetFullHandle( hwnd );
#endif
if (!ci) return DefWindowProcW( hwnd, message, wParam, lParam );
switch (message)
{
case WM_SETTEXT:
DefWindowProcW(hwnd, message, wParam, lParam);
if( ci->hwndActiveChild == hwnd && IsZoomed(ci->hwndActiveChild) )
MDI_UpdateFrameText( GetParent(client), client, NULL );
return 1; /* success. FIXME: check text length */
case WM_GETMINMAXINFO:
MDI_ChildGetMinMaxInfo( client, hwnd, (MINMAXINFO *)lParam );
return 0;
case WM_MENUCHAR:
return 0x00010000; /* MDI children don't have menu bars */
case WM_CLOSE:
SendMessageW( client, WM_MDIDESTROY, (WPARAM)hwnd, 0 );
return 0;
case WM_CHILDACTIVATE:
MDI_ChildActivate( client, hwnd );
return 0;
case WM_SYSCOMMAND:
switch( wParam )
{
case SC_MOVE:
if( ci->hwndActiveChild == hwnd && IsZoomed(ci->hwndActiveChild))
return 0;
break;
case SC_RESTORE:
case SC_MINIMIZE:
break;
case SC_MAXIMIZE:
if (ci->hwndActiveChild == hwnd && IsZoomed(ci->hwndActiveChild))
return SendMessageW( GetParent(client), message, wParam, lParam);
break;
case SC_NEXTWINDOW:
SendMessageW( client, WM_MDINEXT, 0, 0);
return 0;
case SC_PREVWINDOW:
SendMessageW( client, WM_MDINEXT, 0, 1);
return 0;
}
break;
case WM_SHOWWINDOW:
#ifndef __REACTOS__
case WM_SETVISIBLE:
#endif
if (IsZoomed(ci->hwndActiveChild)) ci->mdiFlags &= ~MDIF_NEEDUPDATE;
else MDI_PostUpdate(client, ci, SB_BOTH+1);
break;
case WM_SIZE:
if( hwnd == ci->hwndActiveChild )
{
if( wParam == SIZE_MAXIMIZED )
{
TRACE("maximizing child %p\n", hwnd );
MDI_AugmentFrameMenu( GetParent(client), hwnd );
}
else
MDI_RestoreFrameMenu( GetParent(client), hwnd , ci->hBmpClose);
}
MDI_UpdateFrameText( GetParent(client), client, NULL );
MDI_RefreshMenu(ci);
MDI_PostUpdate(client, ci, SB_BOTH+1);
break;
case WM_NEXTMENU:
{
MDINEXTMENU *next_menu = (MDINEXTMENU *)lParam;
HWND parent = GetParent(client);
if( wParam == VK_LEFT ) /* switch to frame system menu */
{
// WND *wndPtr = WIN_GetPtr( parent );
next_menu->hmenuNext = GetSubMenu( GetMenu(parent), 0 );
// WIN_ReleasePtr( wndPtr );
}
if( wParam == VK_RIGHT ) /* to frame menu bar */
{
next_menu->hmenuNext = GetMenu(parent);
}
next_menu->hwndNext = parent;
return 0;
}
case WM_SYSCHAR:
if (wParam == '-')
{
SendMessageW( hwnd, WM_SYSCOMMAND, (WPARAM)SC_KEYMENU, (DWORD)VK_SPACE);
return 0;
}
break;
case WM_DESTROY:
/* Remove itself from the Window menu */
MDI_RefreshMenu(ci);
break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -