#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"
#undef LoadAccelerators
#endif
-#if USE_NATIVE_STATUSBAR
-#include <wx/msw/statbr95.h>
+#if wxUSE_NATIVE_STATUSBAR
+ #include <wx/msw/statbr95.h>
#endif
extern wxList wxModelessWindows;
-extern wxList wxPendingDelete;
+extern wxList WXDLLEXPORT wxPendingDelete;
extern char wxFrameClassName[];
extern wxMenu *wxCurrentPopupMenu;
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)
long style,
const wxString& name)
{
+#if wxUSE_TOOLTIPS
+ m_hwndToolTip = 0;
+#endif
+
if (!parent)
wxTopLevelWindows.Append(this);
int height = size.y;
m_iconized = FALSE;
- MSWCreate(m_windowId, (wxWindow *)parent, wxFrameClassName, this, (char *)(const char *)title,
- x, y, width, height, style);
+
+ // we pass NULL as parent to MSWCreate because frames with parents behave
+ // very strangely under Win95 shell
+ MSWCreate(m_windowId, NULL, wxFrameClassName, this, title,
+ x, y, width, height, style);
wxModelessWindows.Append(this);
return TRUE;
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);
#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);
// 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);
{
// native status bar positions itself
if (m_frameStatusBar
-#if USE_NATIVE_STATUSBAR
+#if wxUSE_NATIVE_STATUSBAR
&& !m_frameStatusBar->IsKindOf(CLASSINFO(wxStatusBar95))
#endif
)
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)
{
wxSysColourChangedEvent event2;
event2.SetEventObject( m_frameStatusBar );
- m_frameStatusBar->ProcessEvent(event2);
+ m_frameStatusBar->GetEventHandler()->ProcessEvent(event2);
}
// Propagate the event to the non-top-level children
// 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)
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;
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;
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)
{
void wxFrame::MSWOnSize(int x, int y, WXUINT id)
{
-#if WXDEBUG > 1
- wxDebugMsg("wxFrameWnd::OnSize %d\n", m_hWnd);
-#endif
switch (id)
{
- case SIZEFULLSCREEN:
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;
+ 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());
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.
void wxFrame::OnSize(wxSizeEvent& event)
{
// if we're using constraints - do use them
- #if USE_CONSTRAINTS
+ #if wxUSE_CONSTRAINTS
if ( GetAutoLayout() ) {
Layout();
return;
// 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)) &&
// 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;
}
}
}
-// 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();
- }
-}
-
-bool wxFrame::OnClose(void)
-{
- return TRUE;
+ this->Destroy();
}
// Destroy the window (delayed, if a managed window)
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
}
}
}
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 );
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,
void wxFrame::PositionToolBar(void)
{
- int cw, ch;
-
RECT rect;
::GetClientRect((HWND) GetHWND(), &rect);
}
}
+// propagate our state change to all child frames
+void wxFrame::IconizeChildFrames(bool bIconize)
+{
+ for ( wxNode *node = GetChildren().First(); node; node = node->Next() ) {
+ wxWindow *win = (wxWindow *)node->Data();
+ if ( win->IsKindOf(CLASSINFO(wxFrame)) ) {
+ ((wxFrame *)win)->Iconize(bIconize);
+ }
+ }
+}
+