X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/d2aef3124b711987f45c0f789994a05877fac7ba..858f7d664166563a7725f3487249eed7f30e2f31:/src/msw/frame.cpp diff --git a/src/msw/frame.cpp b/src/msw/frame.cpp index 1a7f2bb7a6..79b3b5d1db 100644 --- a/src/msw/frame.cpp +++ b/src/msw/frame.cpp @@ -17,19 +17,19 @@ #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" @@ -40,12 +40,12 @@ #undef LoadAccelerators #endif -#if USE_NATIVE_STATUSBAR -#include +#if wxUSE_NATIVE_STATUSBAR + #include #endif extern wxList wxModelessWindows; -extern wxList wxPendingDelete; +extern wxList WXDLLEXPORT wxPendingDelete; extern char wxFrameClassName[]; extern wxMenu *wxCurrentPopupMenu; @@ -62,10 +62,10 @@ END_EVENT_TABLE() IMPLEMENT_DYNAMIC_CLASS(wxFrame, wxWindow) #endif -#if USE_NATIVE_STATUSBAR -bool wxFrame::m_useNativeStatusBar = TRUE; +#if wxUSE_NATIVE_STATUSBAR + bool wxFrame::m_useNativeStatusBar = TRUE; #else -bool wxFrame::m_useNativeStatusBar = FALSE; + bool wxFrame::m_useNativeStatusBar = FALSE; #endif wxFrame::wxFrame(void) @@ -86,6 +86,10 @@ bool wxFrame::Create(wxWindow *parent, long style, const wxString& name) { +#if wxUSE_TOOLTIPS + m_hwndToolTip = 0; +#endif + if (!parent) wxTopLevelWindows.Append(this); @@ -331,6 +335,12 @@ bool wxFrame::IsIconized(void) const return m_iconized; } +// Is it maximized? +bool wxFrame::IsMaximized(void) const +{ + return (::IsZoomed((HWND) GetHWND()) != 0) ; +} + void wxFrame::SetTitle(const wxString& title) { SetWindowText((HWND) GetHWND(), (const char *)title); @@ -352,17 +362,12 @@ void wxFrame::SetIcon(const wxIcon& icon) #endif } -void wxFrame::SetAcceleratorTable(const wxAcceleratorTable& accel) -{ - m_acceleratorTable = accel; -} - wxStatusBar *wxFrame::OnCreateStatusBar(int number, long style, wxWindowID id, const wxString& name) { wxStatusBar *statusBar = NULL; -#if USE_NATIVE_STATUSBAR +#if wxUSE_NATIVE_STATUSBAR if (UsesNativeStatusBar()) { statusBar = new wxStatusBar95(this, id, style); @@ -375,7 +380,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); @@ -426,7 +431,7 @@ void wxFrame::PositionStatusBar(void) { // native status bar positions itself if (m_frameStatusBar -#if USE_NATIVE_STATUSBAR +#if wxUSE_NATIVE_STATUSBAR && !m_frameStatusBar->IsKindOf(CLASSINFO(wxStatusBar95)) #endif ) @@ -513,7 +518,7 @@ bool wxFrame::LoadAccelerators(const wxString& table) void wxFrame::Fit(void) { // Work out max. size - wxNode *node = GetChildren()->First(); + wxNode *node = GetChildren().First(); int max_width = 0; int max_height = 0; while (node) @@ -549,7 +554,7 @@ void wxFrame::OnSysColourChanged(wxSysColourChangedEvent& event) { wxSysColourChangedEvent event2; event2.SetEventObject( m_frameStatusBar ); - m_frameStatusBar->ProcessEvent(event2); + m_frameStatusBar->GetEventHandler()->ProcessEvent(event2); } // Propagate the event to the non-top-level children @@ -595,7 +600,7 @@ void wxFrame::MSWCreate(int id, wxWindow *parent, const char *wclass, wxWindow * // Keep this in wxFrame because it saves recoding this function // in wxTinyFrame -#if USE_ITSY_BITSY +#if wxUSE_ITSY_BITSY if (style & wxTINY_CAPTION_VERT) msflags |= IBS_VERTCAPTION; if (style & wxTINY_CAPTION_HORIZ) @@ -611,6 +616,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; @@ -625,18 +635,15 @@ void wxFrame::MSWCreate(int id, wxWindow *parent, const char *wclass, wxWindow * bool wxFrame::MSWOnPaint(void) { -#if WXDEBUG > 1 - wxDebugMsg("wxFrameWnd::OnPaint %d\n", handle); -#endif RECT rect; if (GetUpdateRect((HWND) GetHWND(), &rect, FALSE)) { if (m_iconized) { HICON the_icon; - if (m_icon.Ok()) - the_icon = (HICON) m_icon.GetHICON(); - if (the_icon == 0) + if (m_icon.Ok()) + the_icon = (HICON) m_icon.GetHICON(); + else the_icon = (HICON) m_defaultIcon; PAINTSTRUCT ps; @@ -645,7 +652,7 @@ bool wxFrame::MSWOnPaint(void) 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) { @@ -682,12 +689,15 @@ WXHICON wxFrame::MSWOnQueryDragIcon(void) void wxFrame::MSWOnSize(int x, int y, WXUINT id) { -#if WXDEBUG > 1 - wxDebugMsg("wxFrameWnd::OnSize %d\n", m_hWnd); -#endif 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); @@ -695,20 +705,20 @@ void wxFrame::MSWOnSize(int x, int y, WXUINT id) case SIZEFULLSCREEN: m_iconized = FALSE; - break; + break; case SIZEICONIC: // iconize all child frames too IconizeChildFrames(TRUE); m_iconized = TRUE; - break; + break; } if (!m_iconized) { // forward WM_SIZE to status bar control -#if USE_NATIVE_STATUSBAR +#if wxUSE_NATIVE_STATUSBAR if (m_frameStatusBar && m_frameStatusBar->IsKindOf(CLASSINFO(wxStatusBar95))) { wxSizeEvent event(wxSize(x, y), m_frameStatusBar->GetId()); @@ -730,17 +740,11 @@ void wxFrame::MSWOnSize(int x, int y, WXUINT id) bool wxFrame::MSWOnClose(void) { -#if WXDEBUG > 1 - wxDebugMsg("wxFrameWnd::OnClose %d\n", handle); -#endif return Close(); } bool wxFrame::MSWOnCommand(WXWORD id, WXWORD cmd, WXHWND control) { -#if WXDEBUG > 1 - wxDebugMsg("wxFrameWnd::OnCommand %d\n", handle); -#endif if (cmd == 0 || cmd == 1 ) // Can be either a menu command or an accelerator. { // In case it's e.g. a toolbar. @@ -803,7 +807,7 @@ bool wxFrame::MSWTranslateMessage(WXMSG* pMsg) void wxFrame::OnSize(wxSizeEvent& event) { // if we're using constraints - do use them - #if USE_CONSTRAINTS + #if wxUSE_CONSTRAINTS if ( GetAutoLayout() ) { Layout(); return; @@ -812,7 +816,7 @@ 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)) && @@ -842,16 +846,13 @@ 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(); if (!child->IsKindOf(CLASSINFO(wxFrame)) && !child->IsKindOf(CLASSINFO(wxDialog))) { -#if WXDEBUG > 1 - wxDebugMsg("wxFrame::OnActivate: about to set the child's focus.\n"); -#endif child->SetFocus(); return; } @@ -868,6 +869,8 @@ void wxFrame::OnCloseWindow(wxCloseEvent& event) { this->Destroy(); } + else + event.Veto(TRUE); } bool wxFrame::OnClose(void) @@ -895,9 +898,14 @@ void wxFrame::OnMenuHighlight(wxMenuEvent& event) wxMenuBar *menuBar = GetMenuBar(); if (menuBar) { - wxString helpString(menuBar->GetHelpString(event.GetMenuId())); +// #ifndef __SALFORDC__ + int menuId = event.GetMenuId(); + wxString helpString; + // This causes a spurious access violation with Salford C++ + helpString = menuBar->GetHelpString(menuId); if (helpString != "") - SetStatusText(helpString); + SetStatusText(helpString); +// #endif } } } @@ -932,7 +940,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 ); @@ -969,6 +977,30 @@ wxPoint wxFrame::GetClientAreaOrigin() const return pt; } +void wxFrame::ScreenToClient(int *x, int *y) const +{ + wxWindow::ScreenToClient(x, y); + + // We may be faking the client origin. + // So a window that's really at (0, 30) may appear + // (to wxWin apps) to be at (0, 0). + wxPoint pt(GetClientAreaOrigin()); + *x -= pt.x; + *y -= pt.y; +} + +void wxFrame::ClientToScreen(int *x, int *y) const +{ + // We may be faking the client origin. + // So a window that's really at (0, 30) may appear + // (to wxWin apps) to be at (0, 0). + wxPoint pt1(GetClientAreaOrigin()); + *x += pt1.x; + *y += pt1.y; + + wxWindow::ClientToScreen(x, y); +} + wxToolBar* wxFrame::CreateToolBar(long style, wxWindowID id, const wxString& name) { wxCHECK_MSG( m_frameToolBar == NULL, FALSE, @@ -1025,8 +1057,7 @@ void wxFrame::PositionToolBar(void) // propagate our state change to all child frames void wxFrame::IconizeChildFrames(bool bIconize) { - 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)) ) { ((wxFrame *)win)->Iconize(bIconize);