Lots of OS/2 fixes mostly to do with painting

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@8940 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
David Webster
2000-12-18 05:34:25 +00:00
parent 702c190d47
commit 8d854fa93f
7 changed files with 579 additions and 258 deletions

View File

@@ -204,7 +204,7 @@ bool wxBrush::RealizeResource()
if (M_BRUSHDATA->m_hBrush==NULL) wxError("Cannot create brush","Internal error") ;
#endif
M_BRUSHDATA->m_vBundle.lColor = vPmColour;
M_BRUSHDATA->m_vBundle.lBackColor = CLR_DEFAULT;
M_BRUSHDATA->m_vBundle.lBackColor = RGB_WHITE;
M_BRUSHDATA->m_vBundle.usMixMode = FM_OVERPAINT;
M_BRUSHDATA->m_vBundle.usBackMixMode = BM_OVERPAINT;

View File

@@ -147,6 +147,7 @@ wxDC::wxDC(void)
m_hOldPS = NULL;
m_hPS = NULL;
m_bIsPaintTime = FALSE; // True at Paint Time
m_brush.GetColour().Set("WHITE");
}
wxDC::~wxDC(void)
@@ -226,9 +227,9 @@ void wxDC::DoSetClippingRegion(
m_clipping = TRUE;
vRect.xLeft = XLOG2DEV(x);
vRect.yTop = YLOG2DEV(y + height);
vRect.yTop = YLOG2DEV(m_vRclPaint.yTop - y);
vRect.xRight = XLOG2DEV(x + width);
vRect.yBottom = YLOG2DEV(y);
vRect.yBottom = YLOG2DEV(m_vRclPaint.yTop - (y + height));
::GpiIntersectClipRectangle(m_hPS, &vRect);
DO_SET_CLIPPING_BOX()
} // end of wxDC::DoSetClippingRegion
@@ -360,9 +361,9 @@ void wxDC::DoDrawLine(
POINTL vPoint[2];
vPoint[0].x = vX1;
vPoint[0].y = vY1;
vPoint[0].y = m_vRclPaint.yTop - vY1;
vPoint[1].x = vX2;
vPoint[1].y = vY2;
vPoint[1].y = m_vRclPaint.yTop - vY2;
::GpiMove(m_hPS, &vPoint[0]);
::GpiLine(m_hPS, &vPoint[1]);
}
@@ -506,7 +507,7 @@ void wxDC::DoDrawPoint(
POINTL vPoint;
vPoint.x = vX;
vPoint.y = vY;
vPoint.y = m_vRclPaint.yTop - vY;
::GpiSetPel(m_hPS, &vPoint);
}
@@ -621,9 +622,9 @@ void wxDC::DoDrawRectangle(
int nIsTRANSPARENT = 0;
vPoint[0].x = vX;
vPoint[0].y = vY;
vPoint[0].y = m_vRclPaint.yTop - (vY + vHeight);
vPoint[1].x = vX + vWidth;
vPoint[1].y = vY - vHeight;
vPoint[1].y = m_vRclPaint.yTop - vY;
::GpiMove(m_hPS, &vPoint[0]);
lColor = m_brush.GetColour().GetPixel();
lBorderColor = m_pen.GetColour().GetPixel();
@@ -635,7 +636,7 @@ void wxDC::DoDrawRectangle(
if(m_brush.GetStyle() == wxTRANSPARENT)
lControl = DRO_OUTLINE;
::GpiSetColor(m_hPS, CLR_GREEN);
::GpiSetColor(m_hPS, lColor);
::GpiBox( m_hPS // handle to a presentation space
,lControl // draw the box outline ? or ?
,&vPoint[1] // address of the corner
@@ -659,6 +660,11 @@ void wxDC::DoDrawRectangle(
::GpiSetColor( m_hPS
,lColor
);
vPoint[0].x = vX + 1;
vPoint[0].y = m_vRclPaint.yTop - (vY + vHeight) + 1;
vPoint[1].x = vX + vWidth - 2;
vPoint[1].y = m_vRclPaint.yTop - (vY + 2);
::GpiMove(m_hPS, &vPoint[0]);
::GpiBox( m_hPS
,lControl
,&vPoint[1]
@@ -680,9 +686,9 @@ void wxDC::DoDrawRoundedRectangle(
LONG lControl;
vPoint[0].x = vX;
vPoint[0].y = vY;
vPoint[0].y = YLOG2DEV(vY) - vHeight;
vPoint[1].x = vX + vWidth;
vPoint[1].y = vY + vHeight;
vPoint[1].y = vY;
::GpiMove(m_hPS, &vPoint[0]);
lControl = DRO_OUTLINEFILL; //DRO_FILL;
@@ -1241,10 +1247,15 @@ void wxDC::SetLogicalOrigin( wxCoord x, wxCoord y )
// TODO:
};
void wxDC::SetDeviceOrigin( wxCoord x, wxCoord y )
void wxDC::SetDeviceOrigin(
wxCoord x
, wxCoord y
)
{
RECTL vRect;
m_deviceOriginX = x;
m_deviceOriginY = y;
::GpiQueryPageViewport( m_hPS
,&vRect
);

View File

@@ -270,9 +270,7 @@ wxPaintDC::wxPaintDC(
}
else // not in cache, create a new one
{
SIZEL vSizl = { 0,0};
HPS hPS;
HRGN hRgn;
hPS = ::WinBeginPaint( GetWinHwnd(m_pCanvas)
,NULLHANDLE
@@ -280,6 +278,10 @@ wxPaintDC::wxPaintDC(
);
if(hPS)
{
POINTL vPoint[2];
LONG lControl;
LONG lColor;
m_hOldPS = m_hPS;
m_hPS = hPS;
::GpiCreateLogColorTable( m_hPS
@@ -296,6 +298,8 @@ wxPaintDC::wxPaintDC(
,0L
,NULL
);
::WinFillRect(hPS, &g_paintStruct, m_pCanvas->GetBackgroundColour().GetPixel());
}
m_bIsPaintTime = TRUE;

View File

@@ -984,6 +984,22 @@ bool wxFrame::OS2Create(
wxAssociateWinWithHandle(m_hWnd, this);
wxAssociateWinWithHandle(m_hFrame, this);
m_backgroundColour.Set(wxString("GREY"));
LONG lColor = (LONG)m_backgroundColour.GetPixel();
if (!::WinSetPresParam( m_hWnd
,PP_BACKGROUNDCOLOR
,sizeof(LONG)
,(PVOID)&lColor
))
{
vError = ::WinGetLastError(vHabmain);
sError = wxPMErrorToStr(vError);
wxLogError("Error creating frame. Error: %s\n", sError);
return FALSE;
}
//
// Now need to subclass window. Instead of calling the SubClassWin in wxWindow
// we manually subclass here because we don't want to use the main wxWndProc
@@ -1276,8 +1292,7 @@ bool wxFrame::HandlePaint()
}
else
{
wxWindow::HandlePaint();
return TRUE;
return(wxWindow::HandlePaint());
}
}
else
@@ -1585,20 +1600,19 @@ MRESULT wxFrame::OS2WindowProc(
break;
case WM_PAINT:
{
HPS hPS;
RECTL vRect;
wxPaintEvent vEvent;
hPS = WinBeginPaint(m_hWnd, 0L, &vRect);
::WinFillRect(hPS, &vRect, CLR_BLUE /* SYSCLR_WINDOW */);
::WinEndPaint(hPS);
bProcessed = HandlePaint();
mRc = (MRESULT)FALSE;
vEvent.SetEventObject(this);
GetEventHandler()->ProcessEvent(vEvent);
bProcessed = TRUE;
}
break;
case WM_ERASEBACKGROUND:
//
// Returning TRUE to requests PM to paint the window background
// in SYSCLR_WINDOW. We capture this here because the PS returned
// in Frames is the PS for the whole frame, which we can't really
// use at all. If you want to paint a different background, do it
// in an OnPaint using a wxPaintDC.
//
mRc = (MRESULT)(TRUE);
break;
case WM_COMMAND:
@@ -1656,15 +1670,6 @@ MRESULT wxFrame::OS2WindowProc(
mRc = (MRESULT)FALSE;
break;
case WM_ERASEBACKGROUND:
//
// Return TRUE to request PM to paint the window background
// in SYSCLR_WINDOW.
//
bProcessed = TRUE;
mRc = (MRESULT)(TRUE);
break;
case CM_QUERYDRAGIMAGE:
{
HPOINTER hIcon;

View File

@@ -263,7 +263,7 @@ bool wxPen::RealizeResource()
}
m_vAreaBundle.lColor = vPmColour;
m_vAreaBundle.lBackColor = CLR_DEFAULT;
m_vAreaBundle.lBackColor = RGB_WHITE;
m_vAreaBundle.usMixMode = FM_OVERPAINT;
m_vAreaBundle.usBackMixMode = BM_OVERPAINT;

View File

@@ -29,24 +29,51 @@ class WXDLLEXPORT wxRegionRefData : public wxGDIRefData {
public:
wxRegionRefData()
{
m_region = 0;
m_hRegion = 0;
}
wxRegionRefData(const wxRegionRefData& data)
wxRegionRefData(const wxRegionRefData& rData)
{
// TODO
RGNRECT vRgnData;
PRECTL pRect = NULL;
if (::GpiQueryRegionRects( rData.m_hPS // Pres space
,rData.m_hRegion // Handle of region to query
,NULL // Return all RECTs
,&vRgnData // Will contain number or RECTs in region
,NULL // NULL to return number of RECTs
))
{
pRect = new RECTL[vRgnData.crcReturned];
vRgnData.crc = vRgnData.crcReturned;
vRgnData.ircStart = 1;
if (::GpiQueryRegionRects( rData.m_hPS // Pres space of source
,rData.m_hRegion // Handle of source region
,NULL // Return all RECTs
,&vRgnData // Operations set to return rects
,pRect // Will contain the actual RECTS
))
{
m_hRegion = ::GpiCreateRegion( rData.m_hPS
,vRgnData.crcReturned
,pRect
);
m_hPS = rData.m_hPS;
}
delete [] pRect;
}
}
~wxRegionRefData()
{
// TODO
::GpiDestroyRegion(m_hPS, m_hRegion);
}
HRGN m_region;
HRGN m_hRegion;
HPS m_hPS;
};
#define M_REGION (((wxRegionRefData*)m_refData)->m_region)
#define M_REGION (((wxRegionRefData*)m_refData)->m_hRegion)
//-----------------------------------------------------------------------------
// wxRegion
@@ -58,151 +85,331 @@ public:
wxRegion::wxRegion()
{
m_refData = new wxRegionRefData;
// TODO create empty region
}
} // end of wxRegion::wxRegion
wxRegion::wxRegion(WXHRGN hRegion)
wxRegion::wxRegion(
WXHRGN hRegion
)
{
m_refData = new wxRegionRefData;
M_REGION = (HRGN) hRegion;
}
} // end of wxRegion::wxRegion
wxRegion::wxRegion(wxCoord x, wxCoord y, wxCoord w, wxCoord h)
wxRegion::wxRegion(
wxCoord x
, wxCoord y
, wxCoord vWidth
, wxCoord vHeight
)
{
m_refData = new wxRegionRefData;
// TODO create rect region
}
RECTL vRect;
SIZEL vSize = {0, 0};
DEVOPENSTRUC vDop = {0L, "DISPLAY", NULL, 0L, 0L, 0L, 0L, 0L, 0L};
HDC hDC = ::DevOpenDC( vHabmain
,OD_MEMORY
,"*"
,5L
,(PDEVOPENDATA)&vDop
,NULLHANDLE
);
wxRegion::wxRegion(const wxPoint& topLeft, const wxPoint& bottomRight)
vRect.xLeft = x;
vRect.xRight = x + vWidth;
vRect.yBottom = y;
vRect.yTop = y + vHeight;
m_refData = new wxRegionRefData;
//
// Need a PS to create a Region
//
((wxRegionRefData*)m_refData)->m_hPS = ::GpiCreatePS( vHabmain
,hDC
,&vSize
,PU_PELS | GPIT_MICRO | GPIA_ASSOC
);
M_REGION = ::GpiCreateRegion( ((wxRegionRefData*)m_refData)->m_hPS
,1
,&vRect
);
} // end of wxRegion::wxRegion
wxRegion::wxRegion(
const wxPoint& rTopLeft
, const wxPoint& rBottomRight
)
{
m_refData = new wxRegionRefData;
// TODO create rect region
}
RECTL vRect;
SIZEL vSize = {0, 0};
DEVOPENSTRUC vDop = {0L, "DISPLAY", NULL, 0L, 0L, 0L, 0L, 0L, 0L};
HDC hDC = ::DevOpenDC( vHabmain
,OD_MEMORY
,"*"
,5L
,(PDEVOPENDATA)&vDop
,NULLHANDLE
);
wxRegion::wxRegion(const wxRect& rect)
vRect.xLeft = rTopLeft.x;
vRect.xRight = rBottomRight.x;
vRect.yBottom = rBottomRight.y;
vRect.yTop = rTopLeft.y;
m_refData = new wxRegionRefData;
//
// Need a PS to create a Region
//
((wxRegionRefData*)m_refData)->m_hPS = ::GpiCreatePS( vHabmain
,hDC
,&vSize
,PU_PELS | GPIT_MICRO | GPIA_ASSOC
);
M_REGION = ::GpiCreateRegion( ((wxRegionRefData*)m_refData)->m_hPS
,1
,&vRect
);
} // end of wxRegion::wxRegion
wxRegion::wxRegion(
const wxRect& rRect
)
{
m_refData = new wxRegionRefData;
// TODO create rect region
}
RECTL vRect;
SIZEL vSize = {0, 0};
DEVOPENSTRUC vDop = {0L, "DISPLAY", NULL, 0L, 0L, 0L, 0L, 0L, 0L};
HDC hDC = ::DevOpenDC( vHabmain
,OD_MEMORY
,"*"
,5L
,(PDEVOPENDATA)&vDop
,NULLHANDLE
);
/*!
* Destroy the region.
*/
vRect.xLeft = rRect.x;
vRect.xRight = rRect.x + rRect.width;
vRect.yBottom = rRect.y;
vRect.yTop = rRect.y + rRect.height;
m_refData = new wxRegionRefData;
//
// Need a PS to create a Region
//
((wxRegionRefData*)m_refData)->m_hPS = ::GpiCreatePS( vHabmain
,hDC
,&vSize
,PU_PELS | GPIT_MICRO | GPIA_ASSOC
);
M_REGION = ::GpiCreateRegion( ((wxRegionRefData*)m_refData)->m_hPS
,1
,&vRect
);
} // end of wxRegion::wxRegion
//
// Destroy the region.
//
wxRegion::~wxRegion()
{
// m_refData unrefed in ~wxObject
}
} // end of wxRegion::~wxRegion
//-----------------------------------------------------------------------------
//# Modify region
//-----------------------------------------------------------------------------
//! Clear current region
//
// Clear current region
//
void wxRegion::Clear()
{
UnRef();
}
} // end of wxRegion::Clear
//! Combine rectangle (x, y, w, h) with this.
bool wxRegion::Combine(wxCoord x, wxCoord y, wxCoord width, wxCoord height, wxRegionOp op)
//
// Combine rectangle (x, y, w, h) with this.
//
bool wxRegion::Combine(
wxCoord x
, wxCoord y
, wxCoord vWidth
, wxCoord vHeight
, wxRegionOp eOp
)
{
//
// Don't change shared data
if (!m_refData) {
//
if (!m_refData)
{
m_refData = new wxRegionRefData();
} else if (m_refData->GetRefCount() > 1) {
wxRegionRefData* ref = (wxRegionRefData*)m_refData;
UnRef();
m_refData = new wxRegionRefData(*ref);
}
else if (m_refData->GetRefCount() > 1)
{
wxRegionRefData* pRef = (wxRegionRefData*)m_refData;
UnRef();
m_refData = new wxRegionRefData(*pRef);
}
//
// If ref count is 1, that means it's 'ours' anyway so no action.
//
RECTL vRect;
// TODO create rect region
vRect.xLeft = x;
vRect.xRight = x + vWidth;
vRect.yBottom = y;
vRect.yTop = y + vHeight;
int mode = 0; // TODO platform-specific code
switch (op)
HRGN hRgn = ::GpiCreateRegion( ((wxRegionRefData*)m_refData)->m_hPS
,1
,&vRect
);
LONG lMode = 0L;
switch (eOp)
{
case wxRGN_AND:
// TODO
break ;
lMode = CRGN_AND;
break;
case wxRGN_OR:
// TODO
break ;
lMode = CRGN_OR;
break;
case wxRGN_XOR:
// TODO
break ;
lMode = CRGN_XOR;
break;
case wxRGN_DIFF:
// TODO
break ;
lMode = CRGN_DIFF;
break;
case wxRGN_COPY:
default:
// TODO
break ;
lMode = CRGN_COPY;
break;
}
bool bSuccess = ::GpiCombineRegion( ((wxRegionRefData*)m_refData)->m_hPS
,M_REGION
,M_REGION
,hRgn
,lMode
);
::GpiDestroyRegion ( ((wxRegionRefData*)m_refData)->m_hPS
,hRgn
);
// TODO do combine region
return bSuccess;
} // end of wxRegion::Combine
return FALSE;
}
//! Union /e region with this.
bool wxRegion::Combine(const wxRegion& region, wxRegionOp op)
//
// Union region with this.
//
bool wxRegion::Combine(
const wxRegion& rRegion
, wxRegionOp eOp
)
{
if (region.Empty())
if (rRegion.Empty())
return FALSE;
//
// Don't change shared data
if (!m_refData) {
//
if (!m_refData)
{
m_refData = new wxRegionRefData();
} else if (m_refData->GetRefCount() > 1) {
wxRegionRefData* ref = (wxRegionRefData*)m_refData;
}
else if (m_refData->GetRefCount() > 1)
{
wxRegionRefData* pRef = (wxRegionRefData*)m_refData;
UnRef();
m_refData = new wxRegionRefData(*ref);
m_refData = new wxRegionRefData(*pRef);
}
int mode = 0; // TODO platform-specific code
switch (op)
LONG lMode = 0;
switch (eOp)
{
case wxRGN_AND:
// TODO
break ;
lMode = CRGN_AND;
break;
case wxRGN_OR:
// TODO
break ;
lMode = CRGN_OR;
break;
case wxRGN_XOR:
// TODO
break ;
lMode = CRGN_XOR;
break;
case wxRGN_DIFF:
// TODO
break ;
lMode = CRGN_DIFF;
break;
case wxRGN_COPY:
default:
// TODO
break ;
lMode = CRGN_COPY;
break;
}
return (::GpiCombineRegion( ((wxRegionRefData*)rRegion.m_refData)->m_hPS
,M_REGION
,M_REGION
,((wxRegionRefData*)rRegion.m_refData)->m_hRegion
,lMode
) != RGN_ERROR);
} // end of wxRegion::Combine
// TODO combine region
return FALSE;
}
bool wxRegion::Combine(const wxRect& rect, wxRegionOp op)
bool wxRegion::Combine(
const wxRect& rRect
, wxRegionOp eOp
)
{
return Combine(rect.GetLeft(), rect.GetTop(), rect.GetWidth(), rect.GetHeight(), op);
}
return Combine( rRect.GetLeft()
,rRect.GetTop()
,rRect.GetWidth()
,rRect.GetHeight()
,eOp
);
} // end of wxRegion::Combine
//-----------------------------------------------------------------------------
//# Information on region
//-----------------------------------------------------------------------------
//
// Outer bounds of region
void wxRegion::GetBox(wxCoord& x, wxCoord& y, wxCoord&w, wxCoord &h) const
//
void wxRegion::GetBox(
wxCoord& x
, wxCoord& y
, wxCoord& vWidth
, wxCoord& vHeight
) const
{
if (m_refData) {
// TODO get box
} else {
x = y = w = h = 0;
if (m_refData)
{
RECTL vRect;
::GpiQueryRegionBox( ((wxRegionRefData*)m_refData)->m_hPS
,M_REGION
,&vRect
);
x = vRect.xLeft;
y = vRect.yTop;
vWidth = vRect.xRight - vRect.xLeft;
vHeight = vRect.yTop - vRect.yBottom;
}
}
else
{
x = y = vWidth = vHeight = 0L;
}
} // end of wxRegion::GetBox
wxRect wxRegion::GetBox() const
{
@@ -211,73 +418,136 @@ wxRect wxRegion::GetBox() const
return wxRect(x, y, w, h);
}
//
// Is region empty?
//
bool wxRegion::Empty() const
{
// TODO
return FALSE;
}
wxCoord x;
wxCoord y;
wxCoord vWidth;
wxCoord vHeight;
if (M_REGION == 0)
return TRUE;
GetBox( x
,y
,vWidth
,vHeight
);
return ((vWidth == 0) && (vHeight == 0));
} // end of wxRegion::Empty
//-----------------------------------------------------------------------------
//# Tests
// Tests
//-----------------------------------------------------------------------------
//
// Does the region contain the point (x,y)?
wxRegionContain wxRegion::Contains(wxCoord x, wxCoord y) const
wxRegionContain wxRegion::Contains(
wxCoord x
, wxCoord y
) const
{
bool bOK = FALSE; // temporary
bool bOK = FALSE;
POINTL vPoint;
vPoint.x = x;
vPoint.y = y;
if (!m_refData)
return wxOutRegion;
// TODO. Return wxInRegion if within region.
if (bOK)
LONG lInside = ::GpiPtInRegion( ((wxRegionRefData*)m_refData)->m_hPS
,M_REGION
,&vPoint
);
if (lInside == PRGN_INSIDE)
return wxInRegion;
return wxOutRegion;
}
} // end of wxRegion::Contains
//
// Does the region contain the point pt?
wxRegionContain wxRegion::Contains(const wxPoint& pt) const
//
wxRegionContain wxRegion::Contains(
const wxPoint& rPoint
) const
{
bool bOK = FALSE; // temporary
POINTL vPoint = { rPoint.x, rPoint.y };
if (!m_refData)
return wxOutRegion;
// TODO. Return wxInRegion if within region.
if (bOK)
LONG lInside = ::GpiPtInRegion( ((wxRegionRefData*)m_refData)->m_hPS
,M_REGION
,&vPoint
);
if (lInside == PRGN_INSIDE)
return wxInRegion;
else
return wxOutRegion;
}
} // end of wxRegion::Contains
//
// Does the region contain the rectangle (x, y, w, h)?
wxRegionContain wxRegion::Contains(wxCoord x, wxCoord y, wxCoord w, wxCoord h) const
//
wxRegionContain wxRegion::Contains(
wxCoord x
, wxCoord y
, wxCoord vWidth
, wxCoord vHeight
) const
{
bool bOK = FALSE; // temporary
RECTL vRect;
if (!m_refData)
return wxOutRegion;
// TODO. Return wxInRegion if within region.
if (bOK)
vRect.xLeft = x;
vRect.yTop = y;
vRect.xRight = x + vWidth;
vRect.yBottom = y + vHeight;
if (PRGN_INSIDE == ::GpiRectInRegion( ((wxRegionRefData*)m_refData)->m_hPS
,M_REGION
,&vRect
))
return wxInRegion;
else
return wxOutRegion;
}
} // end of wxRegion::Contains
//
// Does the region contain the rectangle rect
wxRegionContain wxRegion::Contains(const wxRect& rect) const
//
wxRegionContain wxRegion::Contains(
const wxRect& rRect
) const
{
if (!m_refData)
return wxOutRegion;
wxCoord x, y, w, h;
x = rect.x;
y = rect.y;
w = rect.GetWidth();
h = rect.GetHeight();
return Contains(x, y, w, h);
}
wxCoord x;
wxCoord y;
wxCoord vWidth;
wxCoord vHeight;
x = rRect.x;
y = rRect.y;
vWidth = rRect.GetWidth();
vHeight = rRect.GetHeight();
return Contains( x
,y
,vWidth
,vHeight
);
} // end of wxRegion::Contains
//
// Get internal region handle
//
WXHRGN wxRegion::GetHRGN() const
{
if (!m_refData)
@@ -291,96 +561,136 @@ WXHRGN wxRegion::GetHRGN() const
// //
///////////////////////////////////////////////////////////////////////////////
/*!
* Initialize empty iterator
*/
wxRegionIterator::wxRegionIterator() : m_current(0), m_numRects(0), m_rects(NULL)
//
// Initialize empty iterator
//
wxRegionIterator::wxRegionIterator()
: m_lCurrent(0)
, m_lNumRects(0)
, m_pRects(NULL)
{
}
} // end of wxRegionIterator::wxRegionIterator
wxRegionIterator::~wxRegionIterator()
{
if (m_rects)
delete[] m_rects;
}
if (m_pRects)
delete[] m_pRects;
} // end of wxRegionIterator::~wxRegionIterator
/*!
* Initialize iterator for region
*/
wxRegionIterator::wxRegionIterator(const wxRegion& region)
//
// Initialize iterator for region
//
wxRegionIterator::wxRegionIterator(
const wxRegion& rRegion
)
{
m_rects = NULL;
m_pRects = NULL;
Reset(rRegion);
} // end of wxRegionIterator::wxRegionIterator
Reset(region);
}
/*!
* Reset iterator for a new /e region.
*/
void wxRegionIterator::Reset(const wxRegion& region)
//
// Reset iterator for a new /e region.
//
void wxRegionIterator::Reset(
const wxRegion& rRegion
)
{
m_current = 0;
m_region = region;
m_lCurrent = 0;
m_vRegion = rRegion;
if (m_rects)
delete[] m_rects;
if (m_pRects)
delete[] m_pRects;
m_rects = NULL;
m_pRects = NULL;
if (m_region.Empty())
m_numRects = 0;
if (m_vRegion.Empty())
m_lNumRects = 0;
else
{
// TODO create m_rects and fill with rectangles for this region
m_numRects = 0;
RGNRECT vRgnData;
PRECTL pRect;
if (::GpiQueryRegionRects( ((wxRegionRefData*)rRegion.m_refData)->m_hPS // Pres space
,((wxRegionRefData*)rRegion.m_refData)->m_hRegion // Handle of region to query
,NULL // Return all RECTs
,&vRgnData // Will contain number or RECTs in region
,NULL // NULL to return number of RECTs
))
{
pRect = new RECTL[vRgnData.crcReturned];
m_pRects = new wxRect[vRgnData.crcReturned];
vRgnData.crc = vRgnData.crcReturned;
m_lNumRects = vRgnData.crcReturned;
vRgnData.ircStart = 1;
if (::GpiQueryRegionRects( ((wxRegionRefData*)rRegion.m_refData)->m_hPS // Pres space of source
,((wxRegionRefData*)rRegion.m_refData)->m_hRegion // Handle of source region
,NULL // Return all RECTs
,&vRgnData // Operations set to return rects
,pRect // Will contain the actual RECTS
))
{
M_REGION = ::GpiCreateRegion( ((wxRegionRefData*)rRegion.m_refData)->m_hPS
,vRgnData.crcReturned
,pRect
);
for( LONG i = 0; i < m_lNumRects; i++)
{
m_pRects[i].x = pRect[i].xLeft;
m_pRects[i].width = pRect[i].xRight - pRect[i].xLeft;
m_pRects[i].y = pRect[i].yBottom;
m_pRects[i].height = pRect[i].yTop - pRect[i].yBottom;
}
}
((wxRegionRefData*)m_refData)->m_hPS = ((wxRegionRefData*)rRegion.m_refData)->m_hPS;
}
}
}
} // end of wxRegionIterator::Reset
/*!
* Increment iterator. The rectangle returned is the one after the
* incrementation.
*/
void wxRegionIterator::operator ++ ()
//
// Increment iterator. The rectangle returned is the one after the
// incrementation.
//
void wxRegionIterator::operator++ ()
{
if (m_current < m_numRects)
++m_current;
}
if (m_lCurrent < m_lNumRects)
++m_lCurrent;
} // end of wxRegionIterator::operator ++
/*!
* Increment iterator. The rectangle returned is the one before the
* incrementation.
*/
void wxRegionIterator::operator ++ (int)
//
// Increment iterator. The rectangle returned is the one before the
// incrementation.
//
void wxRegionIterator::operator++ (int)
{
if (m_current < m_numRects)
++m_current;
}
if (m_lCurrent < m_lNumRects)
++m_lCurrent;
} // end of wxRegionIterator::operator++
wxCoord wxRegionIterator::GetX() const
{
if (m_current < m_numRects)
return m_rects[m_current].x;
return 0;
}
if (m_lCurrent < m_lNumRects)
return m_pRects[m_lCurrent].x;
return 0L;
} // end of wxRegionIterator::GetX
wxCoord wxRegionIterator::GetY() const
{
if (m_current < m_numRects)
return m_rects[m_current].y;
return 0;
}
if (m_lCurrent < m_lNumRects)
return m_pRects[m_lCurrent].y;
return 0L;
} // end of wxRegionIterator::GetY
wxCoord wxRegionIterator::GetW() const
{
if (m_current < m_numRects)
return m_rects[m_current].width ;
return 0;
}
if (m_lCurrent < m_lNumRects)
return m_pRects[m_lCurrent].width ;
return 0L;
} // end of wxRegionIterator::GetW
wxCoord wxRegionIterator::GetH() const
{
if (m_current < m_numRects)
return m_rects[m_current].height;
return 0;
}
if (m_lCurrent < m_lNumRects)
return m_pRects[m_lCurrent].height;
return 0L;
} // end of wxRegionIterator::GetH

