Make scrolling work better (without constantly refreshing whole screen).
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@29418 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -938,28 +938,61 @@ void wxWindowOS2::ScrollWindow(
|
|||||||
{
|
{
|
||||||
RECTL vRect;
|
RECTL vRect;
|
||||||
|
|
||||||
|
::WinQueryWindowRect(GetHwnd(), &vRect);
|
||||||
|
int height = vRect.yTop;
|
||||||
if (pRect)
|
if (pRect)
|
||||||
{
|
{
|
||||||
vRect.xLeft = pRect->x;
|
vRect.xLeft = pRect->x;
|
||||||
vRect.yTop = pRect->y + pRect->height;
|
vRect.yTop = height - pRect->y;
|
||||||
vRect.xRight = pRect->x + pRect->width;
|
vRect.xRight = pRect->x + pRect->width;
|
||||||
vRect.yBottom = pRect->y;
|
vRect.yBottom = vRect.yTop - pRect->height;
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
::WinQueryWindowRect(GetHwnd(), &vRect);
|
|
||||||
}
|
}
|
||||||
nDy *= -1; // flip the sign of Dy as OS/2 is opposite Windows.
|
nDy *= -1; // flip the sign of Dy as OS/2 is opposite Windows.
|
||||||
|
HPS hPs;
|
||||||
|
HRGN vUpdateRegion;
|
||||||
|
hPs = ::WinGetPS(GetHwnd());
|
||||||
|
vUpdateRegion = ::GpiCreateRegion(hPs, 0, NULL);
|
||||||
::WinScrollWindow( GetHwnd()
|
::WinScrollWindow( GetHwnd()
|
||||||
,(LONG)nDx
|
,(LONG)nDx
|
||||||
,(LONG)nDy
|
,(LONG)nDy
|
||||||
,&vRect
|
,&vRect
|
||||||
,&vRect
|
,&vRect
|
||||||
,NULLHANDLE
|
,vUpdateRegion
|
||||||
,NULL
|
,NULL
|
||||||
,SW_SCROLLCHILDREN | SW_INVALIDATERGN
|
,SW_SCROLLCHILDREN //| SW_INVALIDATERGN
|
||||||
);
|
);
|
||||||
Refresh();
|
RGNRECT vRgnData;
|
||||||
|
PRECTL pUpdateRects = NULL;
|
||||||
|
vRgnData.ulDirection = RECTDIR_LFRT_TOPBOT;
|
||||||
|
if (::GpiQueryRegionRects( hPs // Pres space
|
||||||
|
,vUpdateRegion // Handle of region to query
|
||||||
|
,NULL // Return all RECTs
|
||||||
|
,&vRgnData // Will contain number or RECTs in region
|
||||||
|
,NULL // NULL to return number of RECTs
|
||||||
|
))
|
||||||
|
{
|
||||||
|
pUpdateRects = new RECTL[vRgnData.crcReturned];
|
||||||
|
vRgnData.crc = vRgnData.crcReturned;
|
||||||
|
vRgnData.ircStart = 1;
|
||||||
|
if (::GpiQueryRegionRects( hPs // Pres space of source
|
||||||
|
,vUpdateRegion // Handle of source region
|
||||||
|
,NULL // Return all RECTs
|
||||||
|
,&vRgnData // Operations set to return rects
|
||||||
|
,pUpdateRects // Will contain the actual RECTS
|
||||||
|
))
|
||||||
|
{
|
||||||
|
for(size_t i = 0; i < vRgnData.crc; i++)
|
||||||
|
{
|
||||||
|
wxRect UpdateRect;
|
||||||
|
UpdateRect.x = pUpdateRects[i].xLeft;
|
||||||
|
UpdateRect.y = height - pUpdateRects[i].yTop;
|
||||||
|
UpdateRect.width = pUpdateRects[i].xRight - pUpdateRects[i].xLeft;
|
||||||
|
UpdateRect.height = pUpdateRects[i].yTop - pUpdateRects[i].yBottom;
|
||||||
|
Refresh(FALSE, &UpdateRect);
|
||||||
|
}
|
||||||
|
delete [] pUpdateRects;
|
||||||
|
}
|
||||||
|
}
|
||||||
} // end of wxWindowOS2::ScrollWindow
|
} // end of wxWindowOS2::ScrollWindow
|
||||||
|
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
@@ -1220,11 +1253,14 @@ void wxWindowOS2::Refresh(
|
|||||||
if (pRect)
|
if (pRect)
|
||||||
{
|
{
|
||||||
RECTL vOs2Rect;
|
RECTL vOs2Rect;
|
||||||
|
int height;
|
||||||
|
|
||||||
|
::WinQueryWindowRect(GetHwnd(), &vOs2Rect);
|
||||||
|
height = vOs2Rect.yTop;
|
||||||
vOs2Rect.xLeft = pRect->x;
|
vOs2Rect.xLeft = pRect->x;
|
||||||
vOs2Rect.yBottom = pRect->y;
|
vOs2Rect.yTop = height - pRect->y;
|
||||||
vOs2Rect.xRight = pRect->x + pRect->width;
|
vOs2Rect.xRight = pRect->x + pRect->width;
|
||||||
vOs2Rect.yTop = pRect->y + pRect->height;
|
vOs2Rect.yBottom = vOs2Rect.yTop - pRect->height;
|
||||||
|
|
||||||
::WinInvalidateRect(hWnd, &vOs2Rect, bEraseBack);
|
::WinInvalidateRect(hWnd, &vOs2Rect, bEraseBack);
|
||||||
}
|
}
|
||||||
@@ -1955,7 +1991,7 @@ bool wxWindowOS2::DoPopupMenu(
|
|||||||
pMenu->SetInvokingWindow(this);
|
pMenu->SetInvokingWindow(this);
|
||||||
pMenu->UpdateUI();
|
pMenu->UpdateUI();
|
||||||
|
|
||||||
if ( x == -1 && y == -1 )
|
if ( nX == -1 && nY == -1 )
|
||||||
{
|
{
|
||||||
wxPoint mouse = wxGetMousePosition();
|
wxPoint mouse = wxGetMousePosition();
|
||||||
nX = mouse.x; nY = mouse.y;
|
nX = mouse.x; nY = mouse.y;
|
||||||
@@ -3686,6 +3722,51 @@ bool wxWindowOS2::HandlePaint()
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Get all the rectangles from the region, convert the individual
|
||||||
|
// rectangles to "the other" coordinate system and reassemble a
|
||||||
|
// region from the rectangles, to be feed into m_updateRegion.
|
||||||
|
//
|
||||||
|
// FIXME: This is a bad hack since OS/2 API specifies that rectangles
|
||||||
|
// passed into GpiSetRegion must not have Bottom > Top,
|
||||||
|
// however, at first sight, it _seems_ to work nonetheless.
|
||||||
|
//
|
||||||
|
RGNRECT vRgnData;
|
||||||
|
PRECTL pUpdateRects = NULL;
|
||||||
|
vRgnData.ulDirection = RECTDIR_LFRT_TOPBOT;
|
||||||
|
if (::GpiQueryRegionRects( hPS // Pres space
|
||||||
|
,hRgn // Handle of region to query
|
||||||
|
,NULL // Return all RECTs
|
||||||
|
,&vRgnData // Will contain number or RECTs in region
|
||||||
|
,NULL // NULL to return number of RECTs
|
||||||
|
))
|
||||||
|
{
|
||||||
|
pUpdateRects = new RECTL[vRgnData.crcReturned];
|
||||||
|
vRgnData.crc = vRgnData.crcReturned;
|
||||||
|
vRgnData.ircStart = 1;
|
||||||
|
if (::GpiQueryRegionRects( hPS // Pres space of source
|
||||||
|
,hRgn // Handle of source region
|
||||||
|
,NULL // Return all RECTs
|
||||||
|
,&vRgnData // Operations set to return rects
|
||||||
|
,pUpdateRects // Will contain the actual RECTS
|
||||||
|
))
|
||||||
|
{
|
||||||
|
int height;
|
||||||
|
RECT vRect;
|
||||||
|
::WinQueryWindowRect(GetHwnd(), &vRect);
|
||||||
|
height = vRect.yTop;
|
||||||
|
|
||||||
|
for(size_t i = 0; i < vRgnData.crc; i++)
|
||||||
|
{
|
||||||
|
int rectHeight;
|
||||||
|
rectHeight = pUpdateRects[i].yTop - pUpdateRects[i].yBottom;
|
||||||
|
pUpdateRects[i].yTop = height - pUpdateRects[i].yTop;
|
||||||
|
pUpdateRects[i].yBottom = pUpdateRects[i].yTop + rectHeight;
|
||||||
|
}
|
||||||
|
::GpiSetRegion(hPS, hRgn, vRgnData.crc, pUpdateRects);
|
||||||
|
delete [] pUpdateRects;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
m_updateRegion = wxRegion(hRgn, hPS);
|
m_updateRegion = wxRegion(hRgn, hPS);
|
||||||
|
|
||||||
vEvent.SetEventObject(this);
|
vEvent.SetEventObject(this);
|
||||||
|
Reference in New Issue
Block a user