\helpref{wxMDIChildFrame::Activate}{wxmdichildframeactivate},\rtfsp
\helpref{wxMDIChildFrame::Maximize}{wxmdichildframemaximize}
-
\section{\class{wxMDIClientWindow}}\label{wxmdiclientwindow}
An MDI client window is a child of \helpref{wxMDIParentFrame}{wxmdiparentframe}, and manages zero or
\twocolitem{\windowstyle{wxTHICK\_FRAME}}{Displays a thick frame around the window (Windows and Motif only).}
\twocolitem{\windowstyle{wxVSCROLL}}{Displays a vertical scrollbar in the {\it client window}, allowing
the user to view child frames that are off the current view.}
+\twocolitem{\windowxstyle{wxFRAME\_NO\_WINDOW\_MENU}{Under Windows, removes the Window menu that is normally
+added automatically.}
\end{twocollist}
See also \helpref{window styles overview}{windowstyles}.
\helpref{wxMDIParentFrame::SetToolBar}{wxmdiparentframesettoolbar}
+\membersection{wxMDIParentFrame::GetWindowMenu}\label{wxmdiparentframegetwindowmenu}
+
+\constfunc{wxMenu*}{GetWindowMenu}{\void}
+
+Returns the current Window menu (added by wxWindows to the menubar). This function
+is available under Windows only.
+
\membersection{wxMDIParentFrame::OnCreateClient}\label{wxmdiparentframeoncreateclient}
\func{virtual wxMDIClientWindow*}{OnCreateClient}{\void}
\helpref{wxMDIParentFrame::GetToolBar}{wxmdiparentframegettoolbar},\rtfsp
\helpref{wxMDIParentFrame::GetClientSize}{wxmdiparentframegetclientsize}
+\membersection{wxMDIParentFrame::SetWindowMenu}\label{wxmdiparentframesetwindowmenu}
+
+\func{void}{SetWindowMenu}{\param{wxMenu*}{ menu}}
+
+Call this to change the current Window menu. Ownership of the menu object passes to
+the frame when you call this function.
+
+This call is available under Windows only.
+
+To remove the window completely, use the wxFRAME\_NO\_WINDOW\_MENU window style.
+
\membersection{wxMDIParentFrame::Tile}\label{wxmdiparentframetile}
\func{void}{Tile}{\void}
// the very end if not found
static void InsertWindowMenu(wxWindow *win, WXHMENU menu, HMENU subMenu);
+// Remove the window menu
+static void RemoveWindowMenu(wxWindow *win, WXHMENU menu);
+
// is this an id of an MDI child?
inline bool IsMdiCommandId(int id)
{
{
m_clientWindow = NULL;
m_currentChild = NULL;
- m_windowMenu = 0;
+ m_windowMenu = (wxMenu*) NULL;
m_parentFrameActive = TRUE;
}
m_clientWindow = NULL;
m_currentChild = NULL;
- m_windowMenu = 0;
+
+ if (style & wxFRAME_NO_WINDOW_MENU)
+ m_windowMenu = (wxMenu*) NULL;
+ else
+ {
+ // m_windowMenu = (WXHMENU) ::LoadMenu(wxGetInstance(), wxT("wxWindowMenu"));
+ m_windowMenu = new wxMenu;
+
+
+ m_windowMenu->Append(4002, wxT("&Cascade"));
+ m_windowMenu->Append(4001, wxT("Tile &Horizontally"));
+ m_windowMenu->Append(4005, wxT("Tile &Vertically"));
+ m_windowMenu->AppendSeparator();
+ m_windowMenu->Append(4003, wxT("&Arrange Icons"));
+ m_windowMenu->Append(4004, wxT("&Next"));
+ }
+
m_parentFrameActive = TRUE;
if (!parent)
int width = size.x;
int height = size.y;
- m_windowMenu = (WXHMENU) ::LoadMenu(wxGetInstance(), wxT("wxWindowMenu"));
-
DWORD msflags = WS_OVERLAPPED;
if (style & wxMINIMIZE_BOX)
msflags |= WS_MINIMIZEBOX;
// already delete by DestroyChildren()
m_frameToolBar = NULL;
- ::DestroyMenu((HMENU)m_windowMenu);
- m_windowMenu = 0;
+ // ::DestroyMenu((HMENU)m_windowMenu);
+ if (m_windowMenu)
+ {
+ delete m_windowMenu;
+ m_windowMenu = (wxMenu*) NULL;
+ }
if ( m_clientWindow )
{
void wxMDIParentFrame::InternalSetMenuBar()
{
- HMENU subMenu = GetSubMenu((HMENU) m_windowMenu, 0);
+// HMENU subMenu = GetSubMenu((HMENU) m_windowMenu, 0);
m_parentFrameActive = TRUE;
+ HMENU subMenu = (HMENU) 0;
+ if (GetWindowMenu())
+ subMenu = (HMENU) GetWindowMenu()->GetHMenu();
+
InsertWindowMenu(GetClientWindow(), m_hMenu, subMenu);
}
+void wxMDIParentFrame::SetWindowMenu(wxMenu* menu)
+{
+ if (m_windowMenu)
+ {
+ if (GetMenuBar())
+ {
+ // Remove old window menu
+ RemoveWindowMenu(GetClientWindow(), m_hMenu);
+ }
+
+ delete m_windowMenu;
+ m_windowMenu = (wxMenu*) NULL;
+ }
+ if (menu)
+ {
+ m_windowMenu = menu;
+ if (GetMenuBar())
+ InsertWindowMenu(GetClientWindow(), m_hMenu, (HMENU) m_windowMenu->GetHMenu());
+ }
+}
+
void wxMDIParentFrame::OnSize(wxSizeEvent& event)
{
if ( GetClientWindow() )
{
wxMDIParentFrame *parent = (wxMDIParentFrame *)GetParent();
- HMENU subMenu = GetSubMenu((HMENU)parent->GetWindowMenu(), 0);
+ // HMENU subMenu = GetSubMenu((HMENU)parent->GetWindowMenu(), 0);
+ HMENU subMenu = (HMENU) 0;
+ if (parent->GetWindowMenu())
+ subMenu = (HMENU) parent->GetWindowMenu()->GetHMenu();
InsertWindowMenu(parent->GetClientWindow(), m_hMenu, subMenu);
if ( menuToSet )
{
- HMENU subMenu = GetSubMenu((HMENU) parent->GetWindowMenu(), 0);
+ HMENU subMenu = (HMENU) 0;
+ if (parent->GetWindowMenu())
+ subMenu = (HMENU) parent->GetWindowMenu()->GetHMenu();
MDISetMenu(parent->GetClientWindow(), menuToSet, subMenu);
}
m_windowStyle = style;
m_parent = parent;
- ccs.hWindowMenu = (HMENU)parent->GetWindowMenu();
+ ccs.hWindowMenu = (HMENU) 0;
+ if (parent->GetWindowMenu())
+ ccs.hWindowMenu = (HMENU) parent->GetWindowMenu()->GetHMenu();
ccs.idFirstChild = wxFIRST_MDI_CHILD;
DWORD msStyle = WS_VISIBLE | WS_CHILD | WS_CLIPCHILDREN;
{
// Try to insert Window menu in front of Help, otherwise append it.
HMENU hmenu = (HMENU)menu;
+
+ if (subMenu)
+ {
int N = GetMenuItemCount(hmenu);
bool success = FALSE;
for ( int i = 0; i < N; i++ )
{
::AppendMenu(hmenu, MF_POPUP, (UINT)subMenu, wxT("&Window"));
}
+ }
MDISetMenu(win, hmenu, subMenu);
}
+static void RemoveWindowMenu(wxWindow *win, WXHMENU menu)
+{
+ // Try to insert Window menu in front of Help, otherwise append it.
+ HMENU hmenu = (HMENU)menu;
+ int N = GetMenuItemCount(hmenu);
+ bool success = FALSE;
+ for ( int i = 0; i < N; i++ )
+ {
+ wxChar buf[256];
+ int chars = GetMenuString(hmenu, i, buf, WXSIZEOF(buf), MF_BYPOSITION);
+ if ( chars == 0 )
+ {
+ wxLogLastError(wxT("GetMenuString"));
+
+ continue;
+ }
+
+ if ( wxStripMenuCodes(wxString(buf)).IsSameAs(wxT("Window")) )
+ {
+ success = TRUE;
+ ::RemoveMenu(hmenu, i, MF_BYPOSITION);
+ break;
+ }
+ }
+
+ // Does passing 0 for the window menu really work with WM_MDISETMENU?
+ MDISetMenu(win, hmenu, 0);
+}
+
static void UnpackMDIActivate(WXWPARAM wParam, WXLPARAM lParam,
WXWORD *activate, WXHWND *hwndAct, WXHWND *hwndDeact)
{