#if wxUSE_MDI && !defined(__WXUNIVERSAL__)
+#include "wx/mdi.h"
+
#ifndef WX_PRECOMP
#include "wx/frame.h"
#include "wx/menu.h"
#include "wx/app.h"
#include "wx/utils.h"
#include "wx/dialog.h"
- #if wxUSE_STATUSBAR
- #include "wx/statusbr.h"
- #endif
+ #include "wx/statusbr.h"
#include "wx/settings.h"
#include "wx/intl.h"
#include "wx/log.h"
+ #include "wx/toolbar.h"
#endif
#include "wx/stockitem.h"
-#include "wx/mdi.h"
#include "wx/msw/private.h"
#if wxUSE_STATUSBAR && wxUSE_NATIVE_STATUSBAR
#include "wx/msw/statbr95.h"
#endif
-#if wxUSE_TOOLBAR
- #include "wx/toolbar.h"
-#endif // wxUSE_TOOLBAR
-
#include <string.h>
// ---------------------------------------------------------------------------
extern const wxChar *wxMDIFrameClassName; // from app.cpp
extern const wxChar *wxMDIChildFrameClassName;
extern const wxChar *wxMDIChildFrameClassNameNoRedraw;
-extern void wxAssociateWinWithHandle(HWND hWnd, wxWindow *win);
extern void wxRemoveHandleAssociation(wxWindow *win);
-static HWND invalidHandle = 0;
-
// ---------------------------------------------------------------------------
// constants
// ---------------------------------------------------------------------------
msflags &= ~WS_HSCROLL;
if ( !wxWindow::MSWCreate(wxMDIFrameClassName,
- title,
+ title.wx_str(),
pos, size,
msflags,
exflags) )
}
}
+const wxMenuItem *wxMDIParentFrame::FindItemInMenuBar(int menuId) const
+{
+ const wxMenuItem *item = wxFrame::FindItemInMenuBar(menuId);
+ if ( !item && m_currentChild )
+ {
+ item = m_currentChild->FindItemInMenuBar(menuId);
+ }
+
+ return item;
+}
+
void wxMDIParentFrame::UpdateClientSize()
{
if ( GetClientWindow() )
rc = true;
break;
- case WM_MENUSELECT:
- {
- WXWORD item, flags;
- WXHMENU hmenu;
- UnpackMenuSelect(wParam, lParam, &item, &flags, &hmenu);
-
- if ( m_parentFrameActive )
- {
- processed = HandleMenuSelect(item, flags, hmenu);
- }
- else if (m_currentChild)
- {
- processed = m_currentChild->
- HandleMenuSelect(item, flags, hmenu);
- }
- }
- break;
-
case WM_SIZE:
// though we don't (usually) resize the MDI client to exactly fit the
// client area we need to pass this one to DefFrameProc to allow the children to show
{
wxActivateEvent event(wxEVT_ACTIVATE, true, m_currentChild->GetId());
event.SetEventObject( m_currentChild );
- if ( m_currentChild->GetEventHandler()->ProcessEvent(event) )
+ if ( m_currentChild->HandleWindowEvent(event) )
processed = true;
}
wxWindow *child = node->GetData();
if ( child->GetHWND() )
{
- long childId = wxGetWindowId(child->GetHWND());
- if (childId == (long)id)
+ int childId = wxGetWindowId(child->GetHWND());
+ if ( childId == (signed short)id )
{
::SendMessage( GetWinHwnd(GetClientWindow()),
WM_MDIACTIVATE,
mcs.szClass = style & wxFULL_REPAINT_ON_RESIZE
? wxMDIChildFrameClassName
: wxMDIChildFrameClassNameNoRedraw;
- mcs.szTitle = title;
+ mcs.szTitle = title.wx_str();
mcs.hOwner = wxGetInstance();
if (x != wxDefaultCoord)
mcs.x = x;
wxMDIChildFrame::~wxMDIChildFrame()
{
+ // if we hadn't been created, there is nothing to destroy
+ if ( !m_hWnd )
+ return;
+
// will be destroyed by DestroyChildren() but reset them before calling it
// to avoid using dangling pointers if a callback comes in the meanwhile
#if wxUSE_TOOLBAR
wxSize size(width, height);
wxSizeEvent event(size, m_windowId);
event.SetEventObject( this );
- GetEventHandler()->ProcessEvent(event);
+ HandleWindowEvent(event);
+}
+
+// Unlike other wxTopLevelWindowBase, the mdi child's "GetPosition" is not the
+// same as its GetScreenPosition
+void wxMDIChildFrame::DoGetScreenPosition(int *x, int *y) const
+{
+ HWND hWnd = GetHwnd();
+
+ RECT rect;
+ ::GetWindowRect(hWnd, &rect);
+ if (x)
+ *x = rect.left;
+ if (y)
+ *y = rect.top;
}
+
void wxMDIChildFrame::DoGetPosition(int *x, int *y) const
{
RECT rect;
ResetWindowStyle((void *)NULL);
- return GetEventHandler()->ProcessEvent(event);
+ return HandleWindowEvent(event);
}
bool wxMDIChildFrame::HandleWindowPosChanging(void *pos)
void wxMDIChildFrame::MSWDestroyWindow()
{
- invalidHandle = GetHwnd();
-
wxMDIParentFrame *parent = (wxMDIParentFrame *)GetParent();
// Must make sure this handle is invalidated (set to NULL) since all sorts
if (parent->GetActiveChild() == (wxMDIChildFrame*) NULL)
ResetWindowStyle((void*) NULL);
- invalidHandle = 0;
-
if (m_hMenu)
{
::DestroyMenu((HMENU) m_hMenu);
(WPARAM)hmenuFrame,
(LPARAM)hmenuWindow) )
{
- wxLogLastError(_T("SendMessage(WM_MDISETMENU)"));
+#ifdef __WXDEBUG__
+ DWORD err = ::GetLastError();
+ if ( err )
+ wxLogApiError(_T("SendMessage(WM_MDISETMENU)"), err);
+#endif // __WXDEBUG__
}
}
{
success = true;
::InsertMenu(hmenu, i, MF_BYPOSITION | MF_POPUP | MF_STRING,
- (UINT)subMenu, _("&Window"));
+ (UINT)subMenu, _("&Window").wx_str());
break;
}
}
if ( !success )
{
- ::AppendMenu(hmenu, MF_POPUP, (UINT)subMenu, _("&Window"));
+ ::AppendMenu(hmenu, MF_POPUP, (UINT)subMenu, _("&Window").wx_str());
}
}