X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/a23fd0e1d1329a4a258b4defb3e0b0001b700c6e..2356708db31b737c6eae53c2316b642aa5a2e68d:/src/msw/frame.cpp diff --git a/src/msw/frame.cpp b/src/msw/frame.cpp index 459843e361..3549546754 100644 --- a/src/msw/frame.cpp +++ b/src/msw/frame.cpp @@ -37,17 +37,13 @@ #include "wx/menuitem.h" #include "wx/log.h" -#ifdef LoadAccelerators -#undef LoadAccelerators -#endif - #if wxUSE_NATIVE_STATUSBAR #include #endif extern wxWindowList wxModelessWindows; extern wxList WXDLLEXPORT wxPendingDelete; -extern char wxFrameClassName[]; +extern wxChar wxFrameClassName[]; extern wxMenu *wxCurrentPopupMenu; #if !USE_SHARED_LIBRARY @@ -90,11 +86,7 @@ bool wxFrame::Create(wxWindow *parent, m_hwndToolTip = 0; #endif - if (!parent) - wxTopLevelWindows.Append(this); - SetName(name); -// m_modalShowing = FALSE; m_windowStyle = style; m_frameMenuBar = NULL; m_frameToolBar = NULL ; @@ -124,6 +116,9 @@ bool wxFrame::Create(wxWindow *parent, if ((m_windowStyle & wxFRAME_FLOAT_ON_PARENT) == 0) parent = NULL; + if (!parent) + wxTopLevelWindows.Append(this); + MSWCreate(m_windowId, parent, wxFrameClassName, this, title, x, y, width, height, style); @@ -163,16 +158,11 @@ wxFrame::~wxFrame() ::BringWindowToTop((HWND) GetParent()->GetHWND()); } -WXHMENU wxFrame::GetWinMenu() const -{ - return m_hMenu; -} - // Get size *available for subwindows* i.e. excluding menu bar, toolbar etc. void wxFrame::DoGetClientSize(int *x, int *y) const { RECT rect; - ::GetClientRect((HWND) GetHWND(), &rect); + ::GetClientRect(GetHwnd(), &rect); if ( GetStatusBar() ) { @@ -185,15 +175,17 @@ void wxFrame::DoGetClientSize(int *x, int *y) const rect.bottom -= pt.y; rect.right -= pt.x; - *x = rect.right; - *y = rect.bottom; + if ( x ) + *x = rect.right; + if ( y ) + *y = rect.bottom; } // Set the client size (i.e. leave the calculation of borders etc. // to wxWindows) void wxFrame::DoSetClientSize(int width, int height) { - HWND hWnd = (HWND) GetHWND(); + HWND hWnd = GetHwnd(); RECT rect; ::GetClientRect(hWnd, &rect); @@ -232,7 +224,7 @@ void wxFrame::DoSetClientSize(int width, int height) void wxFrame::DoGetSize(int *width, int *height) const { RECT rect; - GetWindowRect((HWND) GetHWND(), &rect); + GetWindowRect(GetHwnd(), &rect); *width = rect.right - rect.left; *height = rect.bottom - rect.top; } @@ -240,7 +232,7 @@ void wxFrame::DoGetSize(int *width, int *height) const void wxFrame::DoGetPosition(int *x, int *y) const { RECT rect; - GetWindowRect((HWND) GetHWND(), &rect); + GetWindowRect(GetHwnd(), &rect); POINT point; point.x = rect.left; point.y = rect.top; @@ -251,28 +243,11 @@ void wxFrame::DoGetPosition(int *x, int *y) const void wxFrame::DoSetSize(int x, int y, int width, int height, int sizeFlags) { - int currentX, currentY; - int x1 = x; - int y1 = y; - int w1 = width; - int h1 = height; - - GetPosition(¤tX, ¤tY); - if (x == -1 || (sizeFlags & wxSIZE_ALLOW_MINUS_ONE)) - x1 = currentX; - if (y == -1 || (sizeFlags & wxSIZE_ALLOW_MINUS_ONE)) - y1 = currentY; - - int ww,hh ; - GetSize(&ww,&hh) ; - if (width == -1) w1 = ww ; - if (height==-1) h1 = hh ; + wxWindow::DoSetSize(x, y, width, height, sizeFlags); - MoveWindow((HWND) GetHWND(), x1, y1, w1, h1, (BOOL)TRUE); - - wxSizeEvent event(wxSize(width, height), m_windowId); - event.SetEventObject( this ); - GetEventHandler()->ProcessEvent(event); + wxSizeEvent event(wxSize(width, height), m_windowId); + event.SetEventObject( this ); + GetEventHandler()->ProcessEvent(event); } bool wxFrame::Show(bool show) @@ -295,10 +270,10 @@ bool wxFrame::Show(bool show) } } - ShowWindow((HWND) GetHWND(), (BOOL)cshow); + ShowWindow(GetHwnd(), (BOOL)cshow); if (show) { - BringWindowToTop((HWND) GetHWND()); + BringWindowToTop(GetHwnd()); wxActivateEvent event(wxEVT_ACTIVATE, TRUE, m_windowId); event.SetEventObject( this ); @@ -317,7 +292,7 @@ void wxFrame::Iconize(bool iconize) cshow = SW_MINIMIZE; else cshow = SW_RESTORE; - ShowWindow((HWND) GetHWND(), (BOOL)cshow); + ShowWindow(GetHwnd(), (BOOL)cshow); m_iconized = iconize; } @@ -330,31 +305,20 @@ void wxFrame::Maximize(bool maximize) cshow = SW_MAXIMIZE; else cshow = SW_RESTORE; - ShowWindow((HWND) GetHWND(), cshow); + ShowWindow(GetHwnd(), cshow); m_iconized = FALSE; } bool wxFrame::IsIconized() const { - ((wxFrame *)this)->m_iconized = (::IsIconic((HWND) GetHWND()) != 0); + ((wxFrame *)this)->m_iconized = (::IsIconic(GetHwnd()) != 0); return m_iconized; } // Is it maximized? bool wxFrame::IsMaximized() const { - return (::IsZoomed((HWND) GetHWND()) != 0) ; -} - -void wxFrame::SetTitle(const wxString& title) -{ - SetWindowText((HWND) GetHWND(), (const char *)title); -} - -wxString wxFrame::GetTitle() const -{ - GetWindowText((HWND) GetHWND(), wxBuffer, 1000); - return wxString(wxBuffer); + return (::IsZoomed(GetHwnd()) != 0) ; } void wxFrame::SetIcon(const wxIcon& icon) @@ -362,11 +326,12 @@ void wxFrame::SetIcon(const wxIcon& icon) m_icon = icon; #if defined(__WIN95__) if ( m_icon.Ok() ) - SendMessage((HWND) GetHWND(), WM_SETICON, + SendMessage(GetHwnd(), WM_SETICON, (WPARAM)TRUE, (LPARAM)(HICON) m_icon.GetHICON()); #endif } +#if wxUSE_STATUSBAR wxStatusBar *wxFrame::OnCreateStatusBar(int number, long style, wxWindowID id, const wxString& name) { @@ -404,7 +369,7 @@ wxStatusBar* wxFrame::CreateStatusBar(int number, long style, wxWindowID id, { // VZ: calling CreateStatusBar twice is an error - why anyone would do it? wxCHECK_MSG( m_frameStatusBar == NULL, FALSE, - "recreating status bar in wxFrame" ); + _T("recreating status bar in wxFrame") ); m_frameStatusBar = OnCreateStatusBar(number, style, id, name); @@ -419,14 +384,14 @@ wxStatusBar* wxFrame::CreateStatusBar(int number, long style, wxWindowID id, void wxFrame::SetStatusText(const wxString& text, int number) { - wxCHECK_RET( m_frameStatusBar != NULL, "no statusbar to set text for" ); + wxCHECK_RET( m_frameStatusBar != NULL, _T("no statusbar to set text for") ); m_frameStatusBar->SetStatusText(text, number); } void wxFrame::SetStatusWidths(int n, const int widths_field[]) { - wxCHECK_RET( m_frameStatusBar != NULL, "no statusbar to set widths for" ); + wxCHECK_RET( m_frameStatusBar != NULL, _T("no statusbar to set widths for") ); m_frameStatusBar->SetStatusWidths(n, widths_field); PositionStatusBar(); @@ -451,6 +416,7 @@ void wxFrame::PositionStatusBar() m_frameStatusBar->SetSize(0, h, w, sh); } } +#endif // wxUSE_STATUSBAR void wxFrame::SetMenuBar(wxMenuBar *menu_bar) { @@ -460,7 +426,7 @@ void wxFrame::SetMenuBar(wxMenuBar *menu_bar) return; } - wxCHECK_RET( !menu_bar->GetFrame(), "this menubar is already attached" ); + wxCHECK_RET( !menu_bar->GetFrame(), _T("this menubar is already attached") ); if (m_frameMenuBar) delete m_frameMenuBar; @@ -470,64 +436,18 @@ void wxFrame::SetMenuBar(wxMenuBar *menu_bar) if ( !m_hMenu ) return; - if ( !::SetMenu((HWND)GetHWND(), (HMENU)m_hMenu) ) - { - wxLogLastError("SetMenu"); - } + InternalSetMenuBar(); m_frameMenuBar = menu_bar; menu_bar->Attach(this); } -#if 0 -bool wxFrame::LoadAccelerators(const wxString& table) -{ - m_acceleratorTable = (WXHANDLE) -#ifdef __WIN32__ -#ifdef UNICODE - ::LoadAcceleratorsW(wxGetInstance(), (const char *)table); -#else - ::LoadAcceleratorsA(wxGetInstance(), (const char *)table); -#endif -#else - ::LoadAccelerators(wxGetInstance(), (const char *)table); -#endif - - // The above is necessary because LoadAccelerators is a macro - // which we have undefed earlier in the file to avoid confusion - // with wxFrame::LoadAccelerators. Ugh! - - return (m_acceleratorTable != (WXHANDLE) NULL); -} -#endif - -void wxFrame::Fit() +void wxFrame::InternalSetMenuBar() { - // Work out max. size - wxNode *node = GetChildren().First(); - int max_width = 0; - int max_height = 0; - while (node) - { - // Find a child that's a subwindow, but not a dialog box. - wxWindow *win = (wxWindow *)node->Data(); - - if (!win->IsKindOf(CLASSINFO(wxFrame)) && - !win->IsKindOf(CLASSINFO(wxDialog))) + if ( !::SetMenu(GetHwnd(), (HMENU)m_hMenu) ) { - int width, height; - int x, y; - win->GetSize(&width, &height); - win->GetPosition(&x, &y); - - if ((x + width) > max_width) - max_width = x + width; - if ((y + height) > max_height) - max_height = y + height; + wxLogLastError("SetMenu"); } - node = node->Next(); - } - SetClientSize(max_width, max_height); } // Responds to colour changes, and passes event on to children. @@ -552,7 +472,7 @@ void wxFrame::OnSysColourChanged(wxSysColourChangedEvent& event) * */ -bool wxFrame::MSWCreate(int id, wxWindow *parent, const char *wclass, wxWindow *wx_win, const char *title, +bool wxFrame::MSWCreate(int id, wxWindow *parent, const wxChar *wclass, wxWindow *wx_win, const wxChar *title, int x, int y, int width, int height, long style) { @@ -618,162 +538,11 @@ bool wxFrame::MSWCreate(int id, wxWindow *parent, const char *wclass, wxWindow * // Seems to be necessary if we use WS_POPUP // style instead of WS_OVERLAPPED if (width > -1 && height > -1) - ::PostMessage((HWND) GetHWND(), WM_SIZE, SIZE_RESTORED, MAKELPARAM(width, height)); + ::PostMessage(GetHwnd(), WM_SIZE, SIZE_RESTORED, MAKELPARAM(width, height)); return TRUE; } -bool wxFrame::MSWOnPaint() -{ - RECT rect; - if (GetUpdateRect((HWND) GetHWND(), &rect, FALSE)) - { - if (m_iconized) - { - HICON the_icon; - if (m_icon.Ok()) - the_icon = (HICON) m_icon.GetHICON(); - else - the_icon = (HICON) m_defaultIcon; - - PAINTSTRUCT ps; - // 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; - ::GetClientRect((HWND) GetHWND(), &rect); - int icon_width = 32; - int icon_height = 32; - int icon_x = (int)((rect.right - icon_width)/2); - int icon_y = (int)((rect.bottom - icon_height)/2); - DrawIcon(cdc, icon_x, icon_y, the_icon); - } - - EndPaint((HWND) GetHWND(), &ps); - } - else - { - wxPaintEvent event(m_windowId); - event.m_eventObject = this; - if (!GetEventHandler()->ProcessEvent(event)) - Default(); - } - return 0; - } - return 1; -} - -WXHICON wxFrame::MSWOnQueryDragIcon() -{ - if (m_icon.Ok() && (m_icon.GetHICON() != 0)) - return m_icon.GetHICON(); - else - return m_defaultIcon; -} - -bool wxFrame::MSWOnSize(int x, int y, WXUINT id) -{ - bool processed = FALSE; - - switch ( id ) - { - case SIZENORMAL: - // only do it it if we were iconized before, otherwise resizing the - // parent frame has a curious side effect of bringing it under it's - // children - if ( !m_iconized ) - break; - - // restore all child frames too - IconizeChildFrames(FALSE); - - // fall through - - case SIZEFULLSCREEN: - m_iconized = FALSE; - break; - - case SIZEICONIC: - // iconize all child frames too - IconizeChildFrames(TRUE); - - m_iconized = TRUE; - break; - } - - if ( !m_iconized ) - { - // forward WM_SIZE to status bar control -#if wxUSE_NATIVE_STATUSBAR - if (m_frameStatusBar && m_frameStatusBar->IsKindOf(CLASSINFO(wxStatusBar95))) - { - wxSizeEvent event(wxSize(x, y), m_frameStatusBar->GetId()); - event.SetEventObject( m_frameStatusBar ); - - ((wxStatusBar95 *)m_frameStatusBar)->OnSize(event); - } -#endif // wxUSE_NATIVE_STATUSBAR - - PositionStatusBar(); - PositionToolBar(); - - wxSizeEvent event(wxSize(x, y), m_windowId); - event.SetEventObject( this ); - processed = GetEventHandler()->ProcessEvent(event); - } - - return processed; -} - -bool wxFrame::MSWOnCommand(WXWORD id, WXWORD cmd, WXHWND control) -{ - if (cmd == 0 || cmd == 1 ) // Can be either a menu command or an accelerator. - { - // 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); - return TRUE; - } - else - return FALSE; - } - else - return wxWindow::MSWOnCommand(id, cmd, control); -} - -bool wxFrame::MSWProcessMessage(WXMSG* pMsg) -{ - return FALSE; -} - -bool wxFrame::MSWTranslateMessage(WXMSG* pMsg) -{ - if (m_acceleratorTable.Ok() && - ::TranslateAccelerator((HWND) GetHWND(), (HACCEL) m_acceleratorTable.GetHACCEL(), (MSG *)pMsg)) - return TRUE; - - return FALSE; -} - // Default resizing behaviour - if only ONE subwindow, resize to client // rectangle size void wxFrame::OnSize(wxSizeEvent& event) @@ -789,13 +558,19 @@ void wxFrame::OnSize(wxSizeEvent& event) // do we have _exactly_ one child? wxWindow *child = NULL; - for ( wxNode *node = GetChildren().First(); node; node = node->Next() ) + for ( wxWindowList::Node *node = GetChildren().GetFirst(); + node; + node = node->GetNext() ) { - wxWindow *win = (wxWindow *)node->Data(); - if ( !win->IsKindOf(CLASSINFO(wxFrame)) && - !win->IsKindOf(CLASSINFO(wxDialog)) && - (win != GetStatusBar()) && - (win != GetToolBar()) ) + wxWindow *win = node->GetData(); + if ( !win->IsTopLevel() +#if wxUSE_STATUSBAR + && (win != GetStatusBar()) +#endif // wxUSE_STATUSBAR +#if wxUSE_TOOLBAR + && (win != GetToolBar()) +#endif // wxUSE_TOOLBAR + ) { if ( child ) return; // it's our second subwindow - nothing to do @@ -819,23 +594,35 @@ void wxFrame::OnSize(wxSizeEvent& event) // subwindow found. void wxFrame::OnActivate(wxActivateEvent& event) { - for(wxNode *node = GetChildren().First(); node; node = node->Next()) - { - // Find a child that's a subwindow, but not a dialog box. - wxWindow *child = (wxWindow *)node->Data(); - if (!child->IsKindOf(CLASSINFO(wxFrame)) && - !child->IsKindOf(CLASSINFO(wxDialog))) + for ( wxWindowList::Node *node = GetChildren().GetFirst(); + node; + node = node->GetNext() ) { - child->SetFocus(); - return; + // FIXME all this is totally bogus - we need to do the same as wxPanel, + // but how to do it without duplicating the code? + + // restore focus + wxWindow *child = node->GetData(); + + if ( !child->IsTopLevel() +#if wxUSE_TOOLBAR + && !wxDynamicCast(child, wxToolBar) +#endif // wxUSE_TOOLBAR +#if wxUSE_STATUSBAR + && !wxDynamicCast(child, wxStatusBar) +#endif // wxUSE_STATUSBAR + ) + { + child->SetFocus(); + return; + } } - } } // The default implementation for the close window event. void wxFrame::OnCloseWindow(wxCloseEvent& event) { - this->Destroy(); + Destroy(); } // Destroy the window (delayed, if a managed window) @@ -851,18 +638,21 @@ void wxFrame::OnMenuHighlight(wxMenuEvent& event) { if (GetStatusBar()) { + wxString help; int menuId = event.GetMenuId(); if ( menuId != -1 ) { wxMenuBar *menuBar = GetMenuBar(); if (menuBar && menuBar->FindItem(menuId)) { - // 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)); + help = menuBar->GetHelpString(menuId); } } + + // set status text even if the string is empty - this will at + // least remove the string from the item which was previously + // selected + SetStatusText(help); } } @@ -871,53 +661,26 @@ wxMenuBar *wxFrame::GetMenuBar() const return m_frameMenuBar; } -void wxFrame::Centre(int direction) +bool wxFrame::ProcessCommand(int id) { - int display_width, display_height, width, height, x, y; - wxDisplaySize(&display_width, &display_height); - - GetSize(&width, &height); - GetPosition(&x, &y); - - if (direction & wxHORIZONTAL) - x = (int)((display_width - width)/2); - if (direction & wxVERTICAL) - y = (int)((display_height - height)/2); - - SetSize(x, y, width, height); -} - -// Call this to simulate a menu command -void wxFrame::Command(int id) -{ - ProcessCommand(id); -} - -void wxFrame::ProcessCommand(int id) -{ - wxCommandEvent commandEvent(wxEVT_COMMAND_MENU_SELECTED, id); - commandEvent.SetInt( id ); - commandEvent.SetEventObject( this ); - - wxMenuBar *bar = GetMenuBar() ; - if (!bar) - return; + wxMenuBar *bar = GetMenuBar() ; + if ( !bar ) + return FALSE; - wxMenuItem *item = bar->FindItemForId(id) ; - if (item && item->IsCheckable()) - { - bar->Check(id,!bar->Checked(id)) ; - } + wxMenuItem *item = bar->FindItemForId(id); + if ( !item ) + return FALSE; -/* - // Process events starting with the window with the focus, if any. - wxWindow* focusWin = wxFindFocusDescendant(this); + if ( item->IsCheckable() ) + { + bar->Check(id, !bar->IsChecked(id)) ; + } - wxEvtHandler* evtHandler = focusWin ? focusWin->GetEventHandler() : GetEventHandler(); -*/ + wxCommandEvent commandEvent(wxEVT_COMMAND_MENU_SELECTED, id); + commandEvent.SetInt( id ); + commandEvent.SetEventObject( this ); - wxEvtHandler* evtHandler = GetEventHandler(); - evtHandler->ProcessEvent(commandEvent); + return GetEventHandler()->ProcessEvent(commandEvent); } // Checks if there is a toolbar, and returns the first free client position @@ -965,10 +728,11 @@ void wxFrame::ClientToScreen(int *x, int *y) const wxWindow::ClientToScreen(x, y); } +#if wxUSE_TOOLBAR wxToolBar* wxFrame::CreateToolBar(long style, wxWindowID id, const wxString& name) { wxCHECK_MSG( m_frameToolBar == NULL, FALSE, - "recreating toolbar in wxFrame" ); + _T("recreating toolbar in wxFrame") ); wxToolBar* toolBar = OnCreateToolBar(style, id, name); if (toolBar) @@ -991,7 +755,7 @@ wxToolBar* wxFrame::OnCreateToolBar(long style, wxWindowID id, const wxString& n void wxFrame::PositionToolBar() { RECT rect; - ::GetClientRect((HWND) GetHWND(), &rect); + ::GetClientRect(GetHwnd(), &rect); if ( GetStatusBar() ) { @@ -1017,6 +781,7 @@ void wxFrame::PositionToolBar() } } } +#endif // wxUSE_TOOLBAR // propagate our state change to all child frames: this allows us to emulate X // Windows behaviour where child frames float independently of the parent one @@ -1036,24 +801,195 @@ void wxFrame::IconizeChildFrames(bool bIconize) } } + +// make the window modal (all other windows unresponsive) +void wxFrame::MakeModal(bool modal) +{ + if (modal) { + wxEnableTopLevelWindows(FALSE); + Enable(TRUE); // keep this window enabled + } + else { + wxEnableTopLevelWindows(TRUE); + } +} + + // =========================================================================== -// our private (non virtual) message handlers +// message processing // =========================================================================== -bool wxFrame::HandleMenuSelect(WXWORD nItem, WXWORD nFlags, WXHMENU hMenu) +// --------------------------------------------------------------------------- +// preprocessing +// --------------------------------------------------------------------------- + +bool wxFrame::MSWTranslateMessage(WXMSG* pMsg) +{ + if ( wxWindow::MSWTranslateMessage(pMsg) ) + return TRUE; + + // try the menu bar accels + wxMenuBar *menuBar = GetMenuBar(); + if ( !menuBar ) + return FALSE; + + const wxAcceleratorTable& acceleratorTable = menuBar->GetAccelTable(); + return acceleratorTable.Translate(this, pMsg); +} + +// --------------------------------------------------------------------------- +// our private (non virtual) message handlers +// --------------------------------------------------------------------------- + +bool wxFrame::HandlePaint() +{ + RECT rect; + if ( GetUpdateRect(GetHwnd(), &rect, FALSE) ) + { + if ( m_iconized ) + { + HICON hIcon = m_icon.Ok() ? GetHiconOf(m_icon) + : (HICON)m_defaultIcon; + + // Hold a pointer to the dc so long as the OnPaint() message + // is being processed + PAINTSTRUCT ps; + HDC hdc = ::BeginPaint(GetHwnd(), &ps); + + // Erase background before painting or we get white background + MSWDefWindowProc(WM_ICONERASEBKGND, (WORD)(LONG)ps.hdc, 0L); + + if ( hIcon ) + { + RECT rect; + ::GetClientRect(GetHwnd(), &rect); + + // FIXME: why hardcoded? + static const int icon_width = 32; + static const int icon_height = 32; + + int icon_x = (int)((rect.right - icon_width)/2); + int icon_y = (int)((rect.bottom - icon_height)/2); + + ::DrawIcon(hdc, icon_x, icon_y, hIcon); + } + + ::EndPaint(GetHwnd(), &ps); + + return TRUE; + } + else + { + return wxWindow::HandlePaint(); + } + } + else + { + // nothing to paint - processed + return TRUE; + } +} + +bool wxFrame::HandleSize(int x, int y, WXUINT id) +{ + bool processed = FALSE; + + switch ( id ) + { + case SIZENORMAL: + // only do it it if we were iconized before, otherwise resizing the + // parent frame has a curious side effect of bringing it under it's + // children + if ( !m_iconized ) + break; + + // restore all child frames too + IconizeChildFrames(FALSE); + + // fall through + + case SIZEFULLSCREEN: + m_iconized = FALSE; + break; + + case SIZEICONIC: + // iconize all child frames too + IconizeChildFrames(TRUE); + + m_iconized = TRUE; + break; + } + + if ( !m_iconized ) + { + // forward WM_SIZE to status bar control +#if wxUSE_NATIVE_STATUSBAR + if (m_frameStatusBar && m_frameStatusBar->IsKindOf(CLASSINFO(wxStatusBar95))) + { + wxSizeEvent event(wxSize(x, y), m_frameStatusBar->GetId()); + event.SetEventObject( m_frameStatusBar ); + + ((wxStatusBar95 *)m_frameStatusBar)->OnSize(event); + } +#endif // wxUSE_NATIVE_STATUSBAR + + PositionStatusBar(); + PositionToolBar(); + + wxSizeEvent event(wxSize(x, y), m_windowId); + event.SetEventObject( this ); + processed = GetEventHandler()->ProcessEvent(event); + } + + return processed; +} + +bool wxFrame::HandleCommand(WXWORD id, WXWORD cmd, WXHWND control) +{ + if ( control ) + { + // In case it's e.g. a toolbar. + wxWindow *win = wxFindWinFromHandle(control); + if ( win ) + return win->MSWCommand(cmd, id); + } + + // handle here commands from menus and accelerators + if ( cmd == 0 || cmd == 1 ) + { + if ( wxCurrentPopupMenu ) + { + wxMenu *popupMenu = wxCurrentPopupMenu; + wxCurrentPopupMenu = NULL; + + return popupMenu->MSWCommand(cmd, id); + } + + if ( ProcessCommand(id) ) + { + return TRUE; + } + } + + return FALSE; +} + +bool wxFrame::HandleMenuSelect(WXWORD nItem, WXWORD flags, WXHMENU hMenu) { int item; - if ( nFlags == 0xFFFF && hMenu == 0 ) + if ( flags == 0xFFFF && hMenu == 0 ) { - // FIXME: what does this do? does it ever happen? + // menu was removed from screen item = -1; } - else if ((nFlags != MF_SEPARATOR) && (nItem != 0) && (nItem != 65535)) + else if ( !(flags & MF_POPUP) && !(flags & MF_SEPARATOR) ) { item = nItem; } else { + // don't give hints for separators (doesn't make sense) nor for the + // items opening popup menus (they don't have them anyhow) return FALSE; } @@ -1074,19 +1010,49 @@ long wxFrame::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam) switch ( message ) { + case WM_CLOSE: + // if we can't close, tell the system that we processed the + // message - otherwise it would close us + processed = !Close(); + break; + + case WM_COMMAND: + { + WORD id, cmd; + WXHWND hwnd; + UnpackCommand((WXWPARAM)wParam, (WXLPARAM)lParam, + &id, &hwnd, &cmd); + + processed = HandleCommand(id, cmd, (WXHWND)hwnd); + } + break; + case WM_MENUSELECT: { - WORD item = (WORD)wParam; -#ifdef __WIN32__ - WORD flags = HIWORD(wParam); - HMENU sysmenu = (HMENU)lParam; -#else - WORD flags = LOWORD(lParam); - HMENU sysmenu = (HMENU)HIWORD(lParam); -#endif - processed = HandleMenuSelect(item, flags, (WXHMENU)sysmenu); + WXWORD item, flags; + WXHMENU hmenu; + UnpackMenuSelect(wParam, lParam, &item, &flags, &hmenu); + + processed = HandleMenuSelect(item, flags, hmenu); } break; + + case WM_PAINT: + processed = HandlePaint(); + break; + + case WM_QUERYDRAGICON: + { + HICON hIcon = m_icon.Ok() ? GetHiconOf(m_icon) + : (HICON)(m_defaultIcon); + rc = (long)hIcon; + processed = rc != 0; + } + break; + + case WM_SIZE: + processed = HandleSize(LOWORD(lParam), HIWORD(lParam), wParam); + break; } if ( !processed )