Introduction
CGDIRect
was born around mid-day. The mid-wife on duty was a kind and gentle old lady who wasn't in a hurry to deliver what was destined to be a mediator between the obstinate and the uncompliant. It's parents are nowhere to be found and so our little orphan grew up acquiring the skills and abilities of it's peers, while energetically pursuing it's destiny as a facilitator. In fact, after a time in this environment, CGDIRect
found that on his own, he is demoralisingly bored. Put him between, beside, in front or even around a CRect
, CRect
or Rect
, and he'll be "in his element". His peers would naturally refuse to talk to each other on any really productive level, and would sneer at those of a different class... until CGDIRect
came along.
Why no parents? He could have been born a descendant of RectF
and acquired his skills along the way. This is a matter that could be discussed endlessly, causing division and needless strife. It remains for those who would discriminate on account of CGDIRect
's lineage, whether they would choose to enjoy his company and end employ his services... or not. CGDIRect
is not easily offended. His work is cut out for him and is successfully employed in institutions around the world, only occasionaly temping at his local McDonalds. He loves a McFlurry, but not before sinking his teeth into a Quarter Pounder with cheese, and doused with a good splash of tabasco - an art learned from Leo Davidson.
Underneath that simple appearance lurks a heart that beats with floating point precision. Depending on the stethoscope used, the heart beat will resemble the precision of an integer, but one peek at the only public variables will reveal that it is an abstraction of something more capable of finer precision as well as wider compatibility.
Enjoy!
Usage
CGDIRect
can be used after the "CGDIRect.h" file is included for the project (e.g. in StdAfx.h) or for each appropriate TLU. It also requires that you have the GDI+ library in your library path.
Construction
CGDIRect
can be constructed in many different ways, of which just a few are shown below:
CRect rcSource;
CGDIRect rcNew( rcSource );
Rect rcSource;
CGDIRect rcNew( rcSource );
RectF rcSource;
CGDIRect rcNew( rcSource );
CGDIRect rcNew( CRect( 0,0,10,20 ) );
CGDIRect rcNew( RectF( 0,0,10,20 ) );
CGDIRect rcNew( Rect( 0,0,10,20 ) );
Functions and Usage
Following are the overloaded functions and other methods for general use:
Assignment
Examples:
CGDIRect rcNew = rcClient;
CGDIRect rcNew = CRect( 0, 0, 21, 56 );
CGDIRect rcNew = Rect( point, size );
CGDIRect rcNew = RectF( point, size );
CGDIRect rcNew = 0.0f;
CGDIRect rcNew = 0;
Comparison
Examples:
CGDIRect rcA = CRect( 0, 0, 21, 56 );
ASSERT ( rcA == rcB );
ASSERT ( rcA == CRect( CPoint(0,0), CSize(10,10) ) );
ASSERT ( rcA != rcB );
ASSERT ( rcA != Rect(91, 23, 45, 6) );
ASSERT ( rcA != RectF(9.1f, 2.3f, 4.5f, 6.0f) );
ASSERT ( rcA != 12 );
Union
Examples:
CGDIRect rcA = CRect( 7, 9, 21, 57 );
CGDIRect rcB = CRect( 5, 2, 29, 26 );
rcA |= rcB;
Make Equal to Intersecting Rectangle
Examples:
CGDIRect rcA = CRect( 7, 9, 21, 57 );
CGDIRect rcB = CRect( 5, 2, 29, 26 );
rcA &= rcB;
Addition and Subtraction
Examples:
CGDIRect rcA = CRect( 7, 9, 21, 57 );
rcA += CRect(9,2,5,7);
rcA += CGDIRect(20) - RectF(100,20,50,7);
rcA -= 5;
Size and Position
Examples:
CGDIRect rcA = CRect( 7, 9, 21, 57 );
CPoint ptLoc = (CPoint)ptLoc;
Point ptLoc = (Point)ptLoc;
PointF ptLoc = (PointF)ptLoc;
There are all sorts of functions to help get instant access to information that would take just a few more lines to piece together, for example:
There are also few extensions to the normally obvious functions, which make some everyday tasks just that little bit simpler. For example, when handling rects, I often have to change the width of an existing rectangle by tweaking it's 'left' rather than the 'right'. The SetWidth()
function allows you to specify this alteration to the norm. It saves only one or two lines of code which may seem trivial to some, but when done regularly begins to necessitate that the class be able to handle these requests.
List of Member Functions:
So, having given examples of construction and overloads, etc, here is a summary of the member functions in the CGDIRect
class:
|
|
Construction |
CGDIRect( int nValue = 0 ) CGDIRect( REAL fValue ) CGDIRect( Rect rcInit ) CGDIRect( RectF rcInit ) CGDIRect( CRect rcInit ) CGDIRect( CPoint point, CSize size ) CGDIRect( Point point, Size size ) CGDIRect( PointF point, SizeF size ) CGDIRect( int nLeft, int nTop, int nRight, int nBottom ) CGDIRect( REAL Left, REAL Top, REAL Right, REAL Bottom ) |
|
|
Assignment Operators |
operator=( CGDIRect& rhs ) operator|=( CGDIRect& rhs ) operator&=( CGDIRect& rhs ) operator=( int nValue ) operator=( REAL nValue ) |
|
|
Addition Operators |
operator+( CRect& rhs ) operator+( Rect& rhs ) operator+( RectF& rhs ) operator+( CGDIRect& rhs ) operator+=( CRect& rhs ) operator+=( Rect& rhs ) operator+=( RectF& rhs ) operator+=( CGDIRect& rhs ) operator+=( int nValue ) operator+=( REAL fValue ) |
|
|
Subtraction Operators |
operator-( CRect& rhs ) operator-( Rect& rhs ) operator-( RectF& rhs ) operator-( CGDIRect& rhs ) operator-=( CRect& rhs ) operator-=( Rect& rhs ) operator-=( RectF& rhs ) operator-=( CGDIRect& rhs ) operator-=( int nValue ) operator-=( REAL fValue ) |
|
|
Comparison Operators |
operator==( REAL Value ) operator==( int nValue ) operator==( CGDIRect& rhs ) operator==( CRect& rhs ) operator==( Rect& rhs ) operator==( RectF& rhs )
operator!=( REAL Value ) operator!=( int nValue ) operator!=( CGDIRect& rhs ) operator!=( CRect& rhs ) operator!=( Rect& rhs ) operator!=( RectF& rhs ) |
|
|
Replication |
void ReplicateBelow( CGDIRect rcSource, REAL nOffset = 0) void ReplicateAbove( CGDIRect rcSource, REAL Offset = 0) void ReplicateLeft( CGDIRect rcSource, REAL Offset = 0) void ReplicateRight( CGDIRect rcSource, REAL Offset = 0) void ReplicateBelow( CGDIRect rcSource, int nOffset = 0) void ReplicateAbove( CGDIRect rcSource, int nOffset = 0) void ReplicateLeft( CGDIRect rcSource, int nOffset = 0) void ReplicateRight( CGDIRect rcSource, int nOffset = 0) |
|
|
Size (Set) |
void SetSize( CGDIRect rcSource ) void SetSize( CSize size ) void SetSize( Size size ) void SetSize( SizeF size )
void SetWidth( REAL nValue, bool bMaintainRight=false ) void SetWidth( int nValue, bool bMaintainRight=false ) void SetHeight( REAL nValue, bool bMaintainBottom=false ) void SetHeight( int nValue, bool bMaintainBottom=false )
void InflateWidth( REAL x ) void InflateWidthInt( int nX )
void InflateHeight( REAL y ) void InflateHeightInt( int nY )
void Inflate( CSize Size ) void Inflate( Size Size ) void Inflate( SizeF Size ) void Inflate( REAL X, REAL Y) void Inflate( REAL Val) void InflateInt( int nX, int nY) void InflateInt( int nVal)
void Deflate( CSize Size ) void Deflate( Size Size ) void Deflate( SizeF Size ) void Deflate( REAL X, REAL Y ) void Deflate( REAL Val) void DeflateInt( int nX, int nY ) void DeflateInt( int nVal)
void DeflateWidth( REAL X ) void DeflateWidthInt( int nX )
void DeflateHeight( REAL Y ) void DeflateHeightInt( int nY )
void Extend( REAL nX, REAL nY ) void ExtendInt( int nX, int nY )
void Collapse( REAL nX, REAL nY ) void CollapseInt( int nX, int nY ) |
|
|
Size (Get) |
REAL Width() REAL Height()
int WidthInt() int HeightInt()
operator CRect() operator RectF() operator Rect()
operator CSize() operator Size() operator SizeF()
|
|
|
Position (Set) |
void Offset( REAL nX, REAL nY ) void OffsetInt( int nX, int nY ) |
|
|
Position (Get) |
operator CPoint() operator Point() operator PointF()
CPoint TopLeftCPoint() Point TopLeftPoint() PointF TopLeftPointF()
CPoint TopRightCPoint() Point TopRightPoint() PointF TopRightPointF()
CPoint BottomRightCPoint() Point BottomRightPoint() PointF BottomRightPointF()
CPoint BottomLeftCPoint() Point BottomLeftPoint() PointF BottomLeftPointF() |
|
|
Others |
bool HitTest( CPoint point ) bool HitTest( Point point ) bool HitTest( PointF point ) |
|
|
|
|
Private Methods:
There are a few private methods that are used internally and can generally be ignored unless you want to expand on their functionality.
History
11 Dec 2001 - updated source code.