X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/1c089c47f344926e2f95a8aa342992ed844fe609..9838df2cefc5b368bb11f98c784ecc78f45ecaf7:/src/msw/mdi.cpp diff --git a/src/msw/mdi.cpp b/src/msw/mdi.cpp index 7f7c044db0..61653c10fe 100644 --- a/src/msw/mdi.cpp +++ b/src/msw/mdi.cpp @@ -34,13 +34,14 @@ #include "wx/mdi.h" #include "wx/msw/private.h" -#if USE_NATIVE_STATUSBAR +#if wxUSE_NATIVE_STATUSBAR #include #endif #include extern wxList wxModelessWindows; +extern wxMenu *wxCurrentPopupMenu; #define IDM_WINDOWTILE 4001 #define IDM_WINDOWCASCADE 4002 @@ -82,20 +83,18 @@ wxMDIParentFrame::wxMDIParentFrame(void) m_currentChild = NULL; m_windowMenu = 0; m_parentFrameActive = TRUE; - m_frameToolBar = NULL ; } bool wxMDIParentFrame::Create(wxWindow *parent, - const wxWindowID id, + wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, - const long style, + long style, const wxString& name) { 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,13 +120,7 @@ bool wxMDIParentFrame::Create(wxWindow *parent, m_windowMenu = (WXHMENU) ::LoadMenu(wxGetInstance(), "wxWindowMenu"); -#if DEBUG > 1 - wxDebugMsg("Loaded m_windowMenu %d\n", m_windowMenu); -#endif - - // Adding WS_CLIPCHILDREN causes children not to be properly - // drawn when first displaying them. - DWORD msflags = WS_OVERLAPPED ; // | WS_CLIPCHILDREN ; + DWORD msflags = WS_OVERLAPPED ; if (style & wxMINIMIZE_BOX) msflags |= WS_MINIMIZEBOX; if (style & wxMAXIMIZE_BOX) @@ -142,8 +135,11 @@ bool wxMDIParentFrame::Create(wxWindow *parent, msflags |= WS_MAXIMIZE; if (style & wxCAPTION) msflags |= WS_CAPTION; - if (style & wxCLIP_CHILDREN) - msflags |= WS_CLIPCHILDREN; + + // Adding WS_CLIPCHILDREN causes children not to be properly + // drawn when first displaying them. +// if (style & wxCLIP_CHILDREN) +// msflags |= WS_CLIPCHILDREN; wxWindow::MSWCreate(m_windowId, parent, wxMDIFrameClassName, this, title, x, y, width, height, msflags); @@ -175,14 +171,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; @@ -190,6 +179,10 @@ void wxMDIParentFrame::GetClientSize(int *x, int *y) const cheight -= sh; } + wxPoint pt(GetClientAreaOrigin()); + cheight -= pt.y; + cwidth -= pt.x; + *x = cwidth; *y = cheight; } @@ -269,7 +262,7 @@ void wxMDIParentFrame::SetMenuBar(wxMenuBar *menu_bar) void wxMDIParentFrame::OnSize(wxSizeEvent& event) { -#if USE_CONSTRAINTS +#if wxUSE_CONSTRAINTS if (GetAutoLayout()) Layout(); #endif @@ -277,23 +270,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 wxUSE_NATIVE_STATUSBAR if (m_frameStatusBar && m_frameStatusBar->IsKindOf(CLASSINFO(wxStatusBar95))) ((wxStatusBar95 *)m_frameStatusBar)->OnSize(event); #endif +*/ + } void wxMDIParentFrame::OnActivate(wxActivateEvent& event) @@ -302,6 +290,7 @@ void wxMDIParentFrame::OnActivate(wxActivateEvent& event) } #if WXWIN_COMPATIBILITY +/* void wxMDIParentFrame::OldOnSize(int x, int y) { #if WXWIN_COMPATIBILITY == 1 @@ -310,7 +299,7 @@ void wxMDIParentFrame::OldOnSize(int x, int y) GetEventHandler()->ProcessEvent(event); #else -#if USE_CONSTRAINTS +#if wxUSE_CONSTRAINTS if (GetAutoLayout()) Layout(); #endif @@ -343,6 +332,7 @@ void wxMDIParentFrame::OldOnActivate(bool flag) #else #endif } +*/ #endif @@ -428,12 +418,12 @@ 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()); } -void wxMDIParentFrame::MSWOnSize(const int x, const int y, const WXUINT id) +void wxMDIParentFrame::MSWOnSize(int x, int y, WXUINT id) { switch (id) { @@ -449,7 +439,7 @@ void wxMDIParentFrame::MSWOnSize(const int x, const int y, const WXUINT id) if (!m_iconized) { // forward WM_SIZE to status bar control -#if USE_NATIVE_STATUSBAR +#if wxUSE_NATIVE_STATUSBAR if (m_frameStatusBar && m_frameStatusBar->IsKindOf(CLASSINFO(wxStatusBar95))) { wxSizeEvent event(wxSize(x, y), m_frameStatusBar->GetId()); @@ -460,12 +450,16 @@ void wxMDIParentFrame::MSWOnSize(const int x, const int y, const WXUINT id) #endif PositionStatusBar(); + PositionToolBar(); - GetEventHandler()->OldOnSize(x, y); + wxSizeEvent event(wxSize(x, y), m_windowId); + event.SetEventObject( this ); + if (!GetEventHandler()->ProcessEvent(event)) + Default(); } } -bool wxMDIParentFrame::MSWOnActivate(const int state, const bool minimized, const WXHWND activate) +bool wxMDIParentFrame::MSWOnActivate(int state, bool minimized, WXHWND activate) { wxWindow::MSWOnActivate(state, minimized, activate); @@ -473,27 +467,32 @@ bool wxMDIParentFrame::MSWOnActivate(const int state, const bool minimized, cons // to the current child. if ((m_currentChild != NULL) && ((state == WA_ACTIVE) || (state == WA_CLICKACTIVE))) { -#if WXWIN_COMPATIBILITY - m_currentChild->GetEventHandler()->OldOnActivate(TRUE); -#else - wxActivateEvent event(wxEVT_ACTIVATE, TRUE, - m_currentChild.m_windowId); - event.eventObject = m_currentChild; - m_currentChild->GetEventHandler()->ProcessEvent(event); -#endif + wxActivateEvent event(wxEVT_ACTIVATE, TRUE, m_currentChild->GetId()); + event.SetEventObject( m_currentChild ); + m_currentChild->GetEventHandler()->ProcessEvent(event); } return 0; } -bool wxMDIParentFrame::MSWOnCommand(const WXWORD id, const WXWORD cmd, const WXHWND control) +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: @@ -513,9 +512,6 @@ bool wxMDIParentFrame::MSWOnCommand(const WXWORD id, const WXWORD cmd, const WXH } if (id >= 0xF000) { -#if DEBUG > 1 - wxDebugMsg("wxMDIFrame::OnCommand %d: system command: calling default window proc\n", GetHWND()); -#endif return FALSE; // Get WndProc to call default proc } @@ -526,15 +522,12 @@ bool wxMDIParentFrame::MSWOnCommand(const WXWORD id, const WXWORD cmd, const WXH } else if (m_currentChild && (id < wxFIRST_MDI_CHILD || id > wxLAST_MDI_CHILD)) { -#if DEBUG > 1 - wxDebugMsg("wxMDIFrame::MSWOnCommand %d: calling child OnCommand\n", GetHWND()); -#endif return m_currentChild->MSWOnCommand(id, cmd, control); } } if (id >= wxFIRST_MDI_CHILD && id <= wxLAST_MDI_CHILD) { - wxNode* node = GetChildren()->First(); + wxNode* node = GetChildren().First(); while (node) { wxWindow* child = (wxWindow*) node->Data(); @@ -566,15 +559,22 @@ bool wxMDIParentFrame::MSWOnCommand(const WXWORD id, const WXWORD cmd, const WXH return FALSE; } -void wxMDIParentFrame::MSWOnMenuHighlight(const WXWORD nItem, const WXWORD nFlags, const WXHMENU hSysMenu) +void wxMDIParentFrame::MSWOnMenuHighlight(WXWORD nItem, WXWORD nFlags, WXHMENU hSysMenu) { if (m_parentFrameActive) { - // TODO if (nFlags == 0xFFFF && hSysMenu == (WXHMENU) NULL) - GetEventHandler()->OldOnMenuSelect(-1); + { + wxMenuEvent event(wxEVT_MENU_HIGHLIGHT, -1); + event.SetEventObject( this ); + GetEventHandler()->ProcessEvent(event); + } else if (nFlags != MF_SEPARATOR) - GetEventHandler()->OldOnMenuSelect(nItem); + { + wxMenuEvent event(wxEVT_MENU_HIGHLIGHT, nItem); + event.SetEventObject( this ); + GetEventHandler()->ProcessEvent(event); + } } else if (m_currentChild) { @@ -594,14 +594,22 @@ long wxMDIParentFrame::MSWDefWindowProc(WXUINT message, WXWPARAM wParam, WXLPARA } bool wxMDIParentFrame::MSWProcessMessage(WXMSG* msg) +{ + if ((m_currentChild != (wxWindow *)NULL) && (m_currentChild->GetHWND() != (WXHWND) NULL) && m_currentChild->MSWProcessMessage(msg)) + return TRUE; + + return FALSE; +} + +bool wxMDIParentFrame::MSWTranslateMessage(WXMSG* msg) { MSG *pMsg = (MSG *)msg; - if ((m_currentChild != (wxWindow *)NULL) && (m_currentChild->GetHWND() != (WXHWND) NULL) && m_currentChild->MSWProcessMessage(msg)) + if ((m_currentChild != (wxWindow *)NULL) && (m_currentChild->GetHWND() != (WXHWND) NULL) && m_currentChild->MSWTranslateMessage(msg)) return TRUE; - if (m_acceleratorTable != (WXHANDLE) NULL && - ::TranslateAccelerator((HWND) GetHWND(), (HANDLE) m_acceleratorTable, pMsg)) + if (m_acceleratorTable.Ok() && + ::TranslateAccelerator((HWND) GetHWND(), (HACCEL) m_acceleratorTable.GetHACCEL(), pMsg)) return TRUE; if (pMsg->message == WM_KEYDOWN || pMsg->message == WM_SYSKEYDOWN) @@ -613,7 +621,8 @@ bool wxMDIParentFrame::MSWProcessMessage(WXMSG* msg) return FALSE; } -bool wxMDIParentFrame::MSWOnEraseBkgnd(const WXHDC WXUNUSED(pDC)) + +bool wxMDIParentFrame::MSWOnEraseBkgnd(WXHDC WXUNUSED(pDC)) { return TRUE; } @@ -627,11 +636,11 @@ wxMDIChildFrame::wxMDIChildFrame(void) } bool wxMDIChildFrame::Create(wxMDIParentFrame *parent, - const wxWindowID id, + wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, - const long style, + long style, const wxString& name) { m_defaultIcon = (WXHICON) (wxSTD_MDICHILDFRAME_ICON ? wxSTD_MDICHILDFRAME_ICON : wxDEFAULT_MDICHILDFRAME_ICON); @@ -717,7 +726,7 @@ wxMDIChildFrame::~wxMDIChildFrame(void) // Set the client size (i.e. leave the calculation of borders etc. // to wxWindows) -void wxMDIChildFrame::SetClientSize(const int width, const int height) +void wxMDIChildFrame::SetClientSize(int width, int height) { HWND hWnd = (HWND) GetHWND(); @@ -750,13 +759,10 @@ void wxMDIChildFrame::SetClientSize(const int width, const int height) ::ScreenToClient((HWND) mdiParent->GetClientWindow()->GetHWND(), &point); MoveWindow(hWnd, point.x, point.y, actual_width, actual_height, (BOOL)TRUE); -#if WXWIN_COMPATIBILITY - GetEventHandler()->OldOnSize(width, height); -#else + wxSizeEvent event(wxSize(width, height), m_windowId); - event.eventObject = this; + event.SetEventObject( this ); GetEventHandler()->ProcessEvent(event); -#endif } void wxMDIChildFrame::GetPosition(int *x, int *y) const @@ -813,7 +819,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); @@ -872,15 +878,12 @@ void wxMDIChildFrame::Activate(void) } static HWND invalidHandle = 0; -void wxMDIChildFrame::MSWOnSize(const int x, const int y, const WXUINT id) +void wxMDIChildFrame::MSWOnSize(int x, int y, WXUINT id) { if (!GetHWND()) return; if (invalidHandle == (HWND) GetHWND()) { -#if DEBUG > 1 - wxDebugMsg("wxMDIChildFrame::OnSize %d: invalid, so returning.\n", GetHWND()); -#endif return; } @@ -900,7 +903,7 @@ void wxMDIChildFrame::MSWOnSize(const int x, const int y, const WXUINT id) if (!m_iconized) { // forward WM_SIZE to status bar control -#if USE_NATIVE_STATUSBAR +#if wxUSE_NATIVE_STATUSBAR if (m_frameStatusBar && m_frameStatusBar->IsKindOf(CLASSINFO(wxStatusBar95))) { wxSizeEvent event(wxSize(x, y), m_frameStatusBar->GetId()); @@ -911,23 +914,30 @@ void wxMDIChildFrame::MSWOnSize(const int x, const int y, const WXUINT id) #endif PositionStatusBar(); + PositionToolBar(); wxWindow::MSWOnSize(x, y, id); } } -bool wxMDIChildFrame::MSWOnCommand(const WXWORD id, const WXWORD cmd, const WXHWND control) +bool wxMDIChildFrame::MSWOnCommand(WXWORD id, WXWORD cmd, WXHWND control) { -#if DEBUG > 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); @@ -949,28 +959,28 @@ 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; } -long wxMDIChildFrame::MSWOnMDIActivate(const long activate, const WXHWND WXUNUSED(one), const WXHWND WXUNUSED(two)) +long wxMDIChildFrame::MSWOnMDIActivate(long activate, WXHWND WXUNUSED(one), WXHWND WXUNUSED(two)) { wxMDIParentFrame *parent = (wxMDIParentFrame *)GetParent(); HMENU parent_menu = (HMENU) parent->GetWinMenu(); -#if DEBUG > 1 - wxDebugMsg("Parent menu is %d\n", parent_menu); -#endif HMENU child_menu = (HMENU) GetWinMenu(); -#if DEBUG > 1 - wxDebugMsg("Child menu is %d\n", child_menu); -#endif if (activate) { @@ -980,10 +990,6 @@ long wxMDIChildFrame::MSWOnMDIActivate(const long activate, const WXHWND WXUNUSE { parent->m_parentFrameActive = FALSE; HMENU subMenu = GetSubMenu((HMENU) parent->GetWindowMenu(), 0); -#if DEBUG > 1 - wxDebugMsg("Window submenu is %d\n", subMenu); -#endif -// HMENU subMenu = 0; #ifdef __WIN32__ ::SendMessage((HWND) parent->GetClientWindow()->GetHWND(), WM_MDISETMENU, (WPARAM)child_menu, @@ -995,23 +1001,24 @@ long wxMDIChildFrame::MSWOnMDIActivate(const long activate, const WXHWND WXUNUSE ::DrawMenuBar((HWND) parent->GetHWND()); } - GetEventHandler()->OldOnActivate(TRUE); + wxActivateEvent event(wxEVT_ACTIVATE, TRUE, m_windowId); + event.SetEventObject( this ); + GetEventHandler()->ProcessEvent(event); } else { if (parent->m_currentChild == this) parent->m_currentChild = NULL; - GetEventHandler()->OldOnActivate(FALSE); + + wxActivateEvent event(wxEVT_ACTIVATE, FALSE, m_windowId); + event.SetEventObject( this ); + GetEventHandler()->ProcessEvent(event); // m_active = FALSE; if (parent_menu) { parent->m_parentFrameActive = TRUE; HMENU subMenu = GetSubMenu((HMENU) parent->GetWindowMenu(), 0); -#if DEBUG > 1 - wxDebugMsg("Window submenu is %d\n", subMenu); -#endif -// HMENU subMenu = 0; #ifdef __WIN32__ ::SendMessage((HWND) parent->GetClientWindow()->GetHWND(), WM_MDISETMENU, (WPARAM)parent_menu, @@ -1024,12 +1031,10 @@ long wxMDIChildFrame::MSWOnMDIActivate(const long activate, const WXHWND WXUNUSE ::DrawMenuBar((HWND) parent->GetHWND()); } } - // TODO bool flag = (activate != 0); - GetEventHandler()->OldOnActivate(flag); -#if DEBUG > 1 - wxDebugMsg("Finished (de)activating\n"); -#endif + wxActivateEvent event(wxEVT_ACTIVATE, flag, m_windowId); + event.SetEventObject( this ); + GetEventHandler()->ProcessEvent(event); return 0; } @@ -1046,16 +1051,10 @@ void wxMDIChildFrame::MSWDestroyWindow(void) // destroyed. HWND oldHandle = (HWND)GetHWND(); -#if DEBUG > 1 - wxDebugMsg("*** About to DestroyWindow MDI child %d\n", oldHandle); -#endif #ifdef __WIN32__ SendMessage((HWND) parent->GetClientWindow()->GetHWND(), WM_MDIDESTROY, (WPARAM)oldHandle, (LPARAM)0); #else SendMessage((HWND) parent->GetClientWindow()->GetHWND(), WM_MDIDESTROY, (HWND)oldHandle, 0); -#endif -#if DEBUG > 1 - wxDebugMsg("*** Finished DestroyWindow MDI child %d\n", oldHandle); #endif invalidHandle = 0; @@ -1141,7 +1140,7 @@ wxMDIClientWindow::~wxMDIClientWindow(void) { } -bool wxMDIClientWindow::CreateClient(wxMDIParentFrame *parent, const long style) +bool wxMDIClientWindow::CreateClient(wxMDIParentFrame *parent, long style) { m_backgroundColour = wxSystemSettings::GetSystemColour(wxSYS_COLOUR_APPWORKSPACE); @@ -1184,7 +1183,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(CASTWNDPROC MSWGetOldWndProc(), (HWND) GetHWND(), (UINT) nMsg, (WPARAM) wParam, (LPARAM) lParam); else return ::DefWindowProc((HWND) m_hWnd, (UINT) nMsg, (WPARAM) wParam, (LPARAM) lParam); } @@ -1207,7 +1206,7 @@ void wxMDIClientWindow::OnScroll(wxScrollEvent& event) } // Should hand the message to the default proc -long wxMDIClientWindow::MSWOnMDIActivate(const long bActivate, const WXHWND, const WXHWND) +long wxMDIClientWindow::MSWOnMDIActivate(long bActivate, WXHWND, WXHWND) { return Default(); }