X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/2de8030dbe61287fb398057d61dd22fe45078c1d..eb082a088a77e8afb3c5a87880a42b9ec9a487e3:/src/msw/frame.cpp diff --git a/src/msw/frame.cpp b/src/msw/frame.cpp index 2f9d0dabb7..5b108f17f9 100644 --- a/src/msw/frame.cpp +++ b/src/msw/frame.cpp @@ -35,6 +35,7 @@ #include "wx/statusbr.h" #include "wx/toolbar.h" #include "wx/menuitem.h" +#include "wx/log.h" #ifdef LoadAccelerators #undef LoadAccelerators @@ -74,7 +75,6 @@ wxFrame::wxFrame() m_frameMenuBar = NULL; m_frameStatusBar = NULL; - m_windowParent = NULL; m_iconized = FALSE; } @@ -119,7 +119,12 @@ bool wxFrame::Create(wxWindow *parent, // we pass NULL as parent to MSWCreate because frames with parents behave // very strangely under Win95 shell - MSWCreate(m_windowId, NULL, wxFrameClassName, this, title, + // Alteration by JACS: keep normal Windows behaviour (float on top of parent) + // with this style. + if ((m_windowStyle & wxFRAME_FLOAT_ON_PARENT) == 0) + parent = NULL; + + MSWCreate(m_windowId, parent, wxFrameClassName, this, title, x, y, width, height, style); wxModelessWindows.Append(this); @@ -164,7 +169,7 @@ WXHMENU wxFrame::GetWinMenu() const } // Get size *available for subwindows* i.e. excluding menu bar, toolbar etc. -void wxFrame::GetClientSize(int *x, int *y) const +void wxFrame::DoGetClientSize(int *x, int *y) const { RECT rect; ::GetClientRect((HWND) GetHWND(), &rect); @@ -224,7 +229,7 @@ void wxFrame::DoSetClientSize(int width, int height) GetEventHandler()->ProcessEvent(event); } -void wxFrame::GetSize(int *width, int *height) const +void wxFrame::DoGetSize(int *width, int *height) const { RECT rect; GetWindowRect((HWND) GetHWND(), &rect); @@ -232,7 +237,7 @@ void wxFrame::GetSize(int *width, int *height) const *height = rect.bottom - rect.top; } -void wxFrame::GetPosition(int *x, int *y) const +void wxFrame::DoGetPosition(int *x, int *y) const { RECT rect; GetWindowRect((HWND) GetHWND(), &rect); @@ -398,7 +403,7 @@ wxStatusBar* wxFrame::CreateStatusBar(int number, long style, wxWindowID id, const wxString& name) { // VZ: calling CreateStatusBar twice is an error - why anyone would do it? - wxCHECK_MSG( m_frameStatusBar == NULL, FALSE, + wxCHECK_MSG( m_frameStatusBar == NULL, FALSE, "recreating status bar in wxFrame" ); m_frameStatusBar = OnCreateStatusBar(number, style, id, @@ -449,48 +454,29 @@ void wxFrame::PositionStatusBar() void wxFrame::SetMenuBar(wxMenuBar *menu_bar) { - if (!menu_bar) - { - m_frameMenuBar = NULL; - return; - } - - if (menu_bar->m_menuBarFrame) - return; + if (!menu_bar) + { + m_frameMenuBar = NULL; + return; + } - int i; - HMENU menu = CreateMenu(); + wxCHECK_RET( !menu_bar->GetFrame(), "this menubar is already attached" ); - for (i = 0; i < menu_bar->m_menuCount; i ++) - { - HMENU popup = (HMENU)menu_bar->m_menus[i]->m_hMenu; - // - // After looking Bounds Checker result, it seems that all - // menus must be individually destroyed. So, don't reset m_hMenu, - // to allow ~wxMenu to do the job. - // - menu_bar->m_menus[i]->m_savehMenu = (WXHMENU) popup; - // Uncommenting for the moment... JACS - menu_bar->m_menus[i]->m_hMenu = 0; - AppendMenu(menu, MF_POPUP | MF_STRING, (UINT)popup, menu_bar->m_titles[i]); - } + if (m_frameMenuBar) + delete m_frameMenuBar; - menu_bar->m_hMenu = (WXHMENU)menu; - if (m_frameMenuBar) - delete m_frameMenuBar; + m_hMenu = menu_bar->Create(); - this->m_hMenu = (WXHMENU) menu; + if ( !m_hMenu ) + return; - DWORD err = 0; - if (!SetMenu((HWND) GetHWND(), menu)) - { -#ifdef __WIN32__ - err = GetLastError(); -#endif - } + if ( !::SetMenu((HWND)GetHWND(), (HMENU)m_hMenu) ) + { + wxLogLastError("SetMenu"); + } - m_frameMenuBar = menu_bar; - menu_bar->m_menuBarFrame = this; + m_frameMenuBar = menu_bar; + menu_bar->Attach(this); } #if 0 @@ -650,10 +636,10 @@ bool wxFrame::MSWOnPaint() // Hold a pointer to the dc so long as the OnPaint() message // is being processed HDC cdc = BeginPaint((HWND) GetHWND(), &ps); - + // Erase background before painting or we get white background this->MSWDefWindowProc(WM_ICONERASEBKGND,(WORD)(LONG) ps.hdc,0L); - + if (the_icon) { RECT rect; @@ -769,7 +755,7 @@ bool wxFrame::MSWOnCommand(WXWORD id, WXWORD cmd, WXHWND control) return FALSE; } else - return FALSE; + return wxWindow::MSWOnCommand(id, cmd, control); } void wxFrame::MSWOnMenuHighlight(WXWORD nItem, WXWORD nFlags, WXHMENU hSysMenu) @@ -780,7 +766,7 @@ void wxFrame::MSWOnMenuHighlight(WXWORD nItem, WXWORD nFlags, WXHMENU hSysMenu) event.SetEventObject( this ); GetEventHandler()->ProcessEvent(event); } - else if (nFlags != MF_SEPARATOR) + else if ((nFlags != MF_SEPARATOR) && (nItem != 0) && (nItem != 65535)) { wxMenuEvent event(wxEVT_MENU_HIGHLIGHT, nItem); event.SetEventObject( this ); @@ -798,7 +784,7 @@ bool wxFrame::MSWTranslateMessage(WXMSG* pMsg) if (m_acceleratorTable.Ok() && ::TranslateAccelerator((HWND) GetHWND(), (HACCEL) m_acceleratorTable.GetHACCEL(), (MSG *)pMsg)) return TRUE; - + return FALSE; } @@ -820,7 +806,7 @@ void wxFrame::OnSize(wxSizeEvent& event) { wxWindow *win = (wxWindow *)node->Data(); if ( !win->IsKindOf(CLASSINFO(wxFrame)) && - !win->IsKindOf(CLASSINFO(wxDialog)) && + !win->IsKindOf(CLASSINFO(wxDialog)) && (win != GetStatusBar()) && (win != GetToolBar()) ) { @@ -878,21 +864,16 @@ void wxFrame::OnMenuHighlight(wxMenuEvent& event) { if (GetStatusBar()) { - if (event.GetMenuId() == -1) - SetStatusText(""); - else + int menuId = event.GetMenuId(); + if ( menuId != -1 ) { wxMenuBar *menuBar = GetMenuBar(); - if (menuBar) + if (menuBar && menuBar->FindItem(menuId)) { -// #ifndef __SALFORDC__ - int menuId = event.GetMenuId(); - wxString helpString; - // This causes a spurious access violation with Salford C++ - helpString = menuBar->GetHelpString(menuId); - if (helpString != "") - SetStatusText(helpString); -// #endif + // set status text even if the string is empty - this will at + // least remove the string from the item which was previously + // selected + SetStatusText(menuBar->GetHelpString(menuId)); } } } @@ -940,7 +921,16 @@ void wxFrame::ProcessCommand(int id) { bar->Check(id,!bar->Checked(id)) ; } - GetEventHandler()->ProcessEvent(commandEvent); + +/* + // Process events starting with the window with the focus, if any. + wxWindow* focusWin = wxFindFocusDescendant(this); + + wxEvtHandler* evtHandler = focusWin ? focusWin->GetEventHandler() : GetEventHandler(); +*/ + + wxEvtHandler* evtHandler = GetEventHandler(); + evtHandler->ProcessEvent(commandEvent); } // Checks if there is a toolbar, and returns the first free client position