/////////////////////////////////////////////////////////////////////////////
-// Name: msw/frame.cpp
+// Name: src/msw/frame.cpp
// Purpose: wxFrame
// Author: Julian Smart
// Modified by:
#pragma hdrstop
#endif
+#include "wx/frame.h"
+
#ifndef WX_PRECOMP
- #include "wx/frame.h"
+ #include "wx/msw/wrapcctl.h" // include <commctrl.h> "properly"
#include "wx/app.h"
#include "wx/menu.h"
#include "wx/utils.h"
#include "wx/dcclient.h"
#include "wx/mdi.h"
#include "wx/panel.h"
+ #include "wx/log.h"
+ #include "wx/toolbar.h"
+ #include "wx/statusbr.h"
+ #include "wx/menuitem.h"
#endif // WX_PRECOMP
#include "wx/msw/private.h"
-#ifdef __WXWINCE__
-#include <commctrl.h>
-#endif
-
#if defined(__POCKETPC__) || defined(__SMARTPHONE__)
#include <ole2.h>
#include <aygshell.h>
#include "wx/msw/winundef.h"
#endif
-#if wxUSE_STATUSBAR
- #include "wx/statusbr.h"
- #include "wx/generic/statusbr.h"
-#endif // wxUSE_STATUSBAR
-
-#if wxUSE_TOOLBAR
- #include "wx/toolbar.h"
-#endif // wxUSE_TOOLBAR
-
-#include "wx/menuitem.h"
-#include "wx/log.h"
+#include "wx/generic/statusbr.h"
#ifdef __WXUNIVERSAL__
#include "wx/univ/theme.h"
// 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)
m_hwndToolTip = 0;
#endif
-#if defined(__SMARTPHONE__) || defined(__POCKETPC__)
- SHACTIVATEINFO* info = new SHACTIVATEINFO;
- memset(info, 0, sizeof(SHACTIVATEINFO));
- info->cbSize = sizeof(SHACTIVATEINFO);
-
- m_activateInfo = (void*) info;
-#endif
-
m_wasMinimized = false;
}
{
m_isBeingDeleted = true;
DeleteAllBars();
-
-#if defined(__SMARTPHONE__) || defined(__POCKETPC__)
- SHACTIVATEINFO* info = (SHACTIVATEINFO*) m_activateInfo;
- delete info;
- m_activateInfo = NULL;
-#endif
}
// ----------------------------------------------------------------------------
width += pt.x;
height += pt.y;
+#if wxUSE_TOOLBAR
+ wxToolBar * const toolbar = GetToolBar();
+ if ( toolbar )
+ {
+ if ( toolbar->HasFlag(wxTB_RIGHT | wxTB_BOTTOM) )
+ {
+ const wxSize sizeTB = toolbar->GetSize();
+ if ( toolbar->HasFlag(wxTB_RIGHT) )
+ width -= sizeTB.x;
+ else // wxTB_BOTTOM
+ height -= sizeTB.y;
+ }
+ //else: toolbar already taken into account by GetClientAreaOrigin()
+ }
+#endif // wxUSE_TOOLBAR
+
wxTopLevelWindow::DoSetClientSize(width, height);
}
if ( y )
*y -= pt.y;
+#if wxUSE_TOOLBAR
+ wxToolBar * const toolbar = GetToolBar();
+ if ( toolbar )
+ {
+ if ( toolbar->HasFlag(wxTB_RIGHT | wxTB_BOTTOM) )
+ {
+ const wxSize sizeTB = toolbar->GetSize();
+ if ( toolbar->HasFlag(wxTB_RIGHT) )
+ {
+ if ( x )
+ *x -= sizeTB.x;
+ }
+ else // wxTB_BOTTOM
+ {
+ if ( y )
+ *y -= sizeTB.y;
+ }
+ }
+ //else: toolbar already taken into account by GetClientAreaOrigin()
+ }
+#endif // wxUSE_TOOLBAR
+
#if wxUSE_STATUSBAR
// adjust client area height to take the status bar into account
if ( y )
int w, h;
GetClientSize(&w, &h);
+
int sw, sh;
m_frameStatusBar->GetSize(&sw, &sh);
+ int x = 0;
+#if wxUSE_TOOLBAR
+ wxToolBar * const toolbar = GetToolBar();
+ if ( toolbar && !toolbar->HasFlag(wxTB_TOP) )
+ {
+ const wxSize sizeTB = toolbar->GetSize();
+
+ if ( toolbar->HasFlag(wxTB_LEFT | wxTB_RIGHT) )
+ {
+ if ( toolbar->HasFlag(wxTB_LEFT) )
+ x -= sizeTB.x;
+
+ w += sizeTB.x;
+ }
+ else // wxTB_BOTTOM
+ {
+ // we need to position the status bar below the toolbar
+ h += sizeTB.y;
+ }
+ }
+ //else: no adjustments necessary for the toolbar on top
+#endif // wxUSE_TOOLBAR
+
// Since we wish the status bar to be directly under the client area,
// we use the adjusted sizes without using wxSIZE_NO_ADJUSTMENTS.
- m_frameStatusBar->SetSize(0, h, w, sh);
+ m_frameStatusBar->SetSize(x, h, w, sh);
}
+
#endif // wxUSE_STATUSBAR
#if wxUSE_MENUS_NATIVE
}
#endif // wxUSE_TOOLBAR
- if ((m_fsStyle & wxFULLSCREEN_NOMENUBAR) && m_hMenu)
- ::SetMenu(GetHwnd(), (HMENU)m_hMenu);
+#if wxUSE_MENUS
+ if (m_fsStyle & wxFULLSCREEN_NOMENUBAR)
+ {
+ WXHMENU menu = m_hMenu;
+
+#if wxUSE_MDI_ARCHITECTURE
+ wxMDIParentFrame *frame = wxDynamicCast(this, wxMDIParentFrame);
+ if (frame)
+ {
+ wxMDIChildFrame *child = frame->GetActiveChild();
+ if (child)
+ {
+ menu = child->GetWinMenu();
+ }
+ }
+#endif // wxUSE_MDI_ARCHITECTURE
+
+ if (menu)
+ {
+ ::SetMenu(GetHwnd(), (HMENU)menu);
+ }
+ }
+#endif // wxUSE_MENUS
#if wxUSE_STATUSBAR
wxStatusBar *theStatusBar = GetStatusBar();
void wxFrame::PositionToolBar()
{
+ // TODO: we want to do something different in WinCE, because the toolbar
+ // should be associated with the commandbar, instead of being
+ // independent window.
+#if !defined(WINCE_WITHOUT_COMMANDBAR)
wxToolBar *toolbar = GetToolBar();
if ( toolbar && toolbar->IsShown() )
{
-#if defined(WINCE_WITHOUT_COMMANDBAR)
- // We want to do something different in WinCE, because
- // the toolbar should be associated with the commandbar,
- // and not an independent window.
- // TODO
-#else
// don't call our (or even wxTopLevelWindow) version because we want
// the real (full) client area size, not excluding the tool/status bar
int width, height;
}
#endif // wxUSE_STATUSBAR
- int x = 0;
- int y = 0;
+ int tx, ty, tw, th;
+ toolbar->GetPosition( &tx, &ty );
+ toolbar->GetSize( &tw, &th );
+
+ int x = 0, y = 0;
+ if ( toolbar->HasFlag(wxTB_BOTTOM) )
+ {
+ x = 0;
+ y = height - th;
+ }
+ else if ( toolbar->HasFlag(wxTB_RIGHT) )
+ {
+ x = width - tw;
+ y = 0;
+ }
+ else // left or top
+ {
+ x = 0;
+ y = 0;
+ }
+
#if defined(WINCE_WITH_COMMANDBAR)
// We're using a commandbar - so we have to allow for it.
if (GetMenuBar() && GetMenuBar()->GetCommandBar())
::GetWindowRect((HWND) GetMenuBar()->GetCommandBar(), &rect);
y = rect.bottom - rect.top;
}
-#endif
-
- int tx, ty;
- int tw, th;
- toolbar->GetPosition(&tx, &ty);
- toolbar->GetSize(&tw, &th);
+#endif // WINCE_WITH_COMMANDBAR
- // Adjust
- if (ty < 0 && (-ty == th))
- ty = 0;
- if (tx < 0 && (-tx == tw))
- tx = 0;
+ if ( toolbar->HasFlag(wxTB_BOTTOM) )
+ {
+ if ( ty < 0 && ( -ty == th ) )
+ ty = height - th;
+ if ( tx < 0 && (-tx == tw ) )
+ tx = 0;
+ }
+ else if ( toolbar->HasFlag(wxTB_RIGHT) )
+ {
+ if( ty < 0 && ( -ty == th ) )
+ ty = 0;
+ if( tx < 0 && ( -tx == tw ) )
+ tx = width - tw;
+ }
+ else // left or top
+ {
+ if (ty < 0 && (-ty == th))
+ ty = 0;
+ if (tx < 0 && (-tx == tw))
+ tx = 0;
+ }
int desiredW = tw;
int desiredH = th;
- if ( toolbar->GetWindowStyleFlag() & wxTB_VERTICAL )
+ if ( toolbar->IsVertical() )
{
desiredH = height;
}
else
{
desiredW = width;
-// if ( toolbar->GetWindowStyleFlag() & wxTB_FLAT )
-// desiredW -= 3;
}
// use the 'real' MSW position here, don't offset relativly to the
bool heightChanging wxDUMMY_INITIALIZE(true);
bool widthChanging wxDUMMY_INITIALIZE(true);
- if ( toolbar->GetWindowStyleFlag() & wxTB_VERTICAL )
+ if ( toolbar->IsVertical() )
{
// It's OK if the current height is greater than what can be shown.
heightChanging = (desiredH > th) ;
if (tx != 0 || ty != 0 || widthChanging || heightChanging)
toolbar->SetSize(x, y, desiredW, desiredH, wxSIZE_NO_ADJUSTMENTS);
-#endif // __WXWINCE__
}
+#endif // !WINCE_WITH_COMMANDBAR
}
#endif // wxUSE_TOOLBAR
// them appear in the taskbar because they are, by virtue of this
// style, not managed by the taskbar - instead leave Windows take care
// of them
-#ifdef __WIN95__
if ( win->GetWindowStyle() & wxFRAME_TOOL_WINDOW )
continue;
-#endif // Win95
// the child MDI frames are a special case and should not be touched by
// the parent frame - instead, they are managed by the user
// preprocessing
// ---------------------------------------------------------------------------
-bool wxFrame::MSWTranslateMessage(WXMSG* pMsg)
+bool wxFrame::MSWDoTranslateMessage(wxFrame *frame, WXMSG *pMsg)
{
if ( wxWindow::MSWTranslateMessage(pMsg) )
return true;
#if wxUSE_MENUS && wxUSE_ACCEL && !defined(__WXUNIVERSAL__)
// try the menu bar accels
wxMenuBar *menuBar = GetMenuBar();
- if ( !menuBar )
- return false;
+ if ( menuBar )
+ {
+ const wxAcceleratorTable& acceleratorTable = menuBar->GetAccelTable();
+ return acceleratorTable.Translate(frame, pMsg);
+ }
+#endif // wxUSE_MENUS && wxUSE_ACCEL
- const wxAcceleratorTable& acceleratorTable = menuBar->GetAccelTable();
- return acceleratorTable.Translate(this, pMsg);
-#else
return false;
-#endif // wxUSE_MENUS && wxUSE_ACCEL
}
// ---------------------------------------------------------------------------
return false;
}
+#if wxUSE_MENUS
+
bool wxFrame::HandleMenuSelect(WXWORD nItem, WXWORD flags, WXHMENU hMenu)
{
int item;
// items opening popup menus (they don't have them anyhow) but do clear
// the status line - otherwise, we would be left with the help message
// for the previous item which doesn't apply any more
- DoGiveHelp(wxEmptyString, false);
+ DoGiveHelp(wxEmptyString, true);
return false;
}
return GetEventHandler()->ProcessEvent(event);
}
+bool wxFrame::HandleInitMenuPopup(WXHMENU hMenu)
+{
+ wxMenu* menu = NULL;
+ if (GetMenuBar())
+ {
+ int nCount = GetMenuBar()->GetMenuCount();
+ for (int n = 0; n < nCount; n++)
+ {
+ if (GetMenuBar()->GetMenu(n)->GetHMenu() == hMenu)
+ {
+ menu = GetMenuBar()->GetMenu(n);
+ break;
+ }
+ }
+ }
+
+ wxMenuEvent event(wxEVT_MENU_OPEN, 0, menu);
+ event.SetEventObject(this);
+
+ return GetEventHandler()->ProcessEvent(event);
+}
+
+#endif // wxUSE_MENUS
+
// ---------------------------------------------------------------------------
// the window proc for wxFrame
// ---------------------------------------------------------------------------
switch ( message )
{
-#if defined(__SMARTPHONE__) || defined(__POCKETPC__)
- case WM_ACTIVATE:
- {
- SHACTIVATEINFO* info = (SHACTIVATEINFO*) m_activateInfo;
- if (info)
- SHHandleWMActivate(GetHwnd(), wParam, lParam, info, FALSE);
-
- // This implicitly sends a wxEVT_ACTIVATE_APP event
- if (wxTheApp)
- wxTheApp->SetActive(wParam != 0, FindFocus());
- break;
- }
- case WM_SETTINGCHANGE:
- {
- SHACTIVATEINFO* info = (SHACTIVATEINFO*) m_activateInfo;
- if (info)
- SHHandleWMSettingChange(GetHwnd(), wParam, lParam, info);
- processed = true;
- break;
- }
- case WM_HIBERNATE:
- {
- wxActivateEvent event(wxEVT_HIBERNATE, true, wxID_ANY);
- event.SetEventObject(wxTheApp);
-
- if (wxTheApp)
- {
- processed = wxTheApp->ProcessEvent(event);
- }
- break;
- }
-#endif
-
case WM_CLOSE:
// if we can't close, tell the system that we processed the
// message - otherwise it would close us
processed = HandlePaint();
break;
+#if !defined(__WXMICROWIN__) && !defined(__WXWINCE__)
+#if wxUSE_MENUS
case WM_INITMENUPOPUP:
processed = HandleInitMenuPopup((WXHMENU) wParam);
break;
-#if !defined(__WXMICROWIN__) && !defined(__WXWINCE__)
case WM_MENUSELECT:
{
WXWORD item, flags;
case WM_EXITMENULOOP:
processed = HandleMenuLoop(wxEVT_MENU_CLOSE, (WXWORD)wParam);
break;
+#endif // wxUSE_MENUS
case WM_QUERYDRAGICON:
{
return rc;
}
-// handle WM_INITMENUPOPUP message
-bool wxFrame::HandleInitMenuPopup(WXHMENU hMenu)
-{
- wxMenu* menu = NULL;
- if (GetMenuBar())
- {
- int nCount = GetMenuBar()->GetMenuCount();
- for (int n = 0; n < nCount; n++)
- {
- if (GetMenuBar()->GetMenu(n)->GetHMenu() == hMenu)
- {
- menu = GetMenuBar()->GetMenu(n);
- break;
- }
- }
- }
-
- wxMenuEvent event(wxEVT_MENU_OPEN, 0, menu);
- event.SetEventObject(this);
-
- return GetEventHandler()->ProcessEvent(event);
-}
-
// ----------------------------------------------------------------------------
// wxFrame size management: we exclude the areas taken by menu/status/toolbars
// from the client area, so the client area is what's really available for the
#if wxUSE_TOOLBAR && !defined(__WXUNIVERSAL__) && \
(!defined(__WXWINCE__) || (_WIN32_WCE >= 400 && !defined(__POCKETPC__) && !defined(__SMARTPHONE__)))
- wxToolBar *toolbar = GetToolBar();
+ wxToolBar * const toolbar = GetToolBar();
if ( toolbar && toolbar->IsShown() )
{
- int w, h;
- toolbar->GetSize(&w, &h);
+ const wxSize sizeTB = toolbar->GetSize();
- if ( toolbar->GetWindowStyleFlag() & wxTB_VERTICAL )
+ if ( toolbar->HasFlag(wxTB_TOP) )
{
- pt.x += w;
+ pt.y += sizeTB.y;
}
- else
+ else if ( toolbar->HasFlag(wxTB_LEFT) )
{
- pt.y += h;
+ pt.x += sizeTB.x;
}
}
#endif // wxUSE_TOOLBAR