extern const wxChar *wxMDIChildFrameClassName;
extern const wxChar *wxMDIChildFrameClassNameNoRedraw;
-extern wxWindow *wxWndHook; // from window.cpp
-
extern void wxAssociateWinWithHandle(HWND hWnd, wxWindow *win);
extern void wxRemoveHandleAssociation(wxWindow *win);
long style,
const wxString& name)
{
- m_defaultIcon = (WXHICON) (wxSTD_MDIPARENTFRAME_ICON
- ? wxSTD_MDIPARENTFRAME_ICON
- : wxDEFAULT_MDIPARENTFRAME_ICON);
-
m_clientWindow = NULL;
m_currentChild = NULL;
SetName(name);
m_windowStyle = style;
- if (parent) parent->AddChild(this);
+ if ( parent )
+ parent->AddChild(this);
if ( id > -1 )
m_windowId = id;
else
- m_windowId = (int)NewControlId();
+ m_windowId = NewControlId();
- int x = pos.x;
- int y = pos.y;
- int width = size.x;
- int height = size.y;
+ long exflags;
+ long msflags = MSWGetCreateWindowFlags(&exflags);
- DWORD msflags = WS_OVERLAPPED;
- if (style & wxMINIMIZE_BOX)
- msflags |= WS_MINIMIZEBOX;
- if (style & wxMAXIMIZE_BOX)
- msflags |= WS_MAXIMIZEBOX;
- if (style & wxTHICK_FRAME)
- msflags |= WS_THICKFRAME;
- if (style & wxSYSTEM_MENU)
- msflags |= WS_SYSMENU;
- if ((style & wxMINIMIZE) || (style & wxICONIZE))
- msflags |= WS_MINIMIZE;
- if (style & wxMAXIMIZE)
- msflags |= WS_MAXIMIZE;
- if (style & wxCAPTION)
- msflags |= WS_CAPTION;
-
- if (style & wxCLIP_CHILDREN)
- msflags |= WS_CLIPCHILDREN;
-
- if ( !wxWindow::MSWCreate(m_windowId,
- parent,
- wxMDIFrameClassName,
- this,
+ if ( !wxWindow::MSWCreate(wxMDIFrameClassName,
title,
- x, y, width, height,
- msflags) )
+ pos, size,
+ msflags,
+ exflags) )
{
return FALSE;
}
}
}
+#if wxUSE_MENUS_NATIVE
+
void wxMDIParentFrame::InternalSetMenuBar()
{
-// HMENU subMenu = GetSubMenu((HMENU) m_windowMenu, 0);
-
m_parentFrameActive = TRUE;
- HMENU subMenu = (HMENU) 0;
- if (GetWindowMenu())
- subMenu = (HMENU) GetWindowMenu()->GetHMenu();
+ wxMenu *menu = GetWindowMenu();
+ HMENU subMenu = menu ? GetHmenuOf(menu) : 0;
InsertWindowMenu(GetClientWindow(), m_hMenu, subMenu);
}
+#endif // wxUSE_MENUS_NATIVE
+
void wxMDIParentFrame::SetWindowMenu(wxMenu* menu)
{
if (m_windowMenu)
event.Skip();
}
+WXHICON wxMDIParentFrame::GetDefaultIcon() const
+{
+ return (WXHICON)(wxSTD_MDIPARENTFRAME_ICON ? wxSTD_MDIPARENTFRAME_ICON
+ : wxDEFAULT_MDIPARENTFRAME_ICON);
+}
+
// ---------------------------------------------------------------------------
// MDI operations
// ---------------------------------------------------------------------------
long style,
const wxString& name)
{
- m_defaultIcon = (WXHICON)(wxSTD_MDICHILDFRAME_ICON ? wxSTD_MDICHILDFRAME_ICON
- : wxDEFAULT_MDICHILDFRAME_ICON);
-
SetName(name);
+ wxWindowBase::Show(TRUE); // MDI child frame starts off shown
if ( id > -1 )
m_windowId = id;
parent->AddChild(this);
}
- wxWndHook = this;
-
int x = pos.x;
int y = pos.y;
int width = size.x;
else
mcs.cy = CW_USEDEFAULT;
- DWORD msflags = WS_OVERLAPPED | WS_CLIPCHILDREN | WS_THICKFRAME;
+ DWORD msflags = WS_OVERLAPPED | WS_CLIPCHILDREN | WS_THICKFRAME | WS_VISIBLE ;
if (style & wxMINIMIZE_BOX)
msflags |= WS_MINIMIZEBOX;
if (style & wxMAXIMIZE_BOX)
mcs.lParam = 0;
+ wxWindowCreationHook hook(this);
+
m_hWnd = (WXHWND)::SendMessage(GetWinHwnd(parent->GetClientWindow()),
WM_MDICREATE, 0, (LONG)(LPSTR)&mcs);
- wxWndHook = NULL;
wxAssociateWinWithHandle((HWND) GetHWND(), this);
- // VZ: what's this? an act of piracy?
- //SetWindowLong(GetHwnd(), 0, (long)this);
-
wxModelessWindows.Append(this);
return TRUE;
parent->m_parentFrameActive = FALSE;
}
+WXHICON wxMDIChildFrame::GetDefaultIcon() const
+{
+ return (WXHICON)(wxSTD_MDICHILDFRAME_ICON ? wxSTD_MDICHILDFRAME_ICON
+ : wxDEFAULT_MDICHILDFRAME_ICON);
+}
+
// ---------------------------------------------------------------------------
// MDI operations
// ---------------------------------------------------------------------------
break;
case WM_GETMINMAXINFO:
- // let the default window proc calculate the size of MDI children
- // frames because it is based on the size of the MDI client window,
- // not on the values specified in wxWindow m_min/max variables
- return MSWDefWindowProc(message, wParam, lParam);
+ processed = HandleGetMinMaxInfo((MINMAXINFO *)lParam);
+ break;
case WM_MDIACTIVATE:
{
parent->m_currentChild = NULL;
HMENU parent_menu = (HMENU)parent->GetWinMenu();
- if ( parent_menu )
+
+ // activate the the parent menu only when there is no other child
+ // that has been activated
+ if ( parent_menu && !hwndAct )
{
parent->m_parentFrameActive = TRUE;
return FALSE;
}
+bool wxMDIChildFrame::HandleGetMinMaxInfo(void *mmInfo)
+{
+ MINMAXINFO *info = (MINMAXINFO *)mmInfo;
+
+ // let the default window proc calculate the size of MDI children
+ // frames because it is based on the size of the MDI client window,
+ // not on the values specified in wxWindow m_max variables
+ bool processed = MSWDefWindowProc(WM_GETMINMAXINFO, 0, (LPARAM)mmInfo) != 0;
+
+ // but allow GetSizeHints() to set the min size
+ if ( m_minWidth != -1 )
+ {
+ info->ptMinTrackSize.x = m_minWidth;
+
+ processed = TRUE;
+ }
+
+ if ( m_minHeight != -1 )
+ {
+ info->ptMinTrackSize.y = m_minHeight;
+
+ processed = TRUE;
+ }
+
+ return TRUE;
+}
+
// ---------------------------------------------------------------------------
// MDI specific message translation/preprocessing
// ---------------------------------------------------------------------------
ccs.hWindowMenu = (HMENU) parent->GetWindowMenu()->GetHMenu();
ccs.idFirstChild = wxFIRST_MDI_CHILD;
- DWORD msStyle = /* MDIS_ALLCHILDSTYLES | */ WS_VISIBLE | WS_CHILD | WS_CLIPCHILDREN;
+ DWORD msStyle = MDIS_ALLCHILDSTYLES | WS_VISIBLE | WS_CHILD |
+ WS_CLIPCHILDREN | WS_CLIPSIBLINGS;
+
if ( style & wxHSCROLL )
msStyle |= WS_HSCROLL;
if ( style & wxVSCROLL )
DWORD exStyle = 0;
#endif
- wxWndHook = this;
+ wxWindowCreationHook hook(this);
m_hWnd = (WXHWND)::CreateWindowEx
(
exStyle,
}
SubclassWin(m_hWnd);
- wxWndHook = NULL;
return TRUE;
}
wxWindow *parent = win->GetParent();
wxCHECK_RET( parent, wxT("MDI client without parent frame? weird...") );
+#ifndef __WIN16__
::SendMessage(GetWinHwnd(win), WM_MDIREFRESHMENU, 0, 0L);
+#endif
+
::DrawMenuBar(GetWinHwnd(parent));
}