Added wxRegion version of wxWindowDC::SetClippingRegion

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@1098 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Julian Smart 1998-12-02 20:02:01 +00:00
parent f66b7050e0
commit a724d7892d
12 changed files with 91 additions and 13 deletions

View File

@ -533,11 +533,15 @@ whether text will be drawn with a background colour or not.
\func{void}{SetClippingRegion}{\param{long}{ x}, \param{long}{ y}, \param{long}{ width}, \param{long}{ height}}
Sets the clipping region for the DC. The clipping region is a rectangular area
to which drawing is restricted. Possible uses for the clipping region are for clipping text
\func{void}{SetClippingRegion}{\param{const wxRegion\&}{ region}}
Sets the clipping region for the DC. The clipping region is an area
to which drawing is restricted. Possible uses for the clipping region are for clipping text
or for speeding up window redraws when only a known area of the screen is damaged.
See also \helpref{wxDC::DestroyClippingRegion}{wxdcdestroyclippingregion}.
\wxheading{See also}
\helpref{wxDC::DestroyClippingRegion}{wxdcdestroyclippingregion}, \helpref{wxRegion}{wxregion}
\membersection{wxDC::SetPalette}\label{wxdcsetpalette}

View File

@ -79,6 +79,8 @@ Here are the steps required:
extra files to use the wxWindows makefiles. You can find these
files in ports/mingw32 on the ftp site or CD-ROM, as extra.zip.
These should be extracted to the Mingw32 directory.
IMPORTANT: also see mingw32.txt in this directory (docs/msw)
about a fix that has to be applied to a Mingw32 header file.
- Modify the file wx/src/cygnus.bat (or mingw32.bat or mingegcs.bat)
to set up appropriate variables, if necessary mounting drives.

View File

@ -89,6 +89,7 @@ class WXDLLEXPORT wxWindowDC: public wxDC
virtual void SetPalette( const wxPalette& palette );
virtual void SetClippingRegion( long x, long y, long width, long height );
virtual void SetClippingRegion( const wxRegion& region );
virtual void DestroyClippingRegion(void);
virtual void DrawSpline( wxList *points );

View File

@ -158,6 +158,7 @@ public:
{
SetClippingRegion(rect.x, rect.y, rect.width, rect.height);
}
virtual void SetClippingRegion(const wxRegion& region);
virtual void SetPalette(const wxPalette& palette);
#if WXWIN_COMPATIBILITY

View File

