New frame class

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@8119 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
David Webster 2000-08-17 20:49:41 +00:00
parent 7cc92097f6
commit 64e0c5c617

View File

@ -90,6 +90,8 @@ void wxFrame::Init()
m_nFsToolBarHeight = 0;
m_bFsIsMaximized = FALSE;
m_bFsIsShowing = FALSE;
m_bIsShown = FALSE;
m_pWinLastFocused = (wxWindow *)NULL;
//
// Initialize SWP's
@ -290,9 +292,9 @@ void wxFrame::DoSetClientSize(
POINTL vPointl;
vPointl.x = vRect2.xLeft;
vPoint.y = vRect2.yTop;
vPointl.y = vRect2.yTop;
::WinSetWindowPos( m_hFrame
::WinSetWindowPos( hWnd
,HWND_TOP
,vPointl.x
,vPointl.y
@ -350,23 +352,8 @@ void wxFrame::DoShowWindow(
int bShowCmd
)
{
HWND hClient = NULLHANDLE;
SWP vSwp;
//
// Reset the window position
//
WinQueryWindowPos(m_hFrame, &vSwp);
WinSetWindowPos( GetHwnd()
,HWND_TOP
,vSwp.x
,vSwp.y
,vSwp.cx
,vSwp.cy
,SWP_SIZE | SWP_MOVE | SWP_ACTIVATE
);
::WinShowWindow(m_hFrame, (BOOL)bShowCmd);
::WinShowWindow(GetHwnd(), (BOOL)bShowCmd);
m_bIconized = bShowCmd == SWP_MINIMIZE;
} // end of wxFrame::DoShowWindow
bool wxFrame::Show(
@ -434,7 +421,6 @@ void wxFrame::Restore()
bool wxFrame::IsIconized() const
{
SWP vSwp;
bool bIconic;
::WinQueryWindowPos(GetHwnd(), &vSwp);
@ -626,49 +612,38 @@ void wxFrame::SetMenuBar(
if (!pMenuBar)
{
DetachMenuBar();
return;
//
// Actually remove the menu from the frame
//
m_hMenu = (WXHMENU)0;
InternalSetMenuBar();
}
m_frameMenuBar = NULL;
// Can set a menubar several times.
// TODO: how to prevent a memory leak if you have a currently-unattached
// menubar? wxWindows assumes that the frame will delete the menu (otherwise
// there are problems for MDI).
if (pMenuBar->GetHMenu())
else // set new non NULL menu bar
{
m_hMenu = pMenuBar->GetHMenu();
m_frameMenuBar = NULL;
//
// Can set a menubar several times.
// TODO: how to prevent a memory leak if you have a currently-unattached
// menubar? wxWindows assumes that the frame will delete the menu (otherwise
// there are problems for MDI).
//
if (pMenuBar->GetHMenu())
{
m_hMenu = pMenuBar->GetHMenu();
}
else
{
pMenuBar->Detach();
m_hMenu = pMenuBar->Create();
if (!m_hMenu)
return;
}
InternalSetMenuBar();
m_frameMenuBar = pMenuBar;
pMenuBar->Attach(this);
}
else
{
pMenuBar->Detach();
m_hMenu = pMenuBar->Create();
if (!m_hMenu)
return;
}
//
// Set the parent and owner of the menubar to be the frame
//
if (!::WinSetParent(m_hMenu, m_hFrame, FALSE))
{
vError = ::WinGetLastError(vHabmain);
sError = wxPMErrorToStr(vError);
wxLogError("Error setting parent for submenu. Error: %s\n", sError);
}
if (!::WinSetOwner(m_hMenu, m_hFrame))
{
vError = ::WinGetLastError(vHabmain);
sError = wxPMErrorToStr(vError);
wxLogError("Error setting parent for submenu. Error: %s\n", sError);
}
InternalSetMenuBar();
m_frameMenuBar = pMenuBar;
pMenuBar->Attach(this);
//
// Now resize the client to fit the new frame
@ -694,6 +669,24 @@ void wxFrame::SetMenuBar(
void wxFrame::InternalSetMenuBar()
{
ERRORID vError;
wxString sError;
//
// Set the parent and owner of the menubar to be the frame
//
if (!::WinSetParent(m_hMenu, m_hFrame, FALSE))
{
vError = ::WinGetLastError(vHabmain);
sError = wxPMErrorToStr(vError);
wxLogError("Error setting parent for submenu. Error: %s\n", sError);
}
if (!::WinSetOwner(m_hMenu, m_hFrame))
{
vError = ::WinGetLastError(vHabmain);
sError = wxPMErrorToStr(vError);
wxLogError("Error setting parent for submenu. Error: %s\n", sError);
}
WinSendMsg((HWND)m_hFrame, WM_UPDATEFRAME, (MPARAM)FCF_MENU, (MPARAM)0);
} // end of wxFrame::InternalSetMenuBar
@ -727,86 +720,122 @@ bool wxFrame::ShowFullScreen(
, long lStyle
)
{
/*
// TODO
if (show)
if (bShow)
{
if (IsFullScreen())
return FALSE;
m_fsIsShowing = TRUE;
m_fsStyle = style;
m_bFsIsShowing = TRUE;
m_lFsStyle = lStyle;
wxToolBar *theToolBar = GetToolBar();
wxStatusBar *theStatusBar = GetStatusBar();
wxToolBar* pTheToolBar = GetToolBar();
wxStatusBar* pTheStatusBar = GetStatusBar();
int dummyWidth;
int nDummyWidth;
if (theToolBar)
theToolBar->GetSize(&dummyWidth, &m_fsToolBarHeight);
if (theStatusBar)
theStatusBar->GetSize(&dummyWidth, &m_fsStatusBarHeight);
if (pTheToolBar)
pTheToolBar->GetSize(&nDummyWidth, &m_nFsToolBarHeight);
if (pTheStatusBar)
pTheStatusBar->GetSize(&nDummyWidth, &m_nFsStatusBarHeight);
// zap the toolbar, menubar, and statusbar
if ((style & wxFULLSCREEN_NOTOOLBAR) && theToolBar)
//
// Zap the toolbar, menubar, and statusbar
//
if ((lStyle & wxFULLSCREEN_NOTOOLBAR) && pTheToolBar)
{
theToolBar->SetSize(-1,0);
theToolBar->Show(FALSE);
pTheToolBar->SetSize(-1,0);
pTheToolBar->Show(FALSE);
}
if (style & wxFULLSCREEN_NOMENUBAR)
SetMenu((HWND)GetHWND(), (HMENU) NULL);
// Save the number of fields in the statusbar
if ((style & wxFULLSCREEN_NOSTATUSBAR) && theStatusBar)
if (lStyle & wxFULLSCREEN_NOMENUBAR)
{
m_fsStatusBarFields = theStatusBar->GetFieldsCount();
::WinSetParent(m_hMenu, m_hFrame, FALSE);
::WinSetOwner(m_hMenu, m_hFrame);
::WinSendMsg((HWND)m_hFrame, WM_UPDATEFRAME, (MPARAM)FCF_MENU, (MPARAM)0);
}
//
// Save the number of fields in the statusbar
//
if ((lStyle & wxFULLSCREEN_NOSTATUSBAR) && pTheStatusBar)
{
m_nFsStatusBarFields = pTheStatusBar->GetFieldsCount();
SetStatusBar((wxStatusBar*) NULL);
delete theStatusBar;
delete pTheStatusBar;
}
else
m_fsStatusBarFields = 0;
m_nFsStatusBarFields = 0;
// zap the frame borders
//
// Zap the frame borders
//
// save the 'normal' window style
m_fsOldWindowStyle = GetWindowLong((HWND)GetHWND(), GWL_STYLE);
//
// Save the 'normal' window style
//
m_lFsOldWindowStyle = ::WinQueryWindowULong((HWND)GetHWND(), QWL_STYLE);
// save the old position, width & height, maximize state
m_fsOldSize = GetRect();
m_fsIsMaximized = IsMaximized();
//
// Save the old position, width & height, maximize state
//
m_vFsOldSize = GetRect();
m_bFsIsMaximized = IsMaximized();
// decide which window style flags to turn off
LONG newStyle = m_fsOldWindowStyle;
LONG offFlags = 0;
//
// Decide which window style flags to turn off
//
LONG lNewStyle = m_lFsOldWindowStyle;
LONG lOffFlags = 0;
if (style & wxFULLSCREEN_NOBORDER)
offFlags |= WS_BORDER;
if (style & wxFULLSCREEN_NOCAPTION)
offFlags |= (WS_CAPTION | WS_SYSMENU);
if (lStyle & wxFULLSCREEN_NOBORDER)
lOffFlags |= FCF_BORDER;
if (lStyle & wxFULLSCREEN_NOCAPTION)
lOffFlags |= (FCF_TASKLIST | FCF_SYSMENU);
newStyle &= (~offFlags);
lNewStyle &= (~lOffFlags);
// change our window style to be compatible with full-screen mode
SetWindowLong((HWND)GetHWND(), GWL_STYLE, newStyle);
//
// Change our window style to be compatible with full-screen mode
//
::WinSetWindowULong((HWND)GetHWND(), QWL_STYLE, (ULONG)lNewStyle);
// resize to the size of the desktop
int width, height;
//
// Resize to the size of the desktop
int nWidth;
int nHeight;
RECT rect;
::GetWindowRect(GetDesktopWindow(), &rect);
width = rect.right - rect.left;
height = rect.bottom - rect.top;
RECTL vRect;
SetSize(width, height);
::WinQueryWindowRect(HWND_DESKTOP, &vRect);
nWidth = vRect.xRight - vRect.xLeft;
//
// Rmember OS/2 is backwards!
//
nHeight = vRect.yTop - vRect.yBottom;
// now flush the window style cache and actually go full-screen
SetWindowPos((HWND)GetHWND(), HWND_TOP, 0, 0, width, height, SWP_FRAMECHANGED);
SetSize( nWidth
,nHeight
);
wxSizeEvent event(wxSize(width, height), GetId());
GetEventHandler()->ProcessEvent(event);
//
// Now flush the window style cache and actually go full-screen
//
::WinSetWindowPos( (HWND) GetParent()->GetHWND()
,HWND_TOP
,0
,0
,nWidth
,nHeight
,SWP_SIZE | SWP_SHOW
);
wxSizeEvent vEvent( wxSize( nWidth
,nHeight
)
,GetId()
);
GetEventHandler()->ProcessEvent(vEvent);
return TRUE;
}
else
@ -814,35 +843,47 @@ bool wxFrame::ShowFullScreen(
if (!IsFullScreen())
return FALSE;
m_fsIsShowing = FALSE;
m_bFsIsShowing = FALSE;
wxToolBar *theToolBar = GetToolBar();
wxToolBar* pTheToolBar = GetToolBar();
// restore the toolbar, menubar, and statusbar
if (theToolBar && (m_fsStyle & wxFULLSCREEN_NOTOOLBAR))
//
// Restore the toolbar, menubar, and statusbar
//
if (pTheToolBar && (m_lFsStyle & wxFULLSCREEN_NOTOOLBAR))
{
theToolBar->SetSize(-1, m_fsToolBarHeight);
theToolBar->Show(TRUE);
pTheToolBar->SetSize(-1, m_nFsToolBarHeight);
pTheToolBar->Show(TRUE);
}
if ((m_fsStyle & wxFULLSCREEN_NOSTATUSBAR) && (m_fsStatusBarFields > 0))
if ((m_lFsStyle & wxFULLSCREEN_NOSTATUSBAR) && (m_nFsStatusBarFields > 0))
{
CreateStatusBar(m_fsStatusBarFields);
CreateStatusBar(m_nFsStatusBarFields);
PositionStatusBar();
}
if ((m_fsStyle & wxFULLSCREEN_NOMENUBAR) && (m_hMenu != 0))
SetMenu((HWND)GetHWND(), (HMENU)m_hMenu);
Maximize(m_fsIsMaximized);
SetWindowLong((HWND)GetHWND(),GWL_STYLE, m_fsOldWindowStyle);
SetWindowPos((HWND)GetHWND(),HWND_TOP,m_fsOldSize.x, m_fsOldSize.y,
m_fsOldSize.width, m_fsOldSize.height, SWP_FRAMECHANGED);
if ((m_lFsStyle & wxFULLSCREEN_NOMENUBAR) && (m_hMenu != 0))
{
::WinSetParent(m_hMenu, m_hFrame, FALSE);
::WinSetOwner(m_hMenu, m_hFrame);
::WinSendMsg((HWND)m_hFrame, WM_UPDATEFRAME, (MPARAM)FCF_MENU, (MPARAM)0);
}
Maximize(m_bFsIsMaximized);
::WinSetWindowULong( (HWND)GetHWND()
,QWL_STYLE
,(ULONG)m_lFsOldWindowStyle
);
::WinSetWindowPos( (HWND) GetParent()->GetHWND()
,HWND_TOP
,m_vFsOldSize.x
,m_vFsOldSize.y
,m_vFsOldSize.width
,m_vFsOldSize.height
,SWP_SIZE | SWP_SHOW
);
return TRUE;
}
*/
return TRUE;
} // end of wxFrame::ShowFullScreen
//
@ -969,7 +1010,7 @@ bool wxFrame::OS2Create(
,0L
,0L
,0L
,NULLHANDLE
,m_hFrame
,HWND_TOP
,(unsigned long)FID_CLIENT
,NULL
@ -1004,22 +1045,6 @@ bool wxFrame::OS2Create(
else if (vSwp[i].hwnd == m_hTitleBar)
memcpy(&m_vSwpTitleBar, &vSwp[i], sizeof(SWP));
}
//
// Now set the size of the client
//
WinSetWindowPos( hClient
,HWND_TOP
,SV_CXSIZEBORDER/2
,(SV_CYSIZEBORDER/2) + m_vSwpHScroll.cy/2
,m_vSwp.cx - ((SV_CXSIZEBORDER + 1) + m_vSwpVScroll.cx)
,m_vSwp.cy - ((SV_CYSIZEBORDER + 1) + m_vSwpTitleBar.cy + m_vSwpHScroll.cy/2)
,SWP_SIZE | SWP_MOVE
);
//
// Set the client window's background, otherwise it is transparent!
//
return TRUE;
} // end of wxFrame::OS2Create
@ -1219,7 +1244,7 @@ bool wxFrame::HandlePaint()
{
RECTL vRect;
if (::WinQueryUpdateRect(m_hFrame, &vRect))
if (::WinQueryUpdateRect(GetHwnd(), &vRect))
{
if (m_bIconized)
{
@ -1238,7 +1263,7 @@ bool wxFrame::HandlePaint()
// is being processed
//
RECTL vRect2;
HPS hPs = ::WinBeginPaint(m_hFrame, NULLHANDLE, &vRect2);
HPS hPs = ::WinBeginPaint(GetHwnd(), NULLHANDLE, &vRect2);
//
// Erase background before painting or we get white background