X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/fd3f686c274a264e89ea97505350a82c1134f307..0f3e3e0c300988a7520b39b90d28517b84882190:/src/msw/frame.cpp diff --git a/src/msw/frame.cpp b/src/msw/frame.cpp index 0f5da8a297..b115aa8ed6 100644 --- a/src/msw/frame.cpp +++ b/src/msw/frame.cpp @@ -17,35 +17,36 @@ #include "wx/wxprec.h" #ifdef __BORLANDC__ -#pragma hdrstop + #pragma hdrstop #endif #ifndef WX_PRECOMP -#include "wx/setup.h" -#include "wx/frame.h" -#include "wx/menu.h" -#include "wx/app.h" -#include "wx/utils.h" -#include "wx/dialog.h" -#include "wx/settings.h" -#include "wx/dcclient.h" -#endif + #include "wx/setup.h" + #include "wx/frame.h" + #include "wx/menu.h" + #include "wx/app.h" + #include "wx/utils.h" + #include "wx/dialog.h" + #include "wx/settings.h" + #include "wx/dcclient.h" +#endif // WX_PRECOMP #include "wx/msw/private.h" #include "wx/statusbr.h" #include "wx/toolbar.h" #include "wx/menuitem.h" +#include "wx/log.h" #ifdef LoadAccelerators #undef LoadAccelerators #endif #if wxUSE_NATIVE_STATUSBAR -#include + #include #endif extern wxList wxModelessWindows; -extern wxList wxPendingDelete; +extern wxList WXDLLEXPORT wxPendingDelete; extern char wxFrameClassName[]; extern wxMenu *wxCurrentPopupMenu; @@ -63,12 +64,12 @@ IMPLEMENT_DYNAMIC_CLASS(wxFrame, wxWindow) #endif #if wxUSE_NATIVE_STATUSBAR -bool wxFrame::m_useNativeStatusBar = TRUE; + bool wxFrame::m_useNativeStatusBar = TRUE; #else -bool wxFrame::m_useNativeStatusBar = FALSE; + bool wxFrame::m_useNativeStatusBar = FALSE; #endif -wxFrame::wxFrame(void) +wxFrame::wxFrame() { m_frameToolBar = NULL ; m_frameMenuBar = NULL; @@ -86,6 +87,10 @@ bool wxFrame::Create(wxWindow *parent, long style, const wxString& name) { +#if wxUSE_TOOLTIPS + m_hwndToolTip = 0; +#endif + if (!parent) wxTopLevelWindows.Append(this); @@ -115,14 +120,19 @@ 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); return TRUE; } -wxFrame::~wxFrame(void) +wxFrame::~wxFrame() { m_isBeingDeleted = TRUE; wxTopLevelWindows.DeleteObject(this); @@ -154,7 +164,7 @@ wxFrame::~wxFrame(void) ::BringWindowToTop((HWND) GetParent()->GetHWND()); } -WXHMENU wxFrame::GetWinMenu(void) const +WXHMENU wxFrame::GetWinMenu() const { return m_hMenu; } @@ -163,7 +173,7 @@ WXHMENU wxFrame::GetWinMenu(void) const void wxFrame::GetClientSize(int *x, int *y) const { RECT rect; - GetClientRect((HWND) GetHWND(), &rect); + ::GetClientRect((HWND) GetHWND(), &rect); if ( GetStatusBar() ) { @@ -182,12 +192,12 @@ void wxFrame::GetClientSize(int *x, int *y) const // Set the client size (i.e. leave the calculation of borders etc. // to wxWindows) -void wxFrame::SetClientSize(int width, int height) +void wxFrame::DoSetClientSize(int width, int height) { HWND hWnd = (HWND) GetHWND(); RECT rect; - GetClientRect(hWnd, &rect); + ::GetClientRect(hWnd, &rect); RECT rect2; GetWindowRect(hWnd, &rect2); @@ -240,7 +250,7 @@ void wxFrame::GetPosition(int *x, int *y) const *y = point.y; } -void wxFrame::SetSize(int x, int y, int width, int height, int sizeFlags) +void wxFrame::DoSetSize(int x, int y, int width, int height, int sizeFlags) { int currentX, currentY; int x1 = x; @@ -325,18 +335,24 @@ void wxFrame::Maximize(bool maximize) m_iconized = FALSE; } -bool wxFrame::IsIconized(void) const +bool wxFrame::IsIconized() const { ((wxFrame *)this)->m_iconized = (::IsIconic((HWND) 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(void) const +wxString wxFrame::GetTitle() const { GetWindowText((HWND) GetHWND(), wxBuffer, 1000); return wxString(wxBuffer); @@ -370,7 +386,7 @@ wxStatusBar *wxFrame::OnCreateStatusBar(int number, long style, wxWindowID id, // Set the height according to the font and the border size wxClientDC dc(statusBar); - dc.SetFont(* statusBar->GetFont()); + dc.SetFont(statusBar->GetFont()); long x, y; dc.GetTextExtent("X", &x, &y); @@ -388,7 +404,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, @@ -417,7 +433,7 @@ void wxFrame::SetStatusWidths(int n, const int widths_field[]) PositionStatusBar(); } -void wxFrame::PositionStatusBar(void) +void wxFrame::PositionStatusBar() { // native status bar positions itself if (m_frameStatusBar @@ -439,48 +455,29 @@ void wxFrame::PositionStatusBar(void) 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 @@ -505,10 +502,10 @@ bool wxFrame::LoadAccelerators(const wxString& table) } #endif -void wxFrame::Fit(void) +void wxFrame::Fit() { // Work out max. size - wxNode *node = GetChildren()->First(); + wxNode *node = GetChildren().First(); int max_width = 0; int max_height = 0; while (node) @@ -606,6 +603,11 @@ void wxFrame::MSWCreate(int id, wxWindow *parent, const char *wclass, wxWindow * WXDWORD extendedStyle = MakeExtendedStyle(style); +#if !defined(__WIN16__) && !defined(__SC__) + if (style & wxFRAME_TOOL_WINDOW) + extendedStyle |= WS_EX_TOOLWINDOW; +#endif + if (style & wxSTAY_ON_TOP) extendedStyle |= WS_EX_TOPMOST; @@ -618,7 +620,7 @@ void wxFrame::MSWCreate(int id, wxWindow *parent, const char *wclass, wxWindow * ::PostMessage((HWND) GetHWND(), WM_SIZE, SIZE_RESTORED, MAKELPARAM(width, height)); } -bool wxFrame::MSWOnPaint(void) +bool wxFrame::MSWOnPaint() { RECT rect; if (GetUpdateRect((HWND) GetHWND(), &rect, FALSE)) @@ -635,14 +637,14 @@ bool wxFrame::MSWOnPaint(void) // 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)ps.hdc,0L); - + this->MSWDefWindowProc(WM_ICONERASEBKGND,(WORD)(LONG) ps.hdc,0L); + if (the_icon) { RECT rect; - GetClientRect((HWND) GetHWND(), &rect); + ::GetClientRect((HWND) GetHWND(), &rect); int icon_width = 32; int icon_height = 32; int icon_x = (int)((rect.right - icon_width)/2); @@ -664,7 +666,7 @@ bool wxFrame::MSWOnPaint(void) return 1; } -WXHICON wxFrame::MSWOnQueryDragIcon(void) +WXHICON wxFrame::MSWOnQueryDragIcon() { if (m_icon.Ok() && (m_icon.GetHICON() != 0)) return m_icon.GetHICON(); @@ -723,7 +725,7 @@ void wxFrame::MSWOnSize(int x, int y, WXUINT id) } } -bool wxFrame::MSWOnClose(void) +bool wxFrame::MSWOnClose() { return Close(); } @@ -754,7 +756,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) @@ -765,7 +767,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 ); @@ -783,7 +785,7 @@ bool wxFrame::MSWTranslateMessage(WXMSG* pMsg) if (m_acceleratorTable.Ok() && ::TranslateAccelerator((HWND) GetHWND(), (HACCEL) m_acceleratorTable.GetHACCEL(), (MSG *)pMsg)) return TRUE; - + return FALSE; } @@ -801,11 +803,11 @@ void wxFrame::OnSize(wxSizeEvent& event) // do we have _exactly_ one child? wxWindow *child = NULL; - for ( wxNode *node = GetChildren()->First(); node; node = node->Next() ) + for ( wxNode *node = GetChildren().First(); node; node = node->Next() ) { wxWindow *win = (wxWindow *)node->Data(); if ( !win->IsKindOf(CLASSINFO(wxFrame)) && - !win->IsKindOf(CLASSINFO(wxDialog)) && + !win->IsKindOf(CLASSINFO(wxDialog)) && (win != GetStatusBar()) && (win != GetToolBar()) ) { @@ -831,7 +833,7 @@ void wxFrame::OnSize(wxSizeEvent& event) // subwindow found. void wxFrame::OnActivate(wxActivateEvent& event) { - for(wxNode *node = GetChildren()->First(); node; node = node->Next()) + 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(); @@ -844,27 +846,14 @@ void wxFrame::OnActivate(wxActivateEvent& event) } } -// The default implementation for the close window event - calls -// OnClose for backward compatibility. - +// The default implementation for the close window event. void wxFrame::OnCloseWindow(wxCloseEvent& event) { - // Compatibility - if ( GetEventHandler()->OnClose() || event.GetForce()) - { - this->Destroy(); - } - else - event.Veto(TRUE); -} - -bool wxFrame::OnClose(void) -{ - return TRUE; + this->Destroy(); } // Destroy the window (delayed, if a managed window) -bool wxFrame::Destroy(void) +bool wxFrame::Destroy() { if (!wxPendingDelete.Member(this)) wxPendingDelete.Append(this); @@ -876,22 +865,22 @@ 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)) { - wxString helpString(menuBar->GetHelpString(event.GetMenuId())); - if (helpString != "") - SetStatusText(helpString); + // 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)); } } } } -wxMenuBar *wxFrame::GetMenuBar(void) const +wxMenuBar *wxFrame::GetMenuBar() const { return m_frameMenuBar; } @@ -920,7 +909,7 @@ void wxFrame::Command(int id) void wxFrame::ProcessCommand(int id) { - wxCommandEvent commandEvent(wxEVENT_TYPE_MENU_COMMAND, id); + wxCommandEvent commandEvent(wxEVT_COMMAND_MENU_SELECTED, id); commandEvent.SetInt( id ); commandEvent.SetEventObject( this ); @@ -933,7 +922,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 @@ -1004,7 +1002,7 @@ wxToolBar* wxFrame::OnCreateToolBar(long style, wxWindowID id, const wxString& n return new wxToolBar(this, id, wxDefaultPosition, wxDefaultSize, style, name); } -void wxFrame::PositionToolBar(void) +void wxFrame::PositionToolBar() { RECT rect; ::GetClientRect((HWND) GetHWND(), &rect); @@ -1037,7 +1035,7 @@ void wxFrame::PositionToolBar(void) // propagate our state change to all child frames void wxFrame::IconizeChildFrames(bool bIconize) { - for ( wxNode *node = GetChildren()->First(); node; node = node->Next() ) { + for ( wxNode *node = GetChildren().First(); node; node = node->Next() ) { wxWindow *win = (wxWindow *)node->Data(); if ( win->IsKindOf(CLASSINFO(wxFrame)) ) { ((wxFrame *)win)->Iconize(bIconize);