X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/debe6624c1e9d4bf3243381153d1e173c849bcd8..dc1c4b62139143b546a78f1aeebbafa1e58fc6e9:/src/msw/mdi.cpp diff --git a/src/msw/mdi.cpp b/src/msw/mdi.cpp index 437f46b068..e1a6b0d587 100644 --- a/src/msw/mdi.cpp +++ b/src/msw/mdi.cpp @@ -41,6 +41,7 @@ #include extern wxList wxModelessWindows; +extern wxMenu *wxCurrentPopupMenu; #define IDM_WINDOWTILE 4001 #define IDM_WINDOWCASCADE 4002 @@ -82,7 +83,6 @@ wxMDIParentFrame::wxMDIParentFrame(void) m_currentChild = NULL; m_windowMenu = 0; m_parentFrameActive = TRUE; - m_frameToolBar = NULL ; } bool wxMDIParentFrame::Create(wxWindow *parent, @@ -95,7 +95,6 @@ bool wxMDIParentFrame::Create(wxWindow *parent, { m_defaultIcon = (WXHICON) (wxSTD_MDIPARENTFRAME_ICON ? wxSTD_MDIPARENTFRAME_ICON : wxDEFAULT_MDIPARENTFRAME_ICON); - m_frameToolBar = NULL ; m_clientWindow = NULL; m_currentChild = NULL; m_windowMenu = 0; @@ -121,7 +120,7 @@ bool wxMDIParentFrame::Create(wxWindow *parent, m_windowMenu = (WXHMENU) ::LoadMenu(wxGetInstance(), "wxWindowMenu"); -#if DEBUG > 1 +#if WXDEBUG > 1 wxDebugMsg("Loaded m_windowMenu %d\n", m_windowMenu); #endif @@ -176,14 +175,7 @@ void wxMDIParentFrame::GetClientSize(int *x, int *y) const int cwidth = rect.right; int cheight = rect.bottom; -/* - if (m_frameToolBar) - { - int tw, th; - m_frameToolBar->GetSize(&tw, &th); - cheight -= th; - } -*/ + if ( GetStatusBar() ) { int sw, sh; @@ -191,6 +183,10 @@ void wxMDIParentFrame::GetClientSize(int *x, int *y) const cheight -= sh; } + wxPoint pt(GetClientAreaOrigin()); + cheight -= pt.y; + cwidth -= pt.x; + *x = cwidth; *y = cheight; } @@ -278,23 +274,18 @@ void wxMDIParentFrame::OnSize(wxSizeEvent& event) int y = 0; int width, height; GetClientSize(&width, &height); - if ( GetToolBar() ) - { - int wt, ht; - GetToolBar()->GetSize(&wt, &ht); - height -= ht; - y += ht; - GetToolBar()->SetSize(0, 0, width, ht); - } if ( GetClientWindow() ) GetClientWindow()->SetSize(x, y, width, height); +/* Already done in MSWOnSize // forward WM_SIZE to status bar control #if USE_NATIVE_STATUSBAR if (m_frameStatusBar && m_frameStatusBar->IsKindOf(CLASSINFO(wxStatusBar95))) ((wxStatusBar95 *)m_frameStatusBar)->OnSize(event); #endif +*/ + } void wxMDIParentFrame::OnActivate(wxActivateEvent& event) @@ -431,7 +422,7 @@ bool wxMDIParentFrame::MSWOnDestroy(void) void wxMDIParentFrame::MSWOnCreate(WXLPCREATESTRUCT WXUNUSED(cs)) { - m_clientWindow = new wxMDIClientWindow; + m_clientWindow = OnCreateClient(); // Uses own style for client style m_clientWindow->CreateClient(this, GetWindowStyleFlag()); } @@ -463,6 +454,7 @@ void wxMDIParentFrame::MSWOnSize(int x, int y, WXUINT id) #endif PositionStatusBar(); + PositionToolBar(); wxSizeEvent event(wxSize(x, y), m_windowId); event.SetEventObject( this ); @@ -488,13 +480,21 @@ bool wxMDIParentFrame::MSWOnActivate(int state, bool minimized, WXHWND activate) bool wxMDIParentFrame::MSWOnCommand(WXWORD id, WXWORD cmd, WXHWND control) { - if (cmd == 0) +// if (cmd == 0) // Why did I do this test? { // In case it's e.g. a toolbar. wxWindow *win = wxFindWinFromHandle(control); if (win) return win->MSWCommand(cmd, id); + if (wxCurrentPopupMenu) + { + wxMenu *popupMenu = wxCurrentPopupMenu; + wxCurrentPopupMenu = NULL; + if (!popupMenu->MSWCommand(cmd, id)) + return TRUE; + } + switch (id) { case IDM_WINDOWCASCADE: @@ -514,7 +514,7 @@ bool wxMDIParentFrame::MSWOnCommand(WXWORD id, WXWORD cmd, WXHWND control) } if (id >= 0xF000) { -#if DEBUG > 1 +#if WXDEBUG > 1 wxDebugMsg("wxMDIFrame::OnCommand %d: system command: calling default window proc\n", GetHWND()); #endif return FALSE; // Get WndProc to call default proc @@ -527,7 +527,7 @@ bool wxMDIParentFrame::MSWOnCommand(WXWORD id, WXWORD cmd, WXHWND control) } else if (m_currentChild && (id < wxFIRST_MDI_CHILD || id > wxLAST_MDI_CHILD)) { -#if DEBUG > 1 +#if WXDEBUG > 1 wxDebugMsg("wxMDIFrame::MSWOnCommand %d: calling child OnCommand\n", GetHWND()); #endif return m_currentChild->MSWOnCommand(id, cmd, control); @@ -608,8 +608,18 @@ bool wxMDIParentFrame::MSWProcessMessage(WXMSG* msg) if ((m_currentChild != (wxWindow *)NULL) && (m_currentChild->GetHWND() != (WXHWND) NULL) && m_currentChild->MSWProcessMessage(msg)) return TRUE; - if (m_acceleratorTable != (WXHANDLE) NULL && - ::TranslateAccelerator((HWND) GetHWND(), (HANDLE) m_acceleratorTable, pMsg)) + return FALSE; +} + +bool wxMDIParentFrame::MSWTranslateMessage(WXMSG* msg) +{ + MSG *pMsg = (MSG *)msg; + + if ((m_currentChild != (wxWindow *)NULL) && (m_currentChild->GetHWND() != (WXHWND) NULL) && m_currentChild->MSWTranslateMessage(msg)) + return TRUE; + + if (m_acceleratorTable.Ok() && + ::TranslateAccelerator((HWND) GetHWND(), (HACCEL) m_acceleratorTable.GetHACCEL(), pMsg)) return TRUE; if (pMsg->message == WM_KEYDOWN || pMsg->message == WM_SYSKEYDOWN) @@ -621,6 +631,7 @@ bool wxMDIParentFrame::MSWProcessMessage(WXMSG* msg) return FALSE; } + bool wxMDIParentFrame::MSWOnEraseBkgnd(WXHDC WXUNUSED(pDC)) { return TRUE; @@ -818,7 +829,7 @@ void wxMDIChildFrame::SetMenuBar(wxMenuBar *menu_bar) wxMDIParentFrame *parent = (wxMDIParentFrame *)GetParent(); parent->m_parentFrameActive = FALSE; - HMENU subMenu = GetSubMenu((HWND) parent->GetWindowMenu(), 0); + HMENU subMenu = GetSubMenu((HMENU) parent->GetWindowMenu(), 0); // Try to insert Window menu in front of Help, otherwise append it. int N = GetMenuItemCount(menu); @@ -883,7 +894,7 @@ void wxMDIChildFrame::MSWOnSize(int x, int y, WXUINT id) if (invalidHandle == (HWND) GetHWND()) { -#if DEBUG > 1 +#if WXDEBUG > 1 wxDebugMsg("wxMDIChildFrame::OnSize %d: invalid, so returning.\n", GetHWND()); #endif return; @@ -916,6 +927,7 @@ void wxMDIChildFrame::MSWOnSize(int x, int y, WXUINT id) #endif PositionStatusBar(); + PositionToolBar(); wxWindow::MSWOnSize(x, y, id); } @@ -923,16 +935,25 @@ void wxMDIChildFrame::MSWOnSize(int x, int y, WXUINT id) bool wxMDIChildFrame::MSWOnCommand(WXWORD id, WXWORD cmd, WXHWND control) { -#if DEBUG > 1 +#if WXDEBUG > 1 wxDebugMsg("wxMDIChildFrame::MSWOnCommand %d\n", GetHWND()); #endif - if ((cmd == 0) && GetHWND()) +// if ((cmd == 0) && GetHWND()) + if (GetHWND()) { // In case it's e.g. a toolbar. wxWindow *win = wxFindWinFromHandle(control); if (win) return win->MSWCommand(cmd, id); + if (wxCurrentPopupMenu) + { + wxMenu *popupMenu = wxCurrentPopupMenu; + wxCurrentPopupMenu = NULL; + if (popupMenu->MSWCommand(cmd, id)) + return TRUE; + } + if (GetMenuBar() && GetMenuBar()->FindItemForId(id)) { ProcessCommand(id); @@ -954,14 +975,20 @@ long wxMDIChildFrame::MSWDefWindowProc(WXUINT message, WXUINT wParam, WXLPARAM l } bool wxMDIChildFrame::MSWProcessMessage(WXMSG *msg) +{ + return FALSE; +} + +bool wxMDIChildFrame::MSWTranslateMessage(WXMSG* msg) { MSG *pMsg = (MSG *)msg; - if (m_acceleratorTable && GetHWND()) + if (m_acceleratorTable.Ok()) { wxFrame *parent = (wxFrame *)GetParent(); HWND parent_hwnd = (HWND) parent->GetHWND(); - return (::TranslateAccelerator(parent_hwnd, (HANDLE) m_acceleratorTable, pMsg) != 0); + return (::TranslateAccelerator(parent_hwnd, (HACCEL) m_acceleratorTable.GetHACCEL(), pMsg) != 0); } + return FALSE; } @@ -969,11 +996,11 @@ long wxMDIChildFrame::MSWOnMDIActivate(long activate, WXHWND WXUNUSED(one), WXHW { wxMDIParentFrame *parent = (wxMDIParentFrame *)GetParent(); HMENU parent_menu = (HMENU) parent->GetWinMenu(); -#if DEBUG > 1 +#if WXDEBUG > 1 wxDebugMsg("Parent menu is %d\n", parent_menu); #endif HMENU child_menu = (HMENU) GetWinMenu(); -#if DEBUG > 1 +#if WXDEBUG > 1 wxDebugMsg("Child menu is %d\n", child_menu); #endif @@ -985,7 +1012,7 @@ long wxMDIChildFrame::MSWOnMDIActivate(long activate, WXHWND WXUNUSED(one), WXHW { parent->m_parentFrameActive = FALSE; HMENU subMenu = GetSubMenu((HMENU) parent->GetWindowMenu(), 0); -#if DEBUG > 1 +#if WXDEBUG > 1 wxDebugMsg("Window submenu is %d\n", subMenu); #endif // HMENU subMenu = 0; @@ -1018,7 +1045,7 @@ long wxMDIChildFrame::MSWOnMDIActivate(long activate, WXHWND WXUNUSED(one), WXHW { parent->m_parentFrameActive = TRUE; HMENU subMenu = GetSubMenu((HMENU) parent->GetWindowMenu(), 0); -#if DEBUG > 1 +#if WXDEBUG > 1 wxDebugMsg("Window submenu is %d\n", subMenu); #endif // HMENU subMenu = 0; @@ -1039,7 +1066,7 @@ long wxMDIChildFrame::MSWOnMDIActivate(long activate, WXHWND WXUNUSED(one), WXHW event.SetEventObject( this ); GetEventHandler()->ProcessEvent(event); -#if DEBUG > 1 +#if WXDEBUG > 1 wxDebugMsg("Finished (de)activating\n"); #endif return 0; @@ -1058,7 +1085,7 @@ void wxMDIChildFrame::MSWDestroyWindow(void) // destroyed. HWND oldHandle = (HWND)GetHWND(); -#if DEBUG > 1 +#if WXDEBUG > 1 wxDebugMsg("*** About to DestroyWindow MDI child %d\n", oldHandle); #endif #ifdef __WIN32__ @@ -1066,7 +1093,7 @@ void wxMDIChildFrame::MSWDestroyWindow(void) #else SendMessage((HWND) parent->GetClientWindow()->GetHWND(), WM_MDIDESTROY, (HWND)oldHandle, 0); #endif -#if DEBUG > 1 +#if WXDEBUG > 1 wxDebugMsg("*** Finished DestroyWindow MDI child %d\n", oldHandle); #endif invalidHandle = 0; @@ -1196,7 +1223,7 @@ long wxMDIClientWindow::MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lPa long wxMDIClientWindow::MSWDefWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam) { if ( MSWGetOldWndProc() != 0) - return ::CallWindowProc(CASTWNDPROC (FARPROC) MSWGetOldWndProc(), (HWND) GetHWND(), (UINT) nMsg, (WPARAM) wParam, (LPARAM) lParam); + return ::CallWindowProc((FARPROC)MSWGetOldWndProc(), (HWND) GetHWND(), (UINT) nMsg, (WPARAM) wParam, (LPARAM) lParam); else return ::DefWindowProc((HWND) m_hWnd, (UINT) nMsg, (WPARAM) wParam, (LPARAM) lParam); }