implemented wxRegion::Offset() for MSW and documented it

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@13936 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin 2002-01-31 16:00:13 +00:00
parent aa21a09f91
commit 0fb067bbe6
3 changed files with 91 additions and 49 deletions

View File

@ -24,7 +24,7 @@ reference counting, so copying and assignment operations are fast.
Default constructor. Default constructor.
\func{}{wxRegion}{\param{long}{ x}, \param{long}{ y}, \param{long}{ width}, \param{long}{ height}} \func{}{wxRegion}{\param{wxCoord}{ x}, \param{wxCoord}{ y}, \param{wxCoord}{ width}, \param{wxCoord}{ height}}
Constructs a rectangular region with the given position and size. Constructs a rectangular region with the given position and size.
@ -97,7 +97,7 @@ Returns the outer bounds of the region.
\membersection{wxRegion::Intersect}\label{wxregionintersect} \membersection{wxRegion::Intersect}\label{wxregionintersect}
\func{bool}{Intersect}{\param{long}{ x}, \param{long}{ y}, \param{long}{ width}, \param{long}{ height}} \func{bool}{Intersect}{\param{wxCoord}{ x}, \param{wxCoord}{ y}, \param{wxCoord}{ width}, \param{wxCoord}{ height}}
Finds the intersection of this region and another, rectangular region, specified using position and size. Finds the intersection of this region and another, rectangular region, specified using position and size.
@ -111,7 +111,7 @@ Finds the intersection of this region and another region.
\wxheading{Return value} \wxheading{Return value}
TRUE if successful, FALSE otherwise. {\tt TRUE} if successful, {\tt FALSE} otherwise.
\wxheading{Remarks} \wxheading{Remarks}
@ -122,7 +122,7 @@ is stored in this region.
\constfunc{bool}{IsEmpty}{\void} \constfunc{bool}{IsEmpty}{\void}
Returns TRUE if the region is empty, FALSE otherwise. Returns {\tt TRUE} if the region is empty, {\tt FALSE} otherwise.
\membersection{wxRegion::Subtract}\label{wxregionsubstract} \membersection{wxRegion::Subtract}\label{wxregionsubstract}
@ -136,16 +136,27 @@ Subtracts a region from this region.
\wxheading{Return value} \wxheading{Return value}
TRUE if successful, FALSE otherwise. {\tt TRUE} if successful, {\tt FALSE} otherwise.
\wxheading{Remarks} \wxheading{Remarks}
This operation combines the parts of 'this' region that are not part of the second region. This operation combines the parts of 'this' region that are not part of the second region.
The result is stored in this region. The result is stored in this region.
\membersection{wxRegion::Offset}\label{wxregionoffset}
\func{bool}{Offset}{\param{wxCoord}{ x}, \param{wxCoord}{ y}}
Moves the region by the specified offsets in horizontal and vertical
directions.
\wxheading{Return value}
{\tt TRUE} if successful, {\tt FALSE} otherwise (the region is unchanged then).
\membersection{wxRegion::Union}\label{wxregionunion} \membersection{wxRegion::Union}\label{wxregionunion}
\func{bool}{Union}{\param{long}{ x}, \param{long}{ y}, \param{long}{ width}, \param{long}{ height}} \func{bool}{Union}{\param{wxCoord}{ x}, \param{wxCoord}{ y}, \param{wxCoord}{ width}, \param{wxCoord}{ height}}
Finds the union of this region and another, rectangular region, specified using position and size. Finds the union of this region and another, rectangular region, specified using position and size.
@ -159,7 +170,7 @@ Finds the union of this region and another region.
\wxheading{Return value} \wxheading{Return value}
TRUE if successful, FALSE otherwise. {\tt TRUE} if successful, {\tt FALSE} otherwise.
\wxheading{Remarks} \wxheading{Remarks}
@ -168,7 +179,7 @@ The result is stored in this region.
\membersection{wxRegion::Xor}\label{wxregionxor} \membersection{wxRegion::Xor}\label{wxregionxor}
\func{bool}{Xor}{\param{long}{ x}, \param{long}{ y}, \param{long}{ width}, \param{long}{ height}} \func{bool}{Xor}{\param{wxCoord}{ x}, \param{wxCoord}{ y}, \param{wxCoord}{ width}, \param{wxCoord}{ height}}
Finds the Xor of this region and another, rectangular region, specified using position and size. Finds the Xor of this region and another, rectangular region, specified using position and size.
@ -182,7 +193,7 @@ Finds the Xor of this region and another region.
\wxheading{Return value} \wxheading{Return value}
TRUE if successful, FALSE otherwise. {\tt TRUE} if successful, {\tt FALSE} otherwise.
\wxheading{Remarks} \wxheading{Remarks}
@ -231,37 +242,37 @@ Creates an iterator object given a region.
\membersection{wxRegionIterator::GetX} \membersection{wxRegionIterator::GetX}
\constfunc{long}{GetX}{\void} \constfunc{wxCoord}{GetX}{\void}
Returns the x value for the current region. Returns the x value for the current region.
\membersection{wxRegionIterator::GetY} \membersection{wxRegionIterator::GetY}
\constfunc{long}{GetY}{\void} \constfunc{wxCoord}{GetY}{\void}
Returns the y value for the current region. Returns the y value for the current region.
\membersection{wxRegionIterator::GetW} \membersection{wxRegionIterator::GetW}
\constfunc{long}{GetW}{\void} \constfunc{wxCoord}{GetW}{\void}
An alias for GetWidth. An alias for GetWidth.
\membersection{wxRegionIterator::GetWidth} \membersection{wxRegionIterator::GetWidth}
\constfunc{long}{GetWidth}{\void} \constfunc{wxCoord}{GetWidth}{\void}
Returns the width value for the current region. Returns the width value for the current region.
\membersection{wxRegionIterator::GetH} \membersection{wxRegionIterator::GetH}
\constfunc{long}{GetH}{\void} \constfunc{wxCoord}{GetH}{\void}
An alias for GetHeight. An alias for GetHeight.
\membersection{wxRegionIterator::GetHeight} \membersection{wxRegionIterator::GetHeight}
\constfunc{long}{GetWidth}{\void} \constfunc{wxCoord}{GetWidth}{\void}
Returns the width value for the current region. Returns the width value for the current region.
@ -275,7 +286,7 @@ Returns the current rectangle.
\constfunc{bool}{HaveRects}{\void} \constfunc{bool}{HaveRects}{\void}
Returns TRUE if there are still some rectangles; otherwise returns FALSE. Returns {\tt TRUE} if there are still some rectangles; otherwise returns {\tt FALSE}.
\membersection{wxRegionIterator::Reset} \membersection{wxRegionIterator::Reset}
@ -299,7 +310,7 @@ Increment operator. Increments the iterator to the next region.
\constfunc{}{operator bool}{\void} \constfunc{}{operator bool}{\void}
Returns TRUE if there are still some rectangles; otherwise returns FALSE. Returns {\tt TRUE} if there are still some rectangles; otherwise returns {\tt FALSE}.
You can use this to test the iterator object as if it were of type bool. You can use this to test the iterator object as if it were of type bool.