View File

@@ -2106,6 +2106,15 @@ MRESULT wxWindow::OS2WindowProc(
}
break;
#endif
case WM_ERASEBACKGROUND:
//
// Returning TRUE to requestw PM to paint the window background
// in SYSCLR_WINDOW. We don't really want that
//
bProcessed = HandleEraseBkgnd((WXHDC)(HPS)wParam);
mResult = (MRESULT)(FALSE);
break;
//
// Instead of CTLCOLOR messages PM sends QUERYWINDOWPARAMS to
// things such as colors and fonts and such
@@ -2133,17 +2142,6 @@ MRESULT wxWindow::OS2WindowProc(
bProcessed = HandlePresParamChanged(wParam);
break;
// move this to wxFrame
case WM_ERASEBACKGROUND:
bProcessed = HandleEraseBkgnd((WXHDC)(HDC)wParam);
if (bProcessed)
{
//
// We processed the message, i.e. erased the background
//
mResult = (MRESULT)TRUE;
}
break;
// move all drag and drops to wxDrg
case WM_ENDDRAG:
@@ -2844,47 +2842,36 @@ bool wxWindow::HandlePaint()
wxLogLastError("CreateRectRgn");
return FALSE;
}
//
// Debug code
//
#ifdef __WXDEBUG__
{
HWND hWnd;
HWND hWnd0 = NULLHANDLE;
hWnd = GetHwnd();
if(hWnd != hWnd0)
printf("HandlePaint hWnd=%x ",hWnd);
}
#endif
m_updateRegion = wxRegion(hRgn);
vEvent.SetEventObject(this);
return (GetEventHandler()->ProcessEvent(vEvent));
} // end of wxWindow::HandlePaint
bool wxWindow::HandleEraseBkgnd(WXHDC hdc)
bool wxWindow::HandleEraseBkgnd(
WXHDC hDC
)
{
// TODO: will have to worry about this later as part of
// the handling of changed presentation parameters
/*
if ( ::IsIconic(GetHwnd()) )
SWP vSwp;
::WinQueryWindowPos(GetHwnd(), &vSwp);
if (vSwp.fl & SWP_MINIMIZE)
return TRUE;
wxDC dc;
wxDC vDC;
dc.SetHDC(hdc);
dc.SetWindow(this);
dc.BeginDrawing();
vDC.m_hPS = (HPS)hDC; // this is really a PS
vDC.SetWindow(this);
vDC.BeginDrawing();
wxEraseEvent event(m_windowId, &dc);
event.SetEventObject(this);
bool rc = GetEventHandler()->ProcessEvent(event);
wxEraseEvent vEvent(m_windowId, &vDC);
dc.EndDrawing();
dc.SelectOldObjects(hdc);
dc.SetHDC((WXHDC) NULL);
*/
vEvent.SetEventObject(this);
bool rc = GetEventHandler()->ProcessEvent(vEvent);
vDC.EndDrawing();
vDC.m_hPS = NULLHANDLE;
return TRUE;
} // end of wxWindow::HandleEraseBkgnd
@@ -2892,7 +2879,11 @@ void wxWindow::OnEraseBackground(
wxEraseEvent& rEvent
)
{
// TODO:
RECTL vRect;
HPS hPS = rEvent.m_dc->m_hPS;
::WinQueryWindowRect(GetHwnd(), &vRect);
::WinFillRect(hPS, &vRect, m_backgroundColour.GetPixel());
} // end of wxWindow::OnEraseBackground
// ---------------------------------------------------------------------------