Set/GetWindowMenu added to MDI parent frame under MSW

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@5776 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Julian Smart
2000-02-01 15:48:44 +00:00
parent dc8174d2a9
commit df61c00971
6 changed files with 140 additions and 15 deletions

View File

@@ -145,7 +145,6 @@ Restores this MDI child frame (unmaximizes).
\helpref{wxMDIChildFrame::Activate}{wxmdichildframeactivate},\rtfsp \helpref{wxMDIChildFrame::Activate}{wxmdichildframeactivate},\rtfsp
\helpref{wxMDIChildFrame::Maximize}{wxmdichildframemaximize} \helpref{wxMDIChildFrame::Maximize}{wxmdichildframemaximize}
\section{\class{wxMDIClientWindow}}\label{wxmdiclientwindow} \section{\class{wxMDIClientWindow}}\label{wxmdiclientwindow}
An MDI client window is a child of \helpref{wxMDIParentFrame}{wxmdiparentframe}, and manages zero or An MDI client window is a child of \helpref{wxMDIParentFrame}{wxmdiparentframe}, and manages zero or
@@ -276,6 +275,8 @@ for Windows, it is implicit in wxTHICK\_FRAME).}
\twocolitem{\windowstyle{wxTHICK\_FRAME}}{Displays a thick frame around the window (Windows and Motif only).} \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 \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.} 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} \end{twocollist}
See also \helpref{window styles overview}{windowstyles}. See also \helpref{window styles overview}{windowstyles}.
@@ -464,6 +465,13 @@ Returns the window being used as the toolbar for this frame.
\helpref{wxMDIParentFrame::SetToolBar}{wxmdiparentframesettoolbar} \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} \membersection{wxMDIParentFrame::OnCreateClient}\label{wxmdiparentframeoncreateclient}
\func{virtual wxMDIClientWindow*}{OnCreateClient}{\void} \func{virtual wxMDIClientWindow*}{OnCreateClient}{\void}
@@ -517,6 +525,17 @@ toolbars managed by the application.
\helpref{wxMDIParentFrame::GetToolBar}{wxmdiparentframegettoolbar},\rtfsp \helpref{wxMDIParentFrame::GetToolBar}{wxmdiparentframegettoolbar},\rtfsp
\helpref{wxMDIParentFrame::GetClientSize}{wxmdiparentframegetclientsize} \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} \membersection{wxMDIParentFrame::Tile}\label{wxmdiparentframetile}
\func{void}{Tile}{\void} \func{void}{Tile}{\void}

View File

@@ -900,6 +900,12 @@ enum wxStretch
// Add for normal Windows frame behaviour // Add for normal Windows frame behaviour
#define wxFRAME_FLOAT_ON_PARENT 0x0020 #define wxFRAME_FLOAT_ON_PARENT 0x0020
/*
* MDI parent frame style flags
* Can overlap with some of the above.
*/
#define wxFRAME_NO_WINDOW_MENU 0x0100
#if WXWIN_COMPATIBILITY #if WXWIN_COMPATIBILITY
#define wxDEFAULT_FRAME wxDEFAULT_FRAME_STYLE #define wxDEFAULT_FRAME wxDEFAULT_FRAME_STYLE

View File

@@ -68,7 +68,9 @@ public:
// just return a new class) // just return a new class)
virtual wxMDIClientWindow *OnCreateClient(void); virtual wxMDIClientWindow *OnCreateClient(void);
WXHMENU GetWindowMenu() const { return m_windowMenu; } // WXHMENU GetWindowHMENU() const { return m_windowMenu; }
wxMenu* GetWindowMenu() const { return m_windowMenu; };
void SetWindowMenu(wxMenu* menu) ;
// MDI operations // MDI operations
// -------------- // --------------
@@ -100,7 +102,8 @@ protected:
wxMDIClientWindow * m_clientWindow; wxMDIClientWindow * m_clientWindow;
wxMDIChildFrame * m_currentChild; wxMDIChildFrame * m_currentChild;
WXHMENU m_windowMenu; // WXHMENU m_windowMenu;
wxMenu* m_windowMenu;
// TRUE if MDI Frame is intercepting commands, not child // TRUE if MDI Frame is intercepting commands, not child
bool m_parentFrameActive; bool m_parentFrameActive;

View File

@@ -104,6 +104,14 @@ bool MyApp::OnInit()
frame = new MyFrame((wxFrame *)NULL, -1, "MDI Demo", frame = new MyFrame((wxFrame *)NULL, -1, "MDI Demo",
wxPoint(-1, -1), wxSize(500, 400), wxPoint(-1, -1), wxSize(500, 400),
wxDEFAULT_FRAME_STYLE | wxHSCROLL | wxVSCROLL); wxDEFAULT_FRAME_STYLE | wxHSCROLL | wxVSCROLL);
#ifdef __WXMSW__
#if 0
// Experimental: change the window menu
wxMenu* windowMenu = new wxMenu;
windowMenu->Append(5000, "My menu item!");
frame->SetWindowMenu(windowMenu);
#endif
#endif
// Give it an icon // Give it an icon
#ifdef __WXMSW__ #ifdef __WXMSW__

View File

