X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/7c0ea335c7b1aa4ebd8b3a79dfb4be9fb20eefdb..1a787c5dc89b1cb6a9ddb4ebef3ad2fb24b49c8c:/src/msw/frame.cpp diff --git a/src/msw/frame.cpp b/src/msw/frame.cpp index 45df30ead7..1b2f3db2e9 100644 --- a/src/msw/frame.cpp +++ b/src/msw/frame.cpp @@ -62,21 +62,19 @@ extern wxWindowList wxModelessWindows; extern wxList WXDLLEXPORT wxPendingDelete; -extern wxChar wxFrameClassName[]; +extern const wxChar *wxFrameClassName; extern wxMenu *wxCurrentPopupMenu; // ---------------------------------------------------------------------------- // event tables // ---------------------------------------------------------------------------- -#if !USE_SHARED_LIBRARY BEGIN_EVENT_TABLE(wxFrame, wxFrameBase) EVT_ACTIVATE(wxFrame::OnActivate) EVT_SYS_COLOUR_CHANGED(wxFrame::OnSysColourChanged) END_EVENT_TABLE() IMPLEMENT_DYNAMIC_CLASS(wxFrame, wxWindow) -#endif // ============================================================================ // implementation @@ -357,6 +355,8 @@ wxStatusBar *wxFrame::OnCreateStatusBar(int number, if ( UsesNativeStatusBar() ) { statusBar = new wxStatusBar95(this, id, style); + + statusBar->SetFieldsCount(number); } else #endif @@ -405,6 +405,38 @@ void wxFrame::SetMenuBar(wxMenuBar *menu_bar) return; } + m_frameMenuBar = NULL; + + // Can set a menubar several times. + // TODO: how to prevent a memory leak if you have a currently-unattached + // menubar? wxWindows assumes that the frame will delete the menu (otherwise + // there are problems for MDI). + if (menu_bar->GetHMenu()) + { + m_hMenu = menu_bar->GetHMenu(); + } + else + { + menu_bar->Detach(); + + m_hMenu = menu_bar->Create(); + + if ( !m_hMenu ) + return; + } + + InternalSetMenuBar(); + + m_frameMenuBar = menu_bar; + menu_bar->Attach(this); + +#if 0 // Old code that assumes only one call of SetMenuBar per frame. + if (!menu_bar) + { + DetachMenuBar(); + return; + } + wxCHECK_RET( !menu_bar->GetFrame(), wxT("this menubar is already attached") ); if (m_frameMenuBar) @@ -419,6 +451,7 @@ void wxFrame::SetMenuBar(wxMenuBar *menu_bar) m_frameMenuBar = menu_bar; menu_bar->Attach(this); +#endif } void wxFrame::InternalSetMenuBar() @@ -526,6 +559,15 @@ bool wxFrame::MSWCreate(int id, wxWindow *parent, const wxChar *wclass, wxWindow // subwindow found. void wxFrame::OnActivate(wxActivateEvent& event) { + if ( !event.GetActive() ) + { + event.Skip(); + + return; + } + + wxLogTrace(_T("focus"), _T("wxFrame %08x activated."), m_hWnd); + for ( wxWindowList::Node *node = GetChildren().GetFirst(); node; node = node->GetNext() ) @@ -546,60 +588,9 @@ void wxFrame::OnActivate(wxActivateEvent& event) ) { child->SetFocus(); - return; - } - } -} - -// ---------------------------------------------------------------------------- -// wxFrame size management: we exclude the areas taken by menu/status/toolbars -// from the client area, so the client area is what's really available for the -// frame contents -// ---------------------------------------------------------------------------- - -// Checks if there is a toolbar, and returns the first free client position -wxPoint wxFrame::GetClientAreaOrigin() const -{ - wxPoint pt(0, 0); - if (GetToolBar()) - { - int w, h; - GetToolBar()->GetSize(& w, & h); - - if (GetToolBar()->GetWindowStyleFlag() & wxTB_VERTICAL) - { - pt.x += w; - } - else - { - pt.y += h; + break; } } - return pt; -} - -void wxFrame::DoScreenToClient(int *x, int *y) const -{ - wxWindow::DoScreenToClient(x, y); - - // We may be faking the client origin. - // So a window that's really at (0, 30) may appear - // (to wxWin apps) to be at (0, 0). - wxPoint pt(GetClientAreaOrigin()); - *x -= pt.x; - *y -= pt.y; -} - -void wxFrame::DoClientToScreen(int *x, int *y) const -{ - // We may be faking the client origin. - // So a window that's really at (0, 30) may appear - // (to wxWin apps) to be at (0, 0). - wxPoint pt1(GetClientAreaOrigin()); - *x += pt1.x; - *y += pt1.y; - - wxWindow::DoClientToScreen(x, y); } // ----------------------------------------------------------------------------