OS/2 scrolling support

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@13988 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
David Webster
2002-02-04 04:19:14 +00:00
parent cafbad8f17
commit 45e0dc9477
10 changed files with 344 additions and 249 deletions

View File

@@ -33,8 +33,6 @@ enum wxRegionOp { wxRGN_AND // Creates the intersection of the two combi
class WXDLLEXPORT wxRegion : public wxGDIObject class WXDLLEXPORT wxRegion : public wxGDIObject
{ {
DECLARE_DYNAMIC_CLASS(wxRegion);
friend class WXDLLEXPORT wxRegionIterator;
public: public:
wxRegion( wxCoord x wxRegion( wxCoord x
,wxCoord y ,wxCoord y
@@ -67,6 +65,10 @@ public:
// //
void Clear(void); void Clear(void);
bool Offset( wxCoord x
,wxCoord y
);
// //
// Union rectangle or region with this. // Union rectangle or region with this.
// //
@@ -208,6 +210,14 @@ public:
// //
WXHRGN GetHRGN(void) const; WXHRGN GetHRGN(void) const;
void SetPS(HPS hPS); void SetPS(HPS hPS);
protected:
virtual wxObjectRefData* CreateData(void) const;
virtual wxObjectRefData* CloneData(wxObjectRefData* pData) const;
friend class WXDLLEXPORT wxRegionIterator;
DECLARE_DYNAMIC_CLASS(wxRegion);
}; // end of CLASS wxRegion }; // end of CLASS wxRegion
class WXDLLEXPORT wxRegionIterator : public wxObject class WXDLLEXPORT wxRegionIterator : public wxObject

View File

@@ -85,8 +85,10 @@ public:
// //
virtual void AlterChildPos(void); // OS/2 child control positioning virtual void AlterChildPos(void); // OS/2 child control positioning
virtual void UpdateInternalSize( wxWindow* pChild virtual void UpdateInternalSize( wxWindow* pChild
,int nWidth
,int nHeight ,int nHeight
); );
PSWP GetSwpClient(void) { return &m_vSwpClient; }
protected: protected:
// //
// Common part of all ctors // Common part of all ctors
@@ -157,6 +159,7 @@ protected:
WXHWND m_hFrame; WXHWND m_hFrame;
SWP m_vSwp; SWP m_vSwp;
SWP m_vSwpClient; SWP m_vSwpClient;
static bool m_sbInitialized;
}; // end of CLASS wxTopLevelWindowOS2 }; // end of CLASS wxTopLevelWindowOS2
// //

View File

@@ -142,6 +142,8 @@ public:
,const wxRect* pRect = (wxRect *)NULL ,const wxRect* pRect = (wxRect *)NULL
); );
inline HWND GetScrollBarHorz(void) const {return m_hWndScrollBarHorz;}
inline HWND GetScrollBarVert(void) const {return m_hWndScrollBarVert;};
#if wxUSE_DRAG_AND_DROP #if wxUSE_DRAG_AND_DROP
virtual void SetDropTarget(wxDropTarget* pDropTarget); virtual void SetDropTarget(wxDropTarget* pDropTarget);
#endif // wxUSE_DRAG_AND_DROP #endif // wxUSE_DRAG_AND_DROP
@@ -539,6 +541,7 @@ protected:
#endif // wxUSE_TOOLTIPS #endif // wxUSE_TOOLTIPS
int GetOS2ParentHeight(wxWindowOS2* pParent); int GetOS2ParentHeight(wxWindowOS2* pParent);
virtual void OS2Layout(int nWidth, int nHeight);
private: private:
// common part of all ctors // common part of all ctors
@@ -561,9 +564,11 @@ private:
// the helper functions used by HandleChar/KeyXXX methods // the helper functions used by HandleChar/KeyXXX methods
wxKeyEvent CreateKeyEvent(wxEventType evType, int id, WXLPARAM lp) const; wxKeyEvent CreateKeyEvent(wxEventType evType, int id, WXLPARAM lp) const;
DECLARE_DYNAMIC_CLASS(wxWindowOS2); DECLARE_DYNAMIC_CLASS(wxWindowOS2);
DECLARE_NO_COPY_CLASS(wxWindowOS2) DECLARE_NO_COPY_CLASS(wxWindowOS2)
DECLARE_EVENT_TABLE() DECLARE_EVENT_TABLE()
private: private:
HWND m_hWndScrollBarHorz; HWND m_hWndScrollBarHorz;
HWND m_hWndScrollBarVert; HWND m_hWndScrollBarVert;

View File

@@ -127,6 +127,7 @@ public:
// method updates any internal sizing parameters such as OS/2's SWP struct // method updates any internal sizing parameters such as OS/2's SWP struct
inline virtual void AlterChildPos(void) { } inline virtual void AlterChildPos(void) { }
inline virtual void UpdateInternalSize( wxWindow* WXUNUSED(pChild) inline virtual void UpdateInternalSize( wxWindow* WXUNUSED(pChild)
,int WXUNUSED(nWidth)
,int WXUNUSED(nHeight) ,int WXUNUSED(nHeight)
) { } ) { }

View File

@@ -845,6 +845,7 @@ protected:
bool m_themeEnabled; bool m_themeEnabled;
protected: protected:
// common part of all ctors: it is not virtual because it is called from // common part of all ctors: it is not virtual because it is called from
// ctor // ctor
void InitBase(); void InitBase();
@@ -935,7 +936,13 @@ protected:
// a toolbar that it manages itself). // a toolbar that it manages itself).
virtual void AdjustForParentClientOrigin(int& x, int& y, int sizeFlags); virtual void AdjustForParentClientOrigin(int& x, int& y, int sizeFlags);
#ifdef __WXPM__
// extra OS/2 layout processing
virtual void OS2Layout(int width, int height) { };
#endif
private: private:
// contains the last id generated by NewControlId // contains the last id generated by NewControlId
static int ms_lastControlId; static int ms_lastControlId;

View File

@@ -162,9 +162,13 @@ void wxTopLevelWindowBase::OnSize(wxSizeEvent& WXUNUSED(event))
static const int ofs = 0; static const int ofs = 0;
#endif #endif
child->SetSize(ofs, ofs, clientW - 2*ofs, clientH - 2*ofs);
#ifdef __WXPM__ #ifdef __WXPM__
UpdateInternalSize(child, clientH); // OS/2 PM has to do a LOT of stuff to get things
// positioned right, especially if the child is a
// scrolled window.
UpdateInternalSize(child, clientW, clientH);
#else
child->SetSize(ofs, ofs, clientW - 2*ofs, clientH - 2*ofs);
#endif #endif
} }
} }