View File

@ -59,31 +59,38 @@ public:
{ Ref(r); return (*this); } { Ref(r); return (*this); }
// Modify region // Modify region
// -------------
// Clear current region // Clear current region
void Clear(void); void Clear();
// Move the region
bool Offset(wxCoord x, wxCoord y);
// Union rectangle or region with this. // Union rectangle or region with this.
inline bool Union(wxCoord x, wxCoord y, wxCoord width, wxCoord height) { return Combine(x, y, width, height, wxRGN_OR); } bool Union(wxCoord x, wxCoord y, wxCoord width, wxCoord height) { return Combine(x, y, width, height, wxRGN_OR); }
inline bool Union(const wxRect& rect) { return Combine(rect, wxRGN_OR); } bool Union(const wxRect& rect) { return Combine(rect, wxRGN_OR); }
inline bool Union(const wxRegion& region) { return Combine(region, wxRGN_OR); } bool Union(const wxRegion& region) { return Combine(region, wxRGN_OR); }
// Intersect rectangle or region with this. // Intersect rectangle or region with this.
inline bool Intersect(wxCoord x, wxCoord y, wxCoord width, wxCoord height) { return Combine(x, y, width, height, wxRGN_AND); } bool Intersect(wxCoord x, wxCoord y, wxCoord width, wxCoord height) { return Combine(x, y, width, height, wxRGN_AND); }
inline bool Intersect(const wxRect& rect) { return Combine(rect, wxRGN_AND); } bool Intersect(const wxRect& rect) { return Combine(rect, wxRGN_AND); }
inline bool Intersect(const wxRegion& region) { return Combine(region, wxRGN_AND); } bool Intersect(const wxRegion& region) { return Combine(region, wxRGN_AND); }
// Subtract rectangle or region from this: // Subtract rectangle or region from this:
// Combines the parts of 'this' that are not part of the second region. // Combines the parts of 'this' that are not part of the second region.
inline bool Subtract(wxCoord x, wxCoord y, wxCoord width, wxCoord height) { return Combine(x, y, width, height, wxRGN_DIFF); } bool Subtract(wxCoord x, wxCoord y, wxCoord width, wxCoord height) { return Combine(x, y, width, height, wxRGN_DIFF); }
inline bool Subtract(const wxRect& rect) { return Combine(rect, wxRGN_DIFF); } bool Subtract(const wxRect& rect) { return Combine(rect, wxRGN_DIFF); }
inline bool Subtract(const wxRegion& region) { return Combine(region, wxRGN_DIFF); } bool Subtract(const wxRegion& region) { return Combine(region, wxRGN_DIFF); }
// XOR: the union of two combined regions except for any overlapping areas. // XOR: the union of two combined regions except for any overlapping areas.
inline bool Xor(wxCoord x, wxCoord y, wxCoord width, wxCoord height) { return Combine(x, y, width, height, wxRGN_XOR); } bool Xor(wxCoord x, wxCoord y, wxCoord width, wxCoord height) { return Combine(x, y, width, height, wxRGN_XOR); }
inline bool Xor(const wxRect& rect) { return Combine(rect, wxRGN_XOR); } bool Xor(const wxRect& rect) { return Combine(rect, wxRGN_XOR); }
inline bool Xor(const wxRegion& region) { return Combine(region, wxRGN_XOR); } bool Xor(const wxRegion& region) { return Combine(region, wxRGN_XOR); }
// Information on region // Information on region
// ---------------------
// Outer bounds of region // Outer bounds of region
void GetBox(wxCoord& x, wxCoord& y, wxCoord&w, wxCoord &h) const; void GetBox(wxCoord& x, wxCoord& y, wxCoord&w, wxCoord &h) const;
wxRect GetBox(void) const ; wxRect GetBox(void) const ;
@ -110,8 +117,13 @@ public:
// Get internal region handle // Get internal region handle
WXHRGN GetHRGN() const; WXHRGN GetHRGN() const;
DECLARE_DYNAMIC_CLASS(wxRegion); protected:
virtual wxObjectRefData *CreateData() const;
virtual wxObjectRefData *CloneData(wxObjectRefData *data) const;
friend class WXDLLEXPORT wxRegionIterator; friend class WXDLLEXPORT wxRegionIterator;
DECLARE_DYNAMIC_CLASS(wxRegion)
}; };
class WXDLLEXPORT wxRegionIterator : public wxObject class WXDLLEXPORT wxRegionIterator : public wxObject

