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_nFsToolBarHeight = 0;
m_bFsIsMaximized = FALSE; m_bFsIsMaximized = FALSE;
m_bFsIsShowing = FALSE; m_bFsIsShowing = FALSE;
m_bIsShown = FALSE;
m_pWinLastFocused = (wxWindow *)NULL;
// //
// Initialize SWP's // Initialize SWP's
@@ -290,9 +292,9 @@ void wxFrame::DoSetClientSize(
POINTL vPointl; POINTL vPointl;
vPointl.x = vRect2.xLeft; vPointl.x = vRect2.xLeft;
vPoint.y = vRect2.yTop; vPointl.y = vRect2.yTop;
::WinSetWindowPos( m_hFrame ::WinSetWindowPos( hWnd
,HWND_TOP ,HWND_TOP
,vPointl.x ,vPointl.x
,vPointl.y ,vPointl.y
@@ -350,23 +352,8 @@ void wxFrame::DoShowWindow(
int bShowCmd 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(m_hFrame, (BOOL)bShowCmd);
::WinShowWindow(GetHwnd(), (BOOL)bShowCmd); m_bIconized = bShowCmd == SWP_MINIMIZE;
} // end of wxFrame::DoShowWindow } // end of wxFrame::DoShowWindow
bool wxFrame::Show( bool wxFrame::Show(
@@ -434,7 +421,6 @@ void wxFrame::Restore()
bool wxFrame::IsIconized() const bool wxFrame::IsIconized() const
{ {
SWP vSwp; SWP vSwp;
bool bIconic;
::WinQueryWindowPos(GetHwnd(), &vSwp); ::WinQueryWindowPos(GetHwnd(), &vSwp);
@@ -626,15 +612,23 @@ void wxFrame::SetMenuBar(
if (!pMenuBar) if (!pMenuBar)
{ {
DetachMenuBar(); DetachMenuBar();
return;
}
//
// Actually remove the menu from the frame
//
m_hMenu = (WXHMENU)0;
InternalSetMenuBar();
}
else // set new non NULL menu bar
{
m_frameMenuBar = NULL; m_frameMenuBar = NULL;
//
// Can set a menubar several times. // Can set a menubar several times.
// TODO: how to prevent a memory leak if you have a currently-unattached // TODO: how to prevent a memory leak if you have a currently-unattached
// menubar? wxWindows assumes that the frame will delete the menu (otherwise // menubar? wxWindows assumes that the frame will delete the menu (otherwise
// there are problems for MDI). // there are problems for MDI).
//
if (pMenuBar->GetHMenu()) if (pMenuBar->GetHMenu())
{ {
m_hMenu = pMenuBar->GetHMenu(); m_hMenu = pMenuBar->GetHMenu();
@@ -642,33 +636,14 @@ void wxFrame::SetMenuBar(
else else
{ {
pMenuBar->Detach(); pMenuBar->Detach();
m_hMenu = pMenuBar->Create(); m_hMenu = pMenuBar->Create();
if (!m_hMenu) if (!m_hMenu)
return; 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(); InternalSetMenuBar();
m_frameMenuBar = pMenuBar; m_frameMenuBar = pMenuBar;
pMenuBar->Attach(this); pMenuBar->Attach(this);
}
// //
// Now resize the client to fit the new frame // Now resize the client to fit the new frame
@@ -694,6 +669,24 @@ void wxFrame::SetMenuBar(
void wxFrame::InternalSetMenuBar() 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); WinSendMsg((HWND)m_hFrame, WM_UPDATEFRAME, (MPARAM)FCF_MENU, (MPARAM)0);
} // end of wxFrame::InternalSetMenuBar } // end of wxFrame::InternalSetMenuBar
@@ -727,86 +720,122 @@ bool wxFrame::ShowFullScreen(
, long lStyle , long lStyle
) )
{ {
/* if (bShow)
// TODO
if (show)
{ {
if (IsFullScreen()) if (IsFullScreen())
return FALSE; return FALSE;
m_fsIsShowing = TRUE; m_bFsIsShowing = TRUE;
m_fsStyle = style; m_lFsStyle = lStyle;
wxToolBar *theToolBar = GetToolBar(); wxToolBar* pTheToolBar = GetToolBar();
wxStatusBar *theStatusBar = GetStatusBar(); wxStatusBar* pTheStatusBar = GetStatusBar();
int dummyWidth; int nDummyWidth;
if (theToolBar) if (pTheToolBar)
theToolBar->GetSize(&dummyWidth, &m_fsToolBarHeight); pTheToolBar->GetSize(&nDummyWidth, &m_nFsToolBarHeight);
if (theStatusBar) if (pTheStatusBar)
theStatusBar->GetSize(&dummyWidth, &m_fsStatusBarHeight); pTheStatusBar->GetSize(&nDummyWidth, &m_nFsStatusBarHeight);
// zap the toolbar, menubar, and statusbar //
// Zap the toolbar, menubar, and statusbar
if ((style & wxFULLSCREEN_NOTOOLBAR) && theToolBar) //
if ((lStyle & wxFULLSCREEN_NOTOOLBAR) && pTheToolBar)
{ {
theToolBar->SetSize(-1,0); pTheToolBar->SetSize(-1,0);
theToolBar->Show(FALSE); pTheToolBar->Show(FALSE);
} }
if (style & wxFULLSCREEN_NOMENUBAR) if (lStyle & wxFULLSCREEN_NOMENUBAR)
SetMenu((HWND)GetHWND(), (HMENU) NULL);
// Save the number of fields in the statusbar
if ((style & wxFULLSCREEN_NOSTATUSBAR) && theStatusBar)
{ {
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); SetStatusBar((wxStatusBar*) NULL);
delete theStatusBar; delete pTheStatusBar;
} }
else 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(); // Save the old position, width & height, maximize state
m_fsIsMaximized = IsMaximized(); //
m_vFsOldSize = GetRect();
m_bFsIsMaximized = IsMaximized();
// decide which window style flags to turn off //
LONG newStyle = m_fsOldWindowStyle; // Decide which window style flags to turn off
LONG offFlags = 0; //
LONG lNewStyle = m_lFsOldWindowStyle;
LONG lOffFlags = 0;
if (style & wxFULLSCREEN_NOBORDER) if (lStyle & wxFULLSCREEN_NOBORDER)
offFlags |= WS_BORDER; lOffFlags |= FCF_BORDER;
if (style & wxFULLSCREEN_NOCAPTION) if (lStyle & wxFULLSCREEN_NOCAPTION)
offFlags |= (WS_CAPTION | WS_SYSMENU); 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; RECTL vRect;
::GetWindowRect(GetDesktopWindow(), &rect);
width = rect.right - rect.left;
height = rect.bottom - rect.top;
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 SetSize( nWidth
SetWindowPos((HWND)GetHWND(), HWND_TOP, 0, 0, width, height, SWP_FRAMECHANGED); ,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; return TRUE;
} }
else else
@@ -814,35 +843,47 @@ bool wxFrame::ShowFullScreen(
if (!IsFullScreen()) if (!IsFullScreen())
return FALSE; 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); pTheToolBar->SetSize(-1, m_nFsToolBarHeight);
theToolBar->Show(TRUE); 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(); PositionStatusBar();
} }
if ((m_fsStyle & wxFULLSCREEN_NOMENUBAR) && (m_hMenu != 0)) if ((m_lFsStyle & wxFULLSCREEN_NOMENUBAR) && (m_hMenu != 0))
SetMenu((HWND)GetHWND(), (HMENU)m_hMenu); {
::WinSetParent(m_hMenu, m_hFrame, FALSE);
Maximize(m_fsIsMaximized); ::WinSetOwner(m_hMenu, m_hFrame);
SetWindowLong((HWND)GetHWND(),GWL_STYLE, m_fsOldWindowStyle); ::WinSendMsg((HWND)m_hFrame, WM_UPDATEFRAME, (MPARAM)FCF_MENU, (MPARAM)0);
SetWindowPos((HWND)GetHWND(),HWND_TOP,m_fsOldSize.x, m_fsOldSize.y, }
m_fsOldSize.width, m_fsOldSize.height, SWP_FRAMECHANGED); 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;
} }
*/
return TRUE;
} // end of wxFrame::ShowFullScreen } // end of wxFrame::ShowFullScreen
// //
@@ -969,7 +1010,7 @@ bool wxFrame::OS2Create(
,0L ,0L
,0L ,0L
,0L ,0L
,NULLHANDLE ,m_hFrame
,HWND_TOP ,HWND_TOP
,(unsigned long)FID_CLIENT ,(unsigned long)FID_CLIENT
,NULL ,NULL
@@ -1004,22 +1045,6 @@ bool wxFrame::OS2Create(
else if (vSwp[i].hwnd == m_hTitleBar) else if (vSwp[i].hwnd == m_hTitleBar)
memcpy(&m_vSwpTitleBar, &vSwp[i], sizeof(SWP)); 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; return TRUE;
} // end of wxFrame::OS2Create } // end of wxFrame::OS2Create
@@ -1219,7 +1244,7 @@ bool wxFrame::HandlePaint()
{ {
RECTL vRect; RECTL vRect;
if (::WinQueryUpdateRect(m_hFrame, &vRect)) if (::WinQueryUpdateRect(GetHwnd(), &vRect))
{ {
if (m_bIconized) if (m_bIconized)
{ {
@@ -1238,7 +1263,7 @@ bool wxFrame::HandlePaint()
// is being processed // is being processed
// //
RECTL vRect2; RECTL vRect2;
HPS hPs = ::WinBeginPaint(m_hFrame, NULLHANDLE, &vRect2); HPS hPs = ::WinBeginPaint(GetHwnd(), NULLHANDLE, &vRect2);
// //
// Erase background before painting or we get white background // Erase background before painting or we get white background