View File

@@ -1161,6 +1161,9 @@ bool wxWindowBase::Layout()
GetClientSize(&w, &h); GetClientSize(&w, &h);
GetSizer()->SetDimension( 0, 0, w, h ); GetSizer()->SetDimension( 0, 0, w, h );
#if defined __WXPM__
OS2Layout(w, h);
#endif
} }
else else
{ {

View File

@@ -56,6 +56,7 @@ wxWindowList wxModelessWindows;
extern void wxAssociateWinWithHandle( HWND hWnd extern void wxAssociateWinWithHandle( HWND hWnd
,wxWindowOS2* pWin ,wxWindowOS2* pWin
); );
bool wxTopLevelWindowOS2::m_sbInitialized = FALSE;
// ============================================================================ // ============================================================================
// wxTopLevelWindowMSW implementation // wxTopLevelWindowMSW implementation
@@ -515,6 +516,12 @@ void wxTopLevelWindowOS2::AlterChildPos()
RECTL vRect; RECTL vRect;
SWP vSwp; SWP vSwp;
if (GetAutoLayout)
//
// Auto layouts taken care of elsewhere
//
return;
::WinQueryWindowRect(GetHwnd(), &vRect); ::WinQueryWindowRect(GetHwnd(), &vRect);
for (wxWindowList::Node* pNode = GetChildren().GetFirst(); for (wxWindowList::Node* pNode = GetChildren().GetFirst();
pNode; pNode;
@@ -551,10 +558,92 @@ void wxTopLevelWindowOS2::AlterChildPos()
void wxTopLevelWindowOS2::UpdateInternalSize( void wxTopLevelWindowOS2::UpdateInternalSize(
wxWindow* pChild 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); ::WinQueryWindowPos(GetHwnd(), &m_vSwpClient);
} // end of wxTopLevelWindowOS2::UpdateInternalSize } // end of wxTopLevelWindowOS2::UpdateInternalSize

View File

@@ -759,16 +759,37 @@ void wxWindowOS2::SetScrollbar(
, bool WXUNUSED(bRefresh) , bool WXUNUSED(bRefresh)
) )
{ {
HWND hWnd = GetHwnd();
int nOldRange = nRange - nThumbVisible; int nOldRange = nRange - nThumbVisible;
int nRange1 = nOldRange; int nRange1 = nOldRange;
int nPageSize = nThumbVisible; int nPageSize = nThumbVisible;
SBCDATA vInfo;
HWND hWnd = GetHwnd();
ULONG ulStyle = WS_VISIBLE;
RECTL vRect;
SWP vSwp;
::WinQueryWindowRect(hWnd, &vRect); SBCDATA vInfo;
ULONG ulStyle = WS_VISIBLE | WS_SYNCPAINT;
SWP vSwp;
RECTL vRect;
HWND hWndParent;
HWND hWndClient;
wxWindow* pParent = GetParent();
if (pParent && pParent->IsKindOf(CLASSINFO(wxFrame)))
{
wxFrame* pFrame;
pFrame = wxDynamicCast(pParent, wxFrame);
hWndParent = pFrame->GetFrame();
hWndClient = GetHwndOf(pParent);
}
else
{
if (pParent)
hWndParent = GetHwndOf(pParent);
else
hWndParent = GetHwnd();
hWndClient = hWndParent;
}
::WinQueryWindowPos(hWndClient, &vSwp);
if (nPageSize > 1 && nRange > 0) if (nPageSize > 1 && nRange > 0)
{ {
nRange1 += (nPageSize - 1); nRange1 += (nPageSize - 1);
@@ -784,13 +805,13 @@ void wxWindowOS2::SetScrollbar(
ulStyle |= SBS_HORZ; ulStyle |= SBS_HORZ;
if (m_hWndScrollBarHorz == 0L) if (m_hWndScrollBarHorz == 0L)
{ {
m_hWndScrollBarHorz = ::WinCreateWindow( hWnd m_hWndScrollBarHorz = ::WinCreateWindow( hWndParent
,WC_SCROLLBAR ,WC_SCROLLBAR
,(PSZ)NULL ,(PSZ)NULL
,ulStyle ,ulStyle
,vRect.xLeft ,vSwp.x
,vRect.yBottom ,vSwp.y
,vRect.xRight - vRect.xLeft - 20 ,vSwp.cx - 20
,20 ,20
,hWnd ,hWnd
,HWND_TOP ,HWND_TOP
@@ -800,33 +821,27 @@ void wxWindowOS2::SetScrollbar(
); );
} }
else else
{
RECTL vRect2;
//
// Only want to resize the scrollbar if it changes, otherwise
// we'd probably end up in a recursive loop until we crash the call stack
// because this method is called in a ScrolledWindow OnSize event and SWP_MOVE | SWP_SIZE
// generates those events.
//
::WinQueryWindowRect(m_hWndScrollBarHorz, &vRect2);
if (!(vRect2.xLeft == vRect.xLeft &&
vRect2.xRight == vRect.xRight &&
vRect2.yBottom == vRect.yBottom &&
vRect2.yTop == vRect.yTop
) )
{ {
::WinSetWindowPos( m_hWndScrollBarHorz ::WinSetWindowPos( m_hWndScrollBarHorz
,HWND_TOP ,HWND_TOP
,vRect.xLeft ,vSwp.x
,vRect.yBottom ,vSwp.y
,vRect.xRight - vRect.xLeft - 20 ,vSwp.cx - 20
,20 ,20
,SWP_ACTIVATE | SWP_MOVE | SWP_SIZE | SWP_SHOW ,SWP_MOVE | SWP_SIZE | SWP_SHOW | SWP_ACTIVATE | SWP_ZORDER
);
::WinSendMsg( m_hWndScrollBarHorz
,SBM_SETSCROLLBAR
,(MPARAM)nPos
,MPFROM2SHORT(0, (SHORT)nRange1)
);
::WinSendMsg( m_hWndScrollBarHorz
,SBM_SETTHUMBSIZE
,MPFROM2SHORT( (SHORT)nThumbVisible
,(SHORT)nRange1
)
,(MPARAM)0
); );
}
::WinSendMsg(m_hWndScrollBarHorz, SBM_SETSCROLLBAR, (MPARAM)nPos, MPFROM2SHORT(0, (SHORT)nRange1));
::WinSendMsg(m_hWndScrollBarHorz, SBM_SETTHUMBSIZE, MPFROM2SHORT((SHORT)nThumbVisible, (SHORT)nRange1), (MPARAM)0);
} }
} }
else else
@@ -834,14 +849,14 @@ void wxWindowOS2::SetScrollbar(
ulStyle |= SBS_VERT; ulStyle |= SBS_VERT;
if (m_hWndScrollBarVert == 0L) if (m_hWndScrollBarVert == 0L)
{ {
m_hWndScrollBarVert = ::WinCreateWindow( hWnd m_hWndScrollBarVert = ::WinCreateWindow( hWndParent
,WC_SCROLLBAR ,WC_SCROLLBAR
,(PSZ)NULL ,(PSZ)NULL
,ulStyle ,ulStyle
,vRect.xRight - 20 ,vSwp.x + vSwp.cx - 20
,vRect.yBottom + 20 ,vSwp.y + 20
,20 ,20
,vRect.yTop - (vRect.yBottom + 20) ,vSwp.cy - 20
,hWnd ,hWnd
,HWND_TOP ,HWND_TOP
,60001 ,60001
@@ -850,33 +865,27 @@ void wxWindowOS2::SetScrollbar(
); );
} }
else else
{
RECTL vRect2;
//
// Only want to resize the scrollbar if it changes, otherwise
// we'd probably end up in a recursive loop until we crash the call stack
// because this method is called in a ScrolledWindow OnSize event and SWP_MOVE | SWP_SIZE
// generates those events.
//
::WinQueryWindowRect(m_hWndScrollBarVert, &vRect2);
if (!(vRect2.xLeft == vRect.xLeft &&
vRect2.xRight == vRect.xRight &&
vRect2.yBottom == vRect.yBottom &&
vRect2.yTop == vRect.yTop
) )
{ {
::WinSetWindowPos( m_hWndScrollBarVert ::WinSetWindowPos( m_hWndScrollBarVert
,HWND_TOP ,HWND_TOP
,vRect.xRight - 20 ,vSwp.x + vSwp.cx - 20
,vRect.yBottom + 20 ,vSwp.y + 20
,20 ,20
,vRect.yTop - (vRect.yBottom + 20) ,vSwp.cy - 20
,SWP_ACTIVATE | SWP_MOVE | SWP_SIZE | SWP_SHOW ,SWP_ACTIVATE | SWP_MOVE | SWP_SIZE | SWP_SHOW
); );
} ::WinSendMsg( m_hWndScrollBarVert
::WinSendMsg(m_hWndScrollBarVert, SBM_SETSCROLLBAR, (MPARAM)nPos, MPFROM2SHORT(0, (SHORT)nRange1)); ,SBM_SETSCROLLBAR
::WinSendMsg(m_hWndScrollBarVert, SBM_SETTHUMBSIZE, MPFROM2SHORT((SHORT)nThumbVisible, (SHORT)nRange1), (MPARAM)0); ,(MPARAM)nPos
,MPFROM2SHORT(0, (SHORT)nRange1)
);
::WinSendMsg( m_hWndScrollBarVert
,SBM_SETTHUMBSIZE
,MPFROM2SHORT( (SHORT)nThumbVisible
,(SHORT)nRange1
)
,(MPARAM)0
);
} }
m_nYThumbSize = nThumbVisible; m_nYThumbSize = nThumbVisible;
} }
@@ -888,7 +897,6 @@ void wxWindowOS2::ScrollWindow(
, const wxRect* pRect , const wxRect* pRect
) )
{ {
nDy *= -1; // flip the sign of Dy as OS/2 is opposite Windows.
RECTL vRect; RECTL vRect;
RECTL vRectHorz; RECTL vRectHorz;
RECTL vRectVert; RECTL vRectVert;
@@ -904,116 +912,17 @@ void wxWindowOS2::ScrollWindow(
else else
{ {
::WinQueryWindowRect(GetHwnd(), &vRect); ::WinQueryWindowRect(GetHwnd(), &vRect);
::WinQueryWindowRect(m_hWndScrollBarHorz, &vRectHorz);
vRect.yBottom += vRectHorz.yTop - vRectHorz.yBottom;
::WinQueryWindowRect(m_hWndScrollBarVert, &vRectVert);
vRect.xRight -= vRectVert.xRight - vRectVert.xLeft;
} }
nDy *= -1; // flip the sign of Dy as OS/2 is opposite Windows.
::WinScrollWindow( GetHwnd() ::WinScrollWindow( GetHwnd()
,(LONG)nDx ,(LONG)nDx
,(LONG)nDy ,(LONG)nDy
,&vRect ,&vRect
,NULL ,&vRect
,NULLHANDLE ,NULLHANDLE
,NULL ,NULL
,SW_INVALIDATERGN ,SW_SCROLLCHILDREN | SW_INVALIDATERGN
); );
//
// Move the children
//
wxWindowList::Node* pCurrent = GetChildren().GetFirst();
SWP vSwp;
while (pCurrent)
{
wxWindow* pChildWin = pCurrent->GetData();
if (pChildWin->GetHWND() != NULLHANDLE)
{
::WinQueryWindowPos(pChildWin->GetHWND(), &vSwp);
::WinQueryWindowRect(pChildWin->GetHWND(), &vRect);
if (pChildWin->IsKindOf(CLASSINFO(wxControl)))
{
wxControl* pCtrl;
//
// Must deal with controls that have margins like ENTRYFIELD. The SWP
// struct of such a control will have and origin offset from its intended
// position by the width of the margins.
//
pCtrl = wxDynamicCast(pChildWin, wxControl);
vSwp.y -= pCtrl->GetYComp();
vSwp.x -= pCtrl->GetXComp();
}
::WinSetWindowPos( pChildWin->GetHWND()
,HWND_BOTTOM
,vSwp.x + nDx
,vSwp.y + nDy
,0
,0
,SWP_MOVE
);
if (pChildWin->IsKindOf(CLASSINFO(wxRadioBox)))
{
wxRadioBox* pRadioBox;
pRadioBox = wxDynamicCast(pChildWin, wxRadioBox);
pRadioBox->AdjustButtons( (int)vSwp.x + nDx
,(int)vSwp.y + nDy
,(int)vSwp.cx
,(int)vSwp.cy
,pRadioBox->GetSizeFlags()
);
}
if (pChildWin->IsKindOf(CLASSINFO(wxSlider)))
{
wxSlider* pSlider;
pSlider = wxDynamicCast(pChildWin, wxSlider);
pSlider->AdjustSubControls( (int)vSwp.x + nDx
,(int)vSwp.y + nDy
,(int)vSwp.cx
,(int)vSwp.cy
,pSlider->GetSizeFlags()
);
}
::WinInvalidateRect(pChildWin->GetHWND(), &vRectChild, FALSE);
}
pCurrent = pCurrent->GetNext();
}
if (GetChildren().GetCount() > 0)
{
//
// Clean up child window slop
//
::WinQueryWindowRect(GetHwnd(), &vRect);
vRect.xRight -= 20;
vRect.yBottom += 20;
::WinInvalidateRect(GetHwnd(), &vRect, TRUE);
}
//
// Takes a lot to keep the scrollbars on top of everything
//
::WinSetWindowPos( m_hWndScrollBarHorz
,HWND_TOP
,0
,0
,0
,0
,SWP_ZORDER
);
::WinSetWindowPos( m_hWndScrollBarVert
,HWND_TOP
,0
,0
,0
,0
,SWP_ZORDER
);
::WinInvalidateRect(m_hWndScrollBarHorz, &vRectHorz, FALSE);
::WinInvalidateRect(m_hWndScrollBarVert, &vRectVert, FALSE);
} // end of wxWindowOS2::ScrollWindow } // end of wxWindowOS2::ScrollWindow
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------
@@ -1343,6 +1252,10 @@ void wxWindowOS2::Refresh(
} }
else else
::WinInvalidateRect(hWnd, NULL, bEraseBack); ::WinInvalidateRect(hWnd, NULL, bEraseBack);
if (m_hWndScrollBarHorz != NULLHANDLE)
::WinInvalidateRect(m_hWndScrollBarHorz, NULL, TRUE);
if (m_hWndScrollBarVert != NULLHANDLE)
::WinInvalidateRect(m_hWndScrollBarVert, NULL, TRUE);
} }
} // end of wxWindowOS2::Refresh } // end of wxWindowOS2::Refresh
@@ -2384,7 +2297,18 @@ MRESULT EXPENTRY wxWndProc(
else else
{ {
if (pWnd) if (pWnd)
{
rc = pWnd->OS2WindowProc(ulMsg, wParam, lParam); rc = pWnd->OS2WindowProc(ulMsg, wParam, lParam);
if ( (pWnd->GetScrollBarHorz() != NULLHANDLE ||
pWnd->GetScrollBarVert() != NULLHANDLE) &&
ulMsg == WM_PAINT)
{
if (pWnd->GetScrollBarHorz() != NULLHANDLE)
::WinInvalidateRect(pWnd->GetScrollBarHorz(), NULL, TRUE);
if (pWnd->GetScrollBarVert() != NULLHANDLE)
::WinInvalidateRect(pWnd->GetScrollBarVert(), NULL, TRUE);
}
}
else else
rc = ::WinDefWindowProc(hWnd, ulMsg, wParam, lParam); rc = ::WinDefWindowProc(hWnd, ulMsg, wParam, lParam);
} }
@@ -4118,68 +4042,6 @@ void wxWindowOS2::MoveChildren(
,(int)pSlider->GetSizeFlags() ,(int)pSlider->GetSizeFlags()
); );
} }
//
// Originally created before Panel was properly sized, most likely.
// So now the the panel is sized correctly, resize the scrollbars
// and bring them to the top of all the other panel children
//
if (m_hWndScrollBarVert != NULLHANDLE ||
m_hWndScrollBarHorz != NULLHANDLE)
{
RECTL vRect;
::WinQueryWindowRect(GetHwnd(), &vRect);
::WinQueryWindowPos(m_hWndScrollBarHorz, &vSwp);
if ( (vRect.xRight - vRect.xLeft) - vSwp.cx != 20)
{
::WinSetWindowPos( m_hWndScrollBarHorz
,HWND_TOP
,0
,0
,(vRect.xRight - vRect.xLeft) - 20
,vSwp.cy
,SWP_ZORDER | SWP_SIZE
);
}
else
{
::WinSetWindowPos( m_hWndScrollBarHorz
,HWND_TOP
,0
,0
,0
,0
,SWP_ZORDER
);
}
::WinQueryWindowPos(m_hWndScrollBarVert, &vSwp);
if ( (vRect.yTop - vRect.yBottom) - vSwp.cy != 20)
{
::WinSetWindowPos( m_hWndScrollBarVert
,HWND_TOP
,vSwp.x
,vSwp.y + 20
,vSwp.cx
,(vRect.yTop - vRect.yBottom) - 20
,SWP_ZORDER | SWP_SIZE | SWP_MOVE
);
}
else
{
::WinSetWindowPos( m_hWndScrollBarVert
,HWND_TOP
,0
,0
,0
,0
,SWP_ZORDER
);
}
::WinQueryWindowRect(m_hWndScrollBarHorz, &vRect);
::WinInvalidateRect(m_hWndScrollBarHorz, &vRect, FALSE);
::WinQueryWindowRect(m_hWndScrollBarVert, &vRect);
::WinInvalidateRect(m_hWndScrollBarVert, &vRect, FALSE);
}
} }
} // end of wxWindowOS2::MoveChildren } // end of wxWindowOS2::MoveChildren
@@ -4276,6 +4138,115 @@ int wxWindowOS2::GetOS2ParentHeight(
return(0L); return(0L);
} // end of wxWindowOS2::GetOS2ParentHeight } // end of wxWindowOS2::GetOS2ParentHeight
//
// OS/2 needs a lot extra manipulation to deal with layouts
// for canvas windows, particularly scrolled ones.
//
void wxWindowOS2::OS2Layout(
int nWidth
, int nHeight
)
{
//
// Frames laying out canvas windows need the held.
// Dialogs or Frames laying out child controls do not.
//
if (IsKindOf(CLASSINFO(wxFrame)))
{
RECTL vRectFrame;
RECTL vRectClient;
RECTL vRectChild;
RECTL vRectHorz;
RECTL vRectVert;
SWP vSwpFrame;
SWP vSwpClient;
SWP vSwpChild;
SWP vSwpHorz;
SWP vSwpVert;
wxFrame* pFrame = wxDynamicCast(this, wxFrame);
bool bNewYSize = FALSE;
bool bNewXSize = FALSE;
::WinQueryWindowPos(pFrame->GetFrame(), &vSwpFrame);
::WinQueryWindowPos(GetHwnd(), &vSwpClient);
if (vSwpClient.cy != pFrame->GetSwpClient()->cy)
bNewYSize = TRUE;
if (vSwpClient.cx != pFrame->GetSwpClient()->cx)
bNewXSize = TRUE;
for (wxWindowList::Node* pNode = GetChildren().GetFirst();
pNode;
pNode = pNode->GetNext())
{
wxWindow* pChild = pNode->GetData();
int nWidthAdjust = 0;
int nHeightAdjust = 0;
if ( pChild->IsKindOf(CLASSINFO(wxGenericScrolledWindow)) ||
pChild->IsKindOf(CLASSINFO(wxScrolledWindow))
)
{
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(pFrame->GetSwpClient()->cy - vSwpClient.cy);
pChild->Refresh();
}
::WinQueryWindowPos(pChild->GetHWND(), &vSwpChild);
//
// Reset the child window size to account for scrollbars
//
if (pChild->GetScrollBarHorz() != NULLHANDLE)
nHeightAdjust = 20;
if (pChild->GetScrollBarVert() != NULLHANDLE)
nWidthAdjust = 20;
::WinSetWindowPos( pChild->GetHWND()
,HWND_TOP
,vSwpChild.x
,vSwpChild.y + nHeightAdjust
,vSwpChild.cx - nWidthAdjust
,vSwpChild.cy - nHeightAdjust
,SWP_MOVE | SWP_SIZE
);
//
// Reset the scrollbar sizes...they will be all messed up after
// auto layouts
//
if (pChild->GetScrollBarHorz() != NULLHANDLE)
{
::WinSetWindowPos( pChild->GetScrollBarHorz()
,HWND_TOP
,vSwpClient.x + vSwpChild.x
,vSwpClient.y + vSwpChild.y
,vSwpChild.cx - 20
,20
,SWP_MOVE | SWP_SIZE | SWP_SHOW | SWP_ACTIVATE | SWP_ZORDER
);
}
if (pChild->GetScrollBarVert() != NULLHANDLE)
{
::WinSetWindowPos( pChild->GetScrollBarVert()
,HWND_TOP
,vSwpClient.x + vSwpChild.x + vSwpChild.cx - 20
,vSwpClient.y + vSwpChild.y + 20
,20
,vSwpChild.cy - 20
,SWP_MOVE | SWP_SIZE | SWP_SHOW | SWP_ACTIVATE | SWP_ZORDER
);
}
}
}
::WinQueryWindowPos(GetHwnd(), pFrame->GetSwpClient());
}
} // end of wxWindowOS2::OS2Layout
wxWindowCreationHook::wxWindowCreationHook( wxWindowCreationHook::wxWindowCreationHook(
wxWindow* pWinBeingCreated wxWindow* pWinBeingCreated
) )

