tags:

views:

34

answers:

1

I want to write a function that needs to set the clipping region on a DC but restore any existing clipping region on the DC when it is done.

So I found GetClipRgn http://msdn.microsoft.com/en-us/library/dd144866(v=VS.85).aspx which sounds like exactly what I want but seems confusing. I couldn't find any examples of using it and Petzold had nothing to offer.

What I came up with was this:

void DrawStuff( HDC hDC )
{
    HRGN restoreRegion = CreateRectRgn( 0, 0, 0, 0 );
    if (GetClipRgn( hDC, restoreRegion ) != 1)
    {
        DeleteObject( restoreRegion );
        restoreRegion = NULL;
    }

    // 
    // Set new region, do drawing
    //

    SelectClipRgn( hDC, restoreRegion );
    if (restoreRegion != NULL)
    {
        DeleteObject( restoreRegion );
    }
}

It just seems weird that I need to create a region in order to get the current region.

Is this correct usage?

Is there are better way to achieve the same effect?

A: 

Will int SelectClipRgn( __in HDC hdc, __in HRGN hrgn); do the job?

The SelectClipRgn function selects a region as the current clipping region for the specified device context.

Only a copy of the selected region is used. The region itself can be selected for any number of other device contexts or it can be deleted.

The SelectClipRgn function assumes that the coordinates for a region are specified in device units.

To remove a device-context's clipping region, specify a NULL region handle.

JustBoo