X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/9a83f860948059b0273b5cc6d9e43fadad3ebfca..404b319a85dadd7decf7a5a5331020520031a41c:/src/msw/frame.cpp?ds=sidebyside diff --git a/src/msw/frame.cpp b/src/msw/frame.cpp index db4b37bd17..34e00745ec 100644 --- a/src/msw/frame.cpp +++ b/src/msw/frame.cpp @@ -57,13 +57,19 @@ #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 // ---------------------------------------------------------------------------- -#if wxUSE_MENUS_NATIVE +#if wxUSE_MENUS || wxUSE_MENUS_NATIVE extern wxMenu *wxCurrentPopupMenu; -#endif // wxUSE_MENUS_NATIVE +#endif // wxUSE_MENUS || wxUSE_MENUS_NATIVE // ---------------------------------------------------------------------------- // event tables @@ -73,78 +79,6 @@ BEGIN_EVENT_TABLE(wxFrame, wxFrameBase) EVT_SYS_COLOUR_CHANGED(wxFrame::OnSysColourChanged) END_EVENT_TABLE() -#if wxUSE_EXTENDED_RTTI -WX_DEFINE_FLAGS( wxFrameStyle ) - -wxBEGIN_FLAGS( wxFrameStyle ) - // new style border flags, we put them first to - // use them for streaming out - wxFLAGS_MEMBER(wxBORDER_SIMPLE) - wxFLAGS_MEMBER(wxBORDER_SUNKEN) - wxFLAGS_MEMBER(wxBORDER_DOUBLE) - wxFLAGS_MEMBER(wxBORDER_RAISED) - wxFLAGS_MEMBER(wxBORDER_STATIC) - wxFLAGS_MEMBER(wxBORDER_NONE) - - // old style border flags - wxFLAGS_MEMBER(wxSIMPLE_BORDER) - wxFLAGS_MEMBER(wxSUNKEN_BORDER) - wxFLAGS_MEMBER(wxDOUBLE_BORDER) - wxFLAGS_MEMBER(wxRAISED_BORDER) - wxFLAGS_MEMBER(wxSTATIC_BORDER) - wxFLAGS_MEMBER(wxBORDER) - - // standard window styles - wxFLAGS_MEMBER(wxTAB_TRAVERSAL) - wxFLAGS_MEMBER(wxCLIP_CHILDREN) - wxFLAGS_MEMBER(wxTRANSPARENT_WINDOW) - wxFLAGS_MEMBER(wxWANTS_CHARS) - wxFLAGS_MEMBER(wxFULL_REPAINT_ON_RESIZE) - wxFLAGS_MEMBER(wxALWAYS_SHOW_SB ) - wxFLAGS_MEMBER(wxVSCROLL) - wxFLAGS_MEMBER(wxHSCROLL) - - // frame styles - wxFLAGS_MEMBER(wxSTAY_ON_TOP) - wxFLAGS_MEMBER(wxCAPTION) -#if WXWIN_COMPATIBILITY_2_6 - wxFLAGS_MEMBER(wxTHICK_FRAME) -#endif // WXWIN_COMPATIBILITY_2_6 - wxFLAGS_MEMBER(wxSYSTEM_MENU) - wxFLAGS_MEMBER(wxRESIZE_BORDER) -#if WXWIN_COMPATIBILITY_2_6 - wxFLAGS_MEMBER(wxRESIZE_BOX) -#endif // WXWIN_COMPATIBILITY_2_6 - wxFLAGS_MEMBER(wxCLOSE_BOX) - wxFLAGS_MEMBER(wxMAXIMIZE_BOX) - wxFLAGS_MEMBER(wxMINIMIZE_BOX) - - wxFLAGS_MEMBER(wxFRAME_TOOL_WINDOW) - wxFLAGS_MEMBER(wxFRAME_FLOAT_ON_PARENT) - - wxFLAGS_MEMBER(wxFRAME_SHAPED) - -wxEND_FLAGS( wxFrameStyle ) - -IMPLEMENT_DYNAMIC_CLASS_XTI(wxFrame, wxTopLevelWindow,"wx/frame.h") - -wxBEGIN_PROPERTIES_TABLE(wxFrame) - wxEVENT_PROPERTY( Menu , wxEVT_COMMAND_MENU_SELECTED , wxCommandEvent) - - wxPROPERTY( Title,wxString, SetTitle, GetTitle, wxString() , 0 /*flags*/ , wxT("Helpstring") , wxT("group")) - wxPROPERTY_FLAGS( WindowStyle , wxFrameStyle , long , SetWindowStyleFlag , GetWindowStyleFlag , EMPTY_MACROVALUE , 0 /*flags*/ , wxT("Helpstring") , wxT("group")) // style - wxPROPERTY( MenuBar , wxMenuBar * , SetMenuBar , GetMenuBar , EMPTY_MACROVALUE , 0 /*flags*/ , wxT("Helpstring") , wxT("group")) -wxEND_PROPERTIES_TABLE() - -wxBEGIN_HANDLERS_TABLE(wxFrame) -wxEND_HANDLERS_TABLE() - -wxCONSTRUCTOR_6( wxFrame , wxWindow* , Parent , wxWindowID , Id , wxString , Title , wxPoint , Position , wxSize , Size , long , WindowStyle) - -#else -IMPLEMENT_DYNAMIC_CLASS(wxFrame, wxTopLevelWindow) -#endif - // ============================================================================ // implementation // ============================================================================ @@ -295,7 +229,7 @@ void wxFrame::DoGetClientSize(int *x, int *y) const wxStatusBar *statbar = GetStatusBar(); if ( statbar && statbar->IsShown() ) { - *y -= statbar->GetClientSize().y; + *y -= statbar->GetSize().y; } } #endif // wxUSE_STATUSBAR @@ -305,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) { @@ -451,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 @@ -500,11 +429,22 @@ void wxFrame::InternalSetMenuBar() #endif // wxUSE_MENUS_NATIVE +#if wxUSE_MENUS +wxMenu* wxFrame::MSWFindMenuFromHMENU(WXHMENU hMenu) +{ + return GetMenuBar() ? GetMenuBar()->MSWGetMenu(hMenu) : NULL; +} +#endif // wxUSE_MENUS + // Responds to colour changes, and passes event on to children. void wxFrame::OnSysColourChanged(wxSysColourChangedEvent& event) { - SetOwnBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_APPWORKSPACE)); - Refresh(); + // Don't override the colour explicitly set by the user, if any. + if ( !UseBgCol() ) + { + SetOwnBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_APPWORKSPACE)); + Refresh(); + } #if wxUSE_STATUSBAR if ( m_frameStatusBar ) @@ -697,49 +637,23 @@ void wxFrame::PositionToolBar() tx = 0; } - int desiredW = tw; - int desiredH = th; + int desiredW, + desiredH; if ( toolbar->IsVertical() ) { + desiredW = tw; desiredH = height; } else { desiredW = width; + desiredH = th; } - // use the 'real' MSW position here, don't offset relativly to the + // use the 'real' MSW position here, don't offset relatively to the // client area origin - - // Optimise such that we don't have to always resize the toolbar - // when the frame changes, otherwise we'll get a lot of flicker. - bool heightChanging wxDUMMY_INITIALIZE(true); - bool widthChanging wxDUMMY_INITIALIZE(true); - - if ( toolbar->IsVertical() ) - { - // It's OK if the current height is greater than what can be shown. - heightChanging = (desiredH > th) ; - widthChanging = (desiredW != tw) ; - - // The next time around, we may not have to set the size - if (heightChanging) - desiredH = desiredH + 200; - } - else - { - // It's OK if the current width is greater than what can be shown. - widthChanging = (desiredW > tw) ; - heightChanging = (desiredH != th) ; - - // The next time around, we may not have to set the size - if (widthChanging) - desiredW = desiredW + 200; - } - - if (tx != 0 || ty != 0 || widthChanging || heightChanging) - toolbar->SetSize(x, y, desiredW, desiredH, wxSIZE_NO_ADJUSTMENTS); + toolbar->SetSize(x, y, desiredW, desiredH, wxSIZE_NO_ADJUSTMENTS); } #endif // !WINCE_WITH_COMMANDBAR @@ -917,66 +831,6 @@ bool wxFrame::HandleCommand(WXWORD id, WXWORD cmd, WXHWND control) return wxFrameBase::HandleCommand(id, cmd, control);; } -#if wxUSE_MENUS - -bool -wxFrame::HandleMenuSelect(WXWORD nItem, WXWORD flags, WXHMENU WXUNUSED(hMenu)) -{ - // WM_MENUSELECT is generated for both normal items and menus, including - // the top level menus of the menu bar, which can't be represented using - // any valid identifier in wxMenuEvent so use -1 for them - // the menu highlight events for n - const int item = flags & (MF_POPUP | MF_SEPARATOR) ? -1 : nItem; - - wxMenuEvent event(wxEVT_MENU_HIGHLIGHT, item); - event.SetEventObject(this); - - if ( HandleWindowEvent(event) ) - return true; - - // by default, i.e. if the event wasn't handled above, clear the status bar - // text when an item which can't have any associated help string in wx API - // is selected - if ( item == -1 ) - DoGiveHelp(wxEmptyString, true); - - return false; -} - -bool wxFrame::HandleMenuLoop(const wxEventType& evtType, WXWORD isPopup) -{ - // 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, isPopup ? -1 : 0); - event.SetEventObject(this); - - return HandleWindowEvent(event); -} - -bool wxFrame::HandleInitMenuPopup(WXHMENU hMenu) -{ - wxMenu* menu = NULL; - if (GetMenuBar()) - { - int nCount = GetMenuBar()->GetMenuCount(); - for (int n = 0; n < nCount; n++) - { - if (GetMenuBar()->GetMenu(n)->GetHMenu() == hMenu) - { - menu = GetMenuBar()->GetMenu(n); - break; - } - } - } - - wxMenuEvent event(wxEVT_MENU_OPEN, 0, menu); - event.SetEventObject(this); - - return HandleWindowEvent(event); -} - -#endif // wxUSE_MENUS - // --------------------------------------------------------------------------- // the window proc for wxFrame // --------------------------------------------------------------------------- @@ -1017,30 +871,10 @@ WXLRESULT wxFrame::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lPara break; #if !defined(__WXMICROWIN__) && !defined(__WXWINCE__) -#if wxUSE_MENUS - case WM_INITMENUPOPUP: - processed = HandleInitMenuPopup((WXHMENU) wParam); - break; - - case WM_MENUSELECT: - { - WXWORD item, flags; - WXHMENU hmenu; - UnpackMenuSelect(wParam, lParam, &item, &flags, &hmenu); - - processed = HandleMenuSelect(item, flags, hmenu); - } - break; - - case WM_EXITMENULOOP: - processed = HandleMenuLoop(wxEVT_MENU_CLOSE, (WXWORD)wParam); - break; -#endif // wxUSE_MENUS - case WM_QUERYDRAGICON: { const wxIcon& icon = GetIcon(); - HICON hIcon = icon.Ok() ? GetHiconOf(icon) + HICON hIcon = icon.IsOk() ? GetHiconOf(icon) : (HICON)GetDefaultIcon(); rc = (WXLRESULT)hIcon; processed = rc != 0;