View File

@@ -4,7 +4,7 @@ DATA MULTIPLE NONSHARED READWRITE LOADONCALL
CODE LOADONCALL CODE LOADONCALL
EXPORTS EXPORTS
;From library: H:\DEV\WX2\WXWINDOWS\LIB\wx.lib ;From library: F:\DEV\WX2\WXWINDOWS\LIB\wx.lib
;From object file: dummy.cpp ;From object file: dummy.cpp
;PUBDEFs (Symbols available from object file): ;PUBDEFs (Symbols available from object file):
wxDummyChar wxDummyChar
@@ -1772,7 +1772,7 @@ EXPORTS
wxEVT_NC_LEFT_DCLICK wxEVT_NC_LEFT_DCLICK
wxEVT_INIT_DIALOG wxEVT_INIT_DIALOG
wxEVT_COMMAND_SET_FOCUS wxEVT_COMMAND_SET_FOCUS
;From object file: H:\DEV\WX2\WXWINDOWS\src\common\extended.c ;From object file: F:\DEV\WX2\WXWINDOWS\src\common\extended.c
;PUBDEFs (Symbols available from object file): ;PUBDEFs (Symbols available from object file):
ConvertToIeeeExtended ConvertToIeeeExtended
ConvertFromIeeeExtended ConvertFromIeeeExtended
@@ -2167,12 +2167,10 @@ EXPORTS
ms_root__16wxLocalFSHandler ms_root__16wxLocalFSHandler
;wxFileSystemHandler::GetMimeTypeFromExt(const wxString&) ;wxFileSystemHandler::GetMimeTypeFromExt(const wxString&)
GetMimeTypeFromExt__19wxFileSystemHandlerFRC8wxString GetMimeTypeFromExt__19wxFileSystemHandlerFRC8wxString
;wxFSFile::sm_classwxFSFile
sm_classwxFSFile__8wxFSFile
;wxFileSystemModule::sm_classwxFileSystemModule
sm_classwxFileSystemModule__18wxFileSystemModule
;wxFileSystem::m_Handlers ;wxFileSystem::m_Handlers
m_Handlers__12wxFileSystem m_Handlers__12wxFileSystem
;wxFileSystemModule::sm_classwxFileSystemModule
sm_classwxFileSystemModule__18wxFileSystemModule
;wxFileSystemHandler::FindNext() ;wxFileSystemHandler::FindNext()
FindNext__19wxFileSystemHandlerFv FindNext__19wxFileSystemHandlerFv
;wxFileSystem::CleanUpHandlers() ;wxFileSystem::CleanUpHandlers()
@@ -2774,8 +2772,8 @@ EXPORTS
CopyHashTable__17_wxHashTableBase2FPP21_wxHashTable_NodeBaseUiP17_wxHashTableBase2T1PFP17_wxHashTableBase2P21_wxHashTable_NodeBase_UlPFP21_wxHashTable_NodeBase_P21_wxHashTable_NodeBase CopyHashTable__17_wxHashTableBase2FPP21_wxHashTable_NodeBaseUiP17_wxHashTableBase2T1PFP17_wxHashTableBase2P21_wxHashTable_NodeBase_UlPFP21_wxHashTable_NodeBase_P21_wxHashTable_NodeBase
;wxStringHash::wxCharStringHash(const char*) ;wxStringHash::wxCharStringHash(const char*)
wxCharStringHash__12wxStringHashFPCc wxCharStringHash__12wxStringHashFPCc
;_wxHashTableBase2::s_primes ;_wxHashTableBase2::ms_primes
s_primes__17_wxHashTableBase2 ms_primes__17_wxHashTableBase2
;_wxHashTableBase2::DummyProcessNode(_wxHashTable_NodeBase*) ;_wxHashTableBase2::DummyProcessNode(_wxHashTable_NodeBase*)
DummyProcessNode__17_wxHashTableBase2FP21_wxHashTable_NodeBase DummyProcessNode__17_wxHashTableBase2FP21_wxHashTable_NodeBase
;_wxHashTableBase2::DeleteNodes(unsigned int,_wxHashTable_NodeBase**,void(*)(_wxHashTable_NodeBase*)) ;_wxHashTableBase2::DeleteNodes(unsigned int,_wxHashTable_NodeBase**,void(*)(_wxHashTable_NodeBase*))
@@ -5797,7 +5795,7 @@ EXPORTS
Read32__17wxTextInputStreamFv Read32__17wxTextInputStreamFv
;wxTextInputStream::SkipIfEndOfLine(char) ;wxTextInputStream::SkipIfEndOfLine(char)
SkipIfEndOfLine__17wxTextInputStreamFc SkipIfEndOfLine__17wxTextInputStreamFc
;From object file: H:\DEV\WX2\WXWINDOWS\src\common\unzip.c ;From object file: F:\DEV\WX2\WXWINDOWS\src\common\unzip.c
;PUBDEFs (Symbols available from object file): ;PUBDEFs (Symbols available from object file):
unzReadCurrentFile unzReadCurrentFile
unzGetCurrentFileInfo unzGetCurrentFileInfo
@@ -14332,6 +14330,8 @@ EXPORTS
CreateFrame__19wxTopLevelWindowOS2FRC8wxStringRC7wxPointRC6wxSize CreateFrame__19wxTopLevelWindowOS2FRC8wxStringRC7wxPointRC6wxSize
;wxTopLevelWindowOS2::~wxTopLevelWindowOS2() ;wxTopLevelWindowOS2::~wxTopLevelWindowOS2()
__dt__19wxTopLevelWindowOS2Fv __dt__19wxTopLevelWindowOS2Fv
;wxTopLevelWindowOS2::UpdateInternalSize(wxWindow*,int,int)
UpdateInternalSize__19wxTopLevelWindowOS2FP8wxWindowiT2
;wxTopLevelWindowOS2::ShowFullScreen(unsigned long,long) ;wxTopLevelWindowOS2::ShowFullScreen(unsigned long,long)
ShowFullScreen__19wxTopLevelWindowOS2FUll ShowFullScreen__19wxTopLevelWindowOS2FUll
;wxTopLevelWindowOS2::CreateDialog(unsigned long,const wxString&,const wxPoint&,const wxSize&) ;wxTopLevelWindowOS2::CreateDialog(unsigned long,const wxString&,const wxPoint&,const wxSize&)
@@ -14340,6 +14340,8 @@ EXPORTS
DoShowWindow__19wxTopLevelWindowOS2Fi DoShowWindow__19wxTopLevelWindowOS2Fi
;wxTopLevelWindowOS2::Init() ;wxTopLevelWindowOS2::Init()
Init__19wxTopLevelWindowOS2Fv Init__19wxTopLevelWindowOS2Fv
;wxTopLevelWindowOS2::m_sbInitialized
m_sbInitialized__19wxTopLevelWindowOS2
;wxTopLevelWindowOS2::OS2GetCreateWindowFlags(long*) const ;wxTopLevelWindowOS2::OS2GetCreateWindowFlags(long*) const
OS2GetCreateWindowFlags__19wxTopLevelWindowOS2CFPl OS2GetCreateWindowFlags__19wxTopLevelWindowOS2CFPl
;wxTopLevelWindowOS2::Iconize(unsigned long) ;wxTopLevelWindowOS2::Iconize(unsigned long)
@@ -14358,8 +14360,6 @@ EXPORTS
Maximize__19wxTopLevelWindowOS2FUl Maximize__19wxTopLevelWindowOS2FUl
;wxTopLevelWindowOS2::EnableCloseButton(unsigned long) ;wxTopLevelWindowOS2::EnableCloseButton(unsigned long)
EnableCloseButton__19wxTopLevelWindowOS2FUl EnableCloseButton__19wxTopLevelWindowOS2FUl
;wxTopLevelWindowOS2::UpdateInternalSize(wxWindow*,int)
UpdateInternalSize__19wxTopLevelWindowOS2FP8wxWindowi
;wxTopLevelWindowOS2::DoGetClientSize(int*,int*) const ;wxTopLevelWindowOS2::DoGetClientSize(int*,int*) const
DoGetClientSize__19wxTopLevelWindowOS2CFPiT1 DoGetClientSize__19wxTopLevelWindowOS2CFPiT1
;wxTopLevelWindowOS2::Create(wxWindow*,int,const wxString&,const wxPoint&,const wxSize&,long,const wxString&) ;wxTopLevelWindowOS2::Create(wxWindow*,int,const wxString&,const wxPoint&,const wxSize&,long,const wxString&)
@@ -14668,6 +14668,8 @@ EXPORTS
;wxWindow::WarpPointer(int,int) ;wxWindow::WarpPointer(int,int)
WarpPointer__8wxWindowFiT1 WarpPointer__8wxWindowFiT1
wxCurrentPopupMenu wxCurrentPopupMenu
;wxWindow::OS2Layout(int,int)
OS2Layout__8wxWindowFiT1
;wxWindow::MoveChildren(int) ;wxWindow::MoveChildren(int)
MoveChildren__8wxWindowFi MoveChildren__8wxWindowFi
;wxWindow::HandleShow(unsigned long,int) ;wxWindow::HandleShow(unsigned long,int)