extern void wxAssociateWinWithHandle( HWND hWnd
,wxWindowOS2* pWin
);
+bool wxTopLevelWindowOS2::m_sbInitialized = FALSE;
// ============================================================================
// wxTopLevelWindowMSW implementation
nX = (vSizeDpy.x - nWidth) / 2;
nY = (vSizeDpy.y - nHeight) / 2;
}
+ m_backgroundColour.Set(wxString("LIGHT GREY"));
+
+ LONG lColor = (LONG)m_backgroundColour.GetPixel();
+
+ if (!::WinSetPresParam( m_hWnd
+ ,PP_BACKGROUNDCOLOR
+ ,sizeof(LONG)
+ ,(PVOID)&lColor
+ ))
+ {
+ return FALSE;
+ }
+
::WinSetWindowPos( GetHwnd()
,HWND_TOP
,nX
,nHeight
,SWP_MOVE | SWP_SIZE | SWP_ZORDER | SWP_SHOW
);
- if (!rsTitle.IsNull())
- {
- ::WinSetWindowText(GetHwnd(), rsTitle.c_str());
- }
+ m_hFrame = m_hWnd;
SubclassWin(m_hWnd);
return TRUE;
} // end of wxTopLevelWindowOS2::CreateDialog
wxAssociateWinWithHandle(m_hWnd, this);
wxAssociateWinWithHandle(m_hFrame, this);
- m_backgroundColour.Set(wxString("GREY"));
+ m_backgroundColour.Set(wxString("MEDIUM GREY"));
LONG lColor = (LONG)m_backgroundColour.GetPixel();
wxLogError("Error sizing frame. Error: %s\n", sError);
return FALSE;
}
+ lStyle = ::WinQueryWindowULong( m_hWnd
+ ,QWL_STYLE
+ );
+ lStyle |= WS_CLIPCHILDREN;
+ ::WinSetWindowULong( m_hWnd
+ ,QWL_STYLE
+ ,lStyle
+ );
return TRUE;
} // end of wxTopLevelWindowOS2::CreateFrame
RECTL vRect;
SWP vSwp;
+ if (GetAutoLayout)
+ //
+ // Auto layouts taken care of elsewhere
+ //
+ return;
+
::WinQueryWindowRect(GetHwnd(), &vRect);
for (wxWindowList::Node* pNode = GetChildren().GetFirst();
pNode;
void wxTopLevelWindowOS2::UpdateInternalSize(
wxWindow* pChild
-, int nHeight
+, int nChildWidth
+, int nChildHeight
)
{
- pChild->MoveChildren(m_vSwpClient.cy - nHeight);
+ int nWidthAdjust = 0;
+ int nHeightAdjust = 0;
+ int nPosX;
+ int nPosY;
+ bool bNewYSize = FALSE;
+ bool bNewXSize = FALSE;
+
+ //
+ // Under OS/2, if we have a srolled window as the child, the
+ // scrollbars will be SIBLINGS of the scrolled window. So, in
+ // order to be able to display the scrollbars properly we have to
+ // resize the scrolled window. Of course, that means dealing with
+ // child windows of that window as well, because OS/2 does not
+ // tend to put them in the right place.
+ //
+ if (nChildHeight != m_vSwpClient.cy)
+ bNewYSize = TRUE;
+ if (nChildWidth != m_vSwpClient.cx)
+ bNewXSize = TRUE;
+ if (bNewXSize || bNewYSize)
+ pChild->SetSize( 0
+ ,0
+ ,nChildWidth
+ ,nChildHeight
+ );
+ if(bNewYSize)
+ {
+ //
+ // This is needed SetSize will mess up the OS/2 child window
+ // positioning because we position in wxWindows coordinates,
+ // not OS/2 coordinates.
+ //
+ pChild->MoveChildren(m_vSwpClient.cy - nChildHeight);
+ pChild->Refresh();
+ }
+
+ if (pChild->GetScrollBarHorz() != NULLHANDLE ||
+ pChild->GetScrollBarVert() != NULLHANDLE)
+ {
+ if (bNewXSize || bNewYSize)
+ {
+ pChild->GetSize( &nChildWidth
+ ,&nChildHeight
+ );
+ if (pChild->GetScrollBarHorz() != NULLHANDLE)
+ nHeightAdjust = 20;
+ if (pChild->GetScrollBarVert() != NULLHANDLE)
+ nWidthAdjust = 20;
+ pChild->GetPosition( &nPosX
+ ,&nPosY
+ );
+ ::WinSetWindowPos( pChild->GetHWND()
+ ,HWND_TOP
+ ,nPosX
+ ,nPosY + nHeightAdjust
+ ,nChildWidth - nWidthAdjust
+ ,nChildHeight - nHeightAdjust
+ ,SWP_MOVE | SWP_SIZE
+ );
+ }
+ if (bNewYSize && !m_sbInitialized)
+ {
+ //
+ // Only need to readjust child control positions of
+ // scrolled windows once on initialization. After that
+ // the sizing takes care of things itself.
+ //
+ pChild->MoveChildren(nHeightAdjust);
+ m_sbInitialized = TRUE;
+ }
+ if (bNewXSize || bNewYSize)
+ {
+ //
+ // Always refresh to keep scollbars visible. They are
+ // children of the Toplevel window, not the child panel.
+ //
+ pChild->Refresh();
+ }
+ }
+ //
+ // This brings the internal "last size" up to date.
+ //
::WinQueryWindowPos(GetHwnd(), &m_vSwpClient);
} // end of wxTopLevelWindowOS2::UpdateInternalSize
int nShowCmd
)
{
- ::WinShowWindow(m_hFrame, (BOOL)nShowCmd);
+ ::WinShowWindow(m_hFrame, (BOOL)(nShowCmd & SWP_SHOW));
+
+ //
+ // Need to artificially send a size event as wxApps often expect to do some
+ // final child control sizing
+ SendSizeEvent();
m_bIconized = nShowCmd == SWP_MINIMIZE;
} // end of wxTopLevelWindowOS2::DoShowWindow
{
if (m_bMaximizeOnShow)
{
- nShowCmd = SWP_SHOW;
+ nShowCmd = SWP_MAXIMIZE;
m_bMaximizeOnShow = FALSE;
}
else
{
- nShowCmd = SWP_HIDE;
+ nShowCmd = SWP_SHOW;
}
}
else // hide
DoShowWindow(SWP_RESTORE);
} // end of wxTopLevelWindowOS2::Restore
+// generate an artificial resize event
+void wxTopLevelWindowOS2::SendSizeEvent()
+{
+ if (!m_bIconized)
+ {
+ RECTL vRect = wxGetWindowRect(GetHwnd());
+
+ (void)::WinPostMsg( m_hFrame
+ ,WM_SIZE
+ ,MPFROM2SHORT(vRect.xRight - vRect.xLeft, vRect.yTop - vRect.yBottom)
+ ,MPFROM2SHORT(vRect.xRight - vRect.xLeft, vRect.yTop - vRect.yBottom)
+ );
+ }
+} // end of wxTopLevelWindowOS2::SendSizeEvent
+
// ----------------------------------------------------------------------------
// wxTopLevelWindowOS2 fullscreen
// ----------------------------------------------------------------------------