Contents
Introduction
Are you tired of shiny, spotless windows? Tired of all that futuristic glass? Would you rather your windows
have that classic, aged, slightly-burned-around-the-edges look of old historic documents? You know, the kind that
just might have a map to buried treasure written on the back? Well, the answer is here! Through the wonders of
modern technology, you can go from this:
or even (gasp), this:
to... (drum roll please) this:
Nicolas Cage will be plotting to steal your windows in no time.
Now you've seen what can be done by burning the edges of a plain old rectangular window. Even more amazing results
can be had by starting with an oddly-shaped window region. Take, for example, this totally boring window:
Yawn. But after just a few applications of the patented* window-burning coding-technologies, you'll arrive at
this wondrous image:
WMP 9 would be envious if it weren't end-of-lifed.
*not actually patented
Tell Me More. C'mon, Man. Spill It. How's It Done?
Every few years, a long-dormant technique is rediscovered and put to use by Microsoft Scientists. In Windows
95, it was owner-drawn menus. In Windows 98, it was FlashWindow()
. In Windows XP, it was window regions.
These advances even outpace our need to learn new SI prefixes as our hard drives get bigger (hot tip that'll impress
the ladies: after tera- comes peta-).
Now, in the year two thousand o' eight, I have discovered...
Rotating a Region
The ExtCreateRegion()
API can summon a region using nary a RGNDATA
blob. Where the
magic comes in is the XFORM
parameter. Dust your code with the appropriately-cultivated XFORM
spell component, and ExtCreateRegion()
will also rotate the region.
For example, starting with an original region rgn
, we can create a copy that is rotated 30 degrees
with this incantation:
int degrees = 30;
float radians = degrees * 2.0f * 3.14159f / 360.0f;
XFORM xform = { cosf(radians), sinf(radians),
-sinf(radians), cos(radians) };
RGNDATA* pData;
UINT cby;
CRgnHandle rgn = ;
CRgn newRgn;
cby = rgn.GetRegionData ( NULL, 0 );
pData = (RGNDATA*) new BYTE[cby];
rgn.GetRegionData ( pData, cby );
newRgn.CreateFromData ( &xform, cby, pData );
delete[] (BYTE*) pData;
The members of XFORM
are outlined in the Tome
of the Network of the Microsoft Developer. When using XFORM
to perform a rotation, as we are,
the first four members are set as follows:
eM11
: cosine of the rotation angle
eM12
: sine of the rotation angle
eM21
: negative of the sine of the rotation angle
eM22
: cosine of the rotation angle
To achieve burnination, simply apply a rotation to your window region repeatedly, as often as desired. Let the
round-off errors do the rest!
Conclusion
Happy 92nd day of the year! (or 91st in non-leap years!)