X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/7f3f059ac5f8e01052f9fb0854e31cb2303e193d..96c9640205933ad0673d5af2c96af0816c50160c:/src/msw/frame.cpp?ds=sidebyside diff --git a/src/msw/frame.cpp b/src/msw/frame.cpp index ed3369c64c..f61c8f5f0c 100644 --- a/src/msw/frame.cpp +++ b/src/msw/frame.cpp @@ -57,6 +57,12 @@ #include "wx/univ/colschem.h" #endif // __WXUNIVERSAL__ +// FIXME-VC6: Only VC6 doesn't have this in its standard headers so this +// could be removed once support for it is dropped. +#ifndef WM_UNINITMENUPOPUP + #define WM_UNINITMENUPOPUP 0x0125 +#endif + // ---------------------------------------------------------------------------- // globals // ---------------------------------------------------------------------------- @@ -233,11 +239,6 @@ void wxFrame::DoGetClientSize(int *x, int *y) const // wxFrame: various geometry-related functions // ---------------------------------------------------------------------------- -void wxFrame::Raise() -{ - ::SetForegroundWindow(GetHwnd()); -} - // generate an artificial resize event void wxFrame::SendSizeEvent(int flags) { @@ -379,7 +380,7 @@ void wxFrame::AttachMenuBar(wxMenuBar *menubar) // adjust for menu / titlebar height rc.bottom -= (2*menuHeight-1); - ::MoveWindow(Gethwnd(), rc.left, rc.top, rc.right, rc.bottom, FALSE); + ::MoveWindow(GetHwnd(), rc.left, rc.top, rc.right, rc.bottom, FALSE); } #endif @@ -849,27 +850,38 @@ wxFrame::HandleMenuSelect(WXWORD nItem, WXWORD flags, WXHMENU WXUNUSED(hMenu)) return false; } -bool wxFrame::HandleMenuPopup(wxEventType evtType, WXHMENU hMenu) +bool +wxFrame::DoSendMenuOpenCloseEvent(wxEventType evtType, wxMenu* menu, bool popup) { - // we don't have the menu id here, so we use the id to specify if the event - // was from a popup menu or a normal one + wxMenuEvent event(evtType, popup ? wxID_ANY : 0, menu); + event.SetEventObject(menu); + + return HandleWindowEvent(event); +} - int menuid = 0; +bool wxFrame::HandleExitMenuLoop(WXWORD isPopup) +{ + return DoSendMenuOpenCloseEvent(wxEVT_MENU_CLOSE, + isPopup ? wxCurrentPopupMenu : NULL, + isPopup != 0); +} + +bool wxFrame::HandleMenuPopup(wxEventType evtType, WXHMENU hMenu) +{ + bool isPopup = false; wxMenu* menu = NULL; - if (GetMenuBar()) + if ( wxCurrentPopupMenu && wxCurrentPopupMenu->GetHMenu() == hMenu ) { - menu = GetMenuBar()->MSWGetMenu(hMenu); + menu = wxCurrentPopupMenu; + isPopup = true; } - else if ( wxCurrentPopupMenu && wxCurrentPopupMenu->GetHMenu() == hMenu ) + else if ( GetMenuBar() ) { - menu = wxCurrentPopupMenu; - menuid = wxID_ANY; + menu = GetMenuBar()->MSWGetMenu(hMenu); } - wxMenuEvent event(evtType, menuid, menu); - event.SetEventObject(this); - return HandleWindowEvent(event); + return DoSendMenuOpenCloseEvent(evtType, menu, isPopup); } #endif // wxUSE_MENUS @@ -929,6 +941,16 @@ WXLRESULT wxFrame::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lPara } break; + case WM_EXITMENULOOP: + // Under Windows 98 and 2000 and later we're going to get + // WM_UNINITMENUPOPUP which will be used to generate this event + // with more information (notably the menu that was closed) so we + // only need this one under old Windows systems where the newer + // event is never sent. + if ( wxGetWinVersion() < wxWinVersion_98 ) + processed = HandleExitMenuLoop(wParam); + break; + case WM_UNINITMENUPOPUP: processed = HandleMenuPopup(wxEVT_MENU_CLOSE, (WXHMENU)wParam); break;