View File

@ -127,6 +127,16 @@ wxRegion::~wxRegion()
// m_refData unrefed in ~wxObject // m_refData unrefed in ~wxObject
} }
wxObjectRefData *wxRegion::CreateData() const
{
return new wxRegionRefData;
}
wxObjectRefData *wxRegion::CloneData(wxObjectRefData *data) const
{
return new wxRegionRefData(*(wxRegionRefData *)data);
}
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
// Modify region // Modify region
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
@ -137,18 +147,30 @@ void wxRegion::Clear()
UnRef(); UnRef();
} }
bool wxRegion::Offset(wxCoord x, wxCoord y)
{
if ( !x && !y )
{
// nothing to do
return TRUE;
}
AllocExclusive();
if ( ::OffsetRgn(GetHrgn(), x, y) == ERROR )
{
wxLogLastError(_T("OffsetRgn"));
return FALSE;
}
return TRUE;
}
// Combine rectangle (x, y, w, h) with this. // Combine rectangle (x, y, w, h) with this.
bool wxRegion::Combine(wxCoord x, wxCoord y, wxCoord width, wxCoord height, wxRegionOp op) bool wxRegion::Combine(wxCoord x, wxCoord y, wxCoord width, wxCoord height, wxRegionOp op)
{ {
// Don't change shared data AllocExclusive();
if (!m_refData) {
m_refData = new wxRegionRefData();
} else if (m_refData->GetRefCount() > 1) {
wxRegionRefData* ref = (wxRegionRefData*)m_refData;
UnRef();
m_refData = new wxRegionRefData(*ref);
}
// If ref count is 1, that means it's 'ours' anyway so no action.
HRGN rectRegion = ::CreateRectRgn(x, y, x + width, y + height); HRGN rectRegion = ::CreateRectRgn(x, y, x + width, y + height);
@ -164,7 +186,11 @@ bool wxRegion::Combine(wxCoord x, wxCoord y, wxCoord width, wxCoord height, wxRe
mode = RGN_COPY; break ; mode = RGN_COPY; break ;
} }
bool success = (ERROR != ::CombineRgn(M_REGION, M_REGION, rectRegion, mode)); bool success = ::CombineRgn(M_REGION, M_REGION, rectRegion, mode) != ERROR;
if ( !success )
{
wxLogLastError(_T("CombineRgn"));
}
::DeleteObject(rectRegion); ::DeleteObject(rectRegion);
@ -177,14 +203,7 @@ bool wxRegion::Combine(const wxRegion& region, wxRegionOp op)
if (region.Empty()) if (region.Empty())
return FALSE; return FALSE;
// Don't change shared data AllocExclusive();
if (!m_refData) {
m_refData = new wxRegionRefData();
} else if (m_refData->GetRefCount() > 1) {
wxRegionRefData* ref = (wxRegionRefData*)m_refData;
UnRef();
m_refData = new wxRegionRefData(*ref);
}
int mode = 0; int mode = 0;
switch (op) switch (op)