@@ -102,6 +102,9 @@ static void MDISetMenu(wxWindow *win, HMENU hmenuFrame, HMENU hmenuWindow);
// the very end if not found // the very end if not found
static void InsertWindowMenu(wxWindow *win, WXHMENU menu, HMENU subMenu); 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? // is this an id of an MDI child?
inline bool IsMdiCommandId(int id) inline bool IsMdiCommandId(int id)
{ {
@@ -141,7 +144,7 @@ wxMDIParentFrame::wxMDIParentFrame()
{ {
m_clientWindow = NULL; m_clientWindow = NULL;
m_currentChild = NULL; m_currentChild = NULL;
m_windowMenu = 0; m_windowMenu = (wxMenu*) NULL;
m_parentFrameActive = TRUE; m_parentFrameActive = TRUE;
} }
@@ -157,7 +160,23 @@ bool wxMDIParentFrame::Create(wxWindow *parent,
m_clientWindow = NULL; m_clientWindow = NULL;
m_currentChild = 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; m_parentFrameActive = TRUE;
if (!parent) if (!parent)
@@ -178,8 +197,6 @@ bool wxMDIParentFrame::Create(wxWindow *parent,
int width = size.x; int width = size.x;
int height = size.y; int height = size.y;
m_windowMenu = (WXHMENU) ::LoadMenu(wxGetInstance(), wxT("wxWindowMenu"));
DWORD msflags = WS_OVERLAPPED; DWORD msflags = WS_OVERLAPPED;
if (style & wxMINIMIZE_BOX) if (style & wxMINIMIZE_BOX)
msflags |= WS_MINIMIZEBOX; msflags |= WS_MINIMIZEBOX;
@@ -213,8 +230,12 @@ wxMDIParentFrame::~wxMDIParentFrame()
// already delete by DestroyChildren() // already delete by DestroyChildren()
m_frameToolBar = NULL; m_frameToolBar = NULL;
::DestroyMenu((HMENU)m_windowMenu); // ::DestroyMenu((HMENU)m_windowMenu);
m_windowMenu = 0; if (m_windowMenu)
{
delete m_windowMenu;
m_windowMenu = (wxMenu*) NULL;
}
if ( m_clientWindow ) if ( m_clientWindow )
{ {
@@ -228,13 +249,38 @@ wxMDIParentFrame::~wxMDIParentFrame()
void wxMDIParentFrame::InternalSetMenuBar() void wxMDIParentFrame::InternalSetMenuBar()
{ {
HMENU subMenu = GetSubMenu((HMENU) m_windowMenu, 0); // HMENU subMenu = GetSubMenu((HMENU) m_windowMenu, 0);
m_parentFrameActive = TRUE; m_parentFrameActive = TRUE;
HMENU subMenu = (HMENU) 0;
if (GetWindowMenu())
subMenu = (HMENU) GetWindowMenu()->GetHMenu();
InsertWindowMenu(GetClientWindow(), m_hMenu, subMenu); 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) void wxMDIParentFrame::OnSize(wxSizeEvent& event)
{ {
if ( GetClientWindow() ) if ( GetClientWindow() )
@@ -722,7 +768,10 @@ void wxMDIChildFrame::InternalSetMenuBar()
{ {
wxMDIParentFrame *parent = (wxMDIParentFrame *)GetParent(); 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); InsertWindowMenu(parent->GetClientWindow(), m_hMenu, subMenu);
@@ -953,7 +1002,9 @@ bool wxMDIChildFrame::HandleMDIActivate(long WXUNUSED(activate),
if ( menuToSet ) 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); MDISetMenu(parent->GetClientWindow(), menuToSet, subMenu);
} }
@@ -1086,7 +1137,9 @@ bool wxMDIClientWindow::CreateClient(wxMDIParentFrame *parent, long style)
m_windowStyle = style; m_windowStyle = style;
m_parent = parent; 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; ccs.idFirstChild = wxFIRST_MDI_CHILD;
DWORD msStyle = WS_VISIBLE | WS_CHILD | WS_CLIPCHILDREN; DWORD msStyle = WS_VISIBLE | WS_CHILD | WS_CLIPCHILDREN;
@@ -1167,6 +1220,9 @@ static void InsertWindowMenu(wxWindow *win, WXHMENU menu, HMENU subMenu)
{ {
// Try to insert Window menu in front of Help, otherwise append it. // Try to insert Window menu in front of Help, otherwise append it.
HMENU hmenu = (HMENU)menu; HMENU hmenu = (HMENU)menu;
if (subMenu)
{
int N = GetMenuItemCount(hmenu); int N = GetMenuItemCount(hmenu);
bool success = FALSE; bool success = FALSE;
for ( int i = 0; i < N; i++ ) for ( int i = 0; i < N; i++ )
@@ -1193,10 +1249,40 @@ static void InsertWindowMenu(wxWindow *win, WXHMENU menu, HMENU subMenu)
{ {
::AppendMenu(hmenu, MF_POPUP, (UINT)subMenu, wxT("&Window")); ::AppendMenu(hmenu, MF_POPUP, (UINT)subMenu, wxT("&Window"));
} }
}
MDISetMenu(win, hmenu, subMenu); 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, static void UnpackMDIActivate(WXWPARAM wParam, WXLPARAM lParam,
WXWORD *activate, WXHWND *hwndAct, WXHWND *hwndDeact) WXWORD *activate, WXHWND *hwndAct, WXHWND *hwndDeact)
{ {

View File

@@ -268,8 +268,11 @@ wxWindow::~wxWindow()
if ( m_hWnd ) if ( m_hWnd )
{ {
if ( !::DestroyWindow(GetHwnd()) ) if (::IsWindow(GetHwnd()))
wxLogLastError("DestroyWindow"); {
if ( !::DestroyWindow(GetHwnd()) )
wxLogLastError("DestroyWindow");
}
// remove hWnd <-> wxWindow association // remove hWnd <-> wxWindow association
wxRemoveHandleAssociation(this); wxRemoveHandleAssociation(this);