#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
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
// ============================================================================
// wxFrame: various geometry-related functions
// ----------------------------------------------------------------------------
-void wxFrame::Raise()
-{
- ::SetForegroundWindow(GetHwnd());
-}
-
// generate an artificial resize event
void wxFrame::SendSizeEvent(int flags)
{
// 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
return false;
}
-bool wxFrame::HandleMenuLoop(const wxEventType& evtType, WXWORD isPopup)
+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, isPopup ? -1 : 0);
- event.SetEventObject(this);
+ wxMenuEvent event(evtType, popup ? wxID_ANY : 0, menu);
+ event.SetEventObject(menu);
return HandleWindowEvent(event);
}
-bool wxFrame::HandleInitMenuPopup(WXHMENU hMenu)
+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 )
{
- int nCount = GetMenuBar()->GetMenuCount();
- for (int n = 0; n < nCount; n++)
- {
- if (GetMenuBar()->GetMenu(n)->GetHMenu() == hMenu)
- {
- menu = GetMenuBar()->GetMenu(n);
- break;
- }
- }
+ menu = wxCurrentPopupMenu;
+ isPopup = true;
+ }
+ else if ( GetMenuBar() )
+ {
+ menu = GetMenuBar()->MSWGetMenu(hMenu);
}
- wxMenuEvent event(wxEVT_MENU_OPEN, 0, menu);
- event.SetEventObject(this);
- return HandleWindowEvent(event);
+ return DoSendMenuOpenCloseEvent(evtType, menu, isPopup);
}
#endif // wxUSE_MENUS
#if !defined(__WXMICROWIN__) && !defined(__WXWINCE__)
#if wxUSE_MENUS
case WM_INITMENUPOPUP:
- processed = HandleInitMenuPopup((WXHMENU) wParam);
+ processed = HandleMenuPopup(wxEVT_MENU_OPEN, (WXHMENU)wParam);
break;
case WM_MENUSELECT:
break;
case WM_EXITMENULOOP:
- processed = HandleMenuLoop(wxEVT_MENU_CLOSE, (WXWORD)wParam);
+ // 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;
#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;