@ -101,6 +101,9 @@ public:
bool Combine(long x, long y, long width, long height, wxRegionOp op);
bool Combine(const wxRegion& region, wxRegionOp op);
bool Combine(const wxRect& rect, wxRegionOp op);
// Get internal region handle
WXHRGN GetHRGN() const;
};
class WXDLLEXPORT wxRegionIterator : public wxObject {

View File

@ -85,6 +85,7 @@ class WXDLLEXPORT wxWindowDC: public wxDC
virtual void SetPalette( const wxPalette& palette );
virtual void SetClippingRegion( long x, long y, long width, long height );
virtual void SetClippingRegion( const wxRegion& region ) ;
virtual void DestroyClippingRegion(void);
virtual void DrawSpline( wxList *points );

View File

@ -15,7 +15,7 @@ WXDIR = ../..
# this central makefile.
include $(WXDIR)/src/makeg95.env
OBJECTS = $(OBJDIR)/test.$(OBJSUFF)
OBJECTS = $(OBJDIR)/test.$(OBJSUFF) $(OBJDIR)/test_resources.$(OBJSUFF)
all: $(OBJDIR) test$(GUISUFFIX)$(EXESUFF)
@ -24,14 +24,16 @@ wx:
$(OBJDIR):
mkdir $(OBJDIR)
test$(GUISUFFIX)$(EXESUFF): $(OBJDIR)/test.$(OBJSUFF) test.res $(WXLIB)
$(CC) $(LDFLAGS) -o test$(GUISUFFIX)$(EXESUFF) $(OBJDIR)/test.$(OBJSUFF) $(XVIEW_LINK) $(LDLIBS)
$(RSRC) test.$(RESSUFF) test.exe
test$(GUISUFFIX)$(EXESUFF): $(OBJECTS) $(WXLIB)
$(CC) $(LDFLAGS) -o test$(GUISUFFIX)$(EXESUFF) $(OBJECTS) $(LDLIBS)
$(OBJDIR)/test.$(OBJSUFF): test.$(SRCSUFF)
$(CC) -c $(CPPFLAGS) -o $@ test.$(SRCSUFF)
test.res: test.rc
$(OBJDIR)/test_resources.o: test.rc
$(RESCOMP) -i test.rc -o $(OBJDIR)/test_resources.o $(RESFLAGS)
clean:
rm -f $(OBJECTS) test$(GUISUFFIX).exe core *.rsc *.res

View File

@ -2045,6 +2045,34 @@ void wxWindowDC::SetClippingRegion( long x, long y, long width, long height )
}
};
void wxWindowDC::SetClippingRegion( const wxRegion& region )
{
wxRect box = region.GetBox();
wxDC::SetClippingRegion( box.x, box.y, box.width, box.height );
if (m_userRegion)
XDestroyRegion ((Region) m_userRegion);
m_userRegion = (WXRegion) XCreateRegion ();
XUnionRegion((Region) m_userRegion, (Region) region.GetXRegion(), (Region) m_userRegion);
SetDCClipping ();
// Needs to work differently for Pixmap: without this,
// there's a nasty (Display*) m_display bug. 8/12/94
if (m_window && m_window->GetBackingPixmap())
{
XRectangle rects[1];
rects[0].x = XLOG2DEV_2(box.x);
rects[0].y = YLOG2DEV_2(box.y);
rects[0].width = XLOG2DEVREL(box.width);
rects[0].height = YLOG2DEVREL(box.height);
XSetClipRectangles((Display*) m_display, (GC) m_gcBacking, 0, 0, rects, 1, Unsorted);
}
};
void wxWindowDC::DestroyClippingRegion(void)
{
wxDC::DestroyClippingRegion();

View File

@ -206,9 +206,7 @@ bool wxRegion::Combine(const wxRegion& region, wxRegionOp op)
break ;
}
// TODO combine region
return FALSE;
return FALSE;
}
bool wxRegion::Combine(const wxRect& rect, wxRegionOp op)

View File

@ -181,6 +181,22 @@ void wxDC::SetClippingRegion(long cx, long cy, long cw, long ch)
DoClipping((WXHDC) m_hDC);
}
void wxDC::SetClippingRegion(const wxRegion& region)
{
if (!region.GetHRGN())
return;
wxRect box = region.GetBox();
m_clipping = TRUE;
m_clipX1 = box.x;
m_clipY1 = box.y;
m_clipX2 = box.x + box.width;
m_clipY2 = box.y + box.height;
ExtSelectClipRgn((HDC) m_hDC, (HRGN) region.GetHRGN(), RGN_AND);
}
void wxDC::DoClipping(WXHDC dc)
{
if (m_clipping && dc)
@ -194,11 +210,14 @@ void wxDC::DestroyClippingRegion(void)
{
if (m_clipping && m_hDC)
{
// TODO: this should restore the previous clipping region,
// so that OnPaint processing works correctly, and the update clipping region
// doesn't get destroyed after the first DestroyClippingRegion.
HRGN rgn = CreateRectRgn(0, 0, 32000, 32000);
SelectClipRgn((HDC) m_hDC, rgn);
DeleteObject(rgn);
}
m_clipping = FALSE;
}
m_clipping = FALSE;
}
bool wxDC::CanDrawBitmap(void) const

View File

@ -288,6 +288,14 @@ wxRegionContain wxRegion::Contains(const wxRect& rect) const
return Contains(x, y, w, h);
}
// Get internal region handle
WXHRGN wxRegion::GetHRGN() const
{
if (!m_refData)
return (WXHRGN) 0;
return (WXHRGN) M_REGION;
}
///////////////////////////////////////////////////////////////////////////////
// //
// wxRegionIterator //

View File

@ -448,9 +448,20 @@ void wxWindowDC::SetPalette( const wxPalette& WXUNUSED(palette) )
void wxWindowDC::SetClippingRegion( long x, long y, long width, long height )
{
wxDC::SetClippingRegion( x, y, width, height );
// TODO
};
void wxWindowDC::SetClippingRegion( const wxRegion& region )
{
wxRect box = region.GetBox();
wxDC::SetClippingRegion( box.x, box.y, box.width, box.height );
// TODO
}
void wxWindowDC::DestroyClippingRegion(void)
{
wxDC::DestroyClippingRegion();