Click here to Skip to main content
Click here to Skip to main content

Guide to WIN32 Regions

By , 10 Mar 2002
 

Sample Image - preview.gif

Introduction

Regions are a resource in windows that are very useful. They are device independent, which means that a device context (DC) is not need to create or use one. However, there are many functions in the WIN32 GDI that require a region.

Some of the useful places for a region are:

  • Update Region, Paint
  • Clipping, Paint
  • Hit Testing
  • Define window shape, Irregular Shaped Windows

Many of the functions that relate to regions are very simple, and need very little explanation, in fact the definition from MSDN is adequate enough to explain these functions. However, some of the functions are a little more difficult to understand and master, therefore extra details have been added to explain these functions. A few diagrams may accompany the explanation as well.

Region Creation

There are a number of ways to create a region. There are a number of functions that can be used create a region, from a simple shape such as a rectangle or an ellipse, to a complicated shape such as the outline of a string of text. Listed below is a table that describes each of the creation functions.

Function Description
CreateEllipticRgn Creates an elliptical region. As with drawing ellipses, elliptic regions are very large, and may slow your program down if you use a large number of them.
CreateEllipticRgnIndirect Creates an elliptical region from a RECT structure. As with drawing ellipses, elliptic regions are very large, and may slow your program down if you use a large number of them.
CreatePolygonRgn Creates a polygonal region.
CreatePolyPolygonRgn Creates a region consisting of a series of polygons.
CreateRectRgn Creates a rectangular region.
CreateRectRgnIndirect Creates a rectangular region from a RECT structure.
CreateRoundRectRgn Creates a rectangular region with rounded corners.
ExtCreateRegion Creates a region from the specified region and transformation data.
PathToRegion Creates a region from a WIN32 Path created in a DC.

Operations

There are a few operations that can be performed on a region in order to query, modify test its data.

CombineRgn

After a few basic regions are created, it is possible to perform boolean operations on the regions in order to create more complex regions with CombineRgn. This function has five operations that can be performed in order to combine two different regions. Shown below is an example of each of the boolean operations that can be performed in CombineRgn:

Value Description Result
RGN_AND Creates the intersection of the two combined regions.
CombineRgn(hrgnDest, hrgnSrc1, hrgnSrc2, RGN_AND);
RGN_AND
RGN_COPY Creates a copy of the region identified by hrgnSrc1.
CombineRgn(hrgnDest, hrgnSrc1, NULL, RGN_COPY);
No Image
RGN_DIFF Combines the parts of hrgnSrc1 that are not part of hrgnSrc2.
CombineRgn(hrgnDest, hrgnSrc1, hrgnSrc2, RGN_DIFF);
RGN_DIFF
RGN_OR Creates the union of two combined regions.
CombineRgn(hrgnDest, hrgnSrc1, hrgnSrc2, RGN_OR);
RGN_OR
RGN_XOR Creates the union of two combined regions except for any overlapping areas.
CombineRgn(hrgnDest, hrgnSrc1, hrgnSrc2, RGN_XOR);
RGN_XOR

One more thing to point out is that the destination region in CombineRgn can be one of the source regions. Therefore, if you continually modify a region by adding or subtracting a different region from it, you can perform one combine operation rather than worrying about copying the adjusted region. Here is an example:

HRGN hCacheRgn;
HRGN hUpdateRgn;

...

//C: Convoluted way.
//C: Initialize a temporary region.
HRGN hTemp = ::CreateRectRgn(0,0,0,0);
//C: Subtract teh update region from the Cache region. 
::CombineRgn(hTemp, hCacheRgn, hUpdateRgn, RGN_DIFF);
//C: Copy the Temp region back into the Cache region.
::CombineRgn(hCacheRgn, hTemp, NULL, RGN_COPY);
//C: Destroy the Temp region.
::DeleteObject(hTemp);


//C: Simple way
::CombineRgn(hCacheRgn, hCacheRgn, hUpdateRgn, RGN_DIFF);

EqualRgn

The EqualRgn function checks the two specified regions to determine whether they are identical. The function considers two regions identical if they are equal in size and shape.

BOOL EqualRgn(
  HRGN hSrcRgn1,  // handle to first region
  HRGN hSrcRgn2   // handle to second region
);

PtInRegion

The PtInRegion function determines whether the specified point is inside the specified region. This function is very useful for creating a hit-test region on your control. Such as a bitmap that has a hot-region that can be clicked by the user.

BOOL PtInRegion(
  HRGN hrgn,  // handle to region
  int X,      // x-coordinate of point
  int Y       // y-coordinate of point
);

RectInRegion

The RectInRegion function is very similar to PtInRegion, except that it will determines whether any part of the specified rectangle is within the boundaries of a region.

BOOL RectInRegion(
  HRGN hrgn,         // handle to region
  CONST RECT *lprc   // pointer to rectangle
);

GetRgnBox

The GetRgnBox function retrieves the bounding rectangle of the specified region.

int GetRgnBox(
  HRGN hrgn,   // handle to a region
  LPRECT lprc  // bounding rectangle
);

OffsetRgn

The OffsetRgn function moves a region by the specified offsets.

int OffsetRgn(
  HRGN hrgn,     // handle to region
  int nXOffset,  // offset along x-axis
  int nYOffset   // offset along y-axis
);

SetRectRgn

The SetRectRgn function converts a region into a rectangular region with the specified coordinates.

BOOL SetRectRgn(
  HRGN hrgn,       // handle to region
  int nLeftRect,   // x-coordinate of upper-left corner of rectangle
  int nTopRect,    // y-coordinate of upper-left corner of rectangle
  int nRightRect,  // x-coordinate of lower-right corner of rectangle
  int nBottomRect  // y-coordinate of lower-right corner of rectangle
);

Paint Functions

WIN32 provides a number of functions that will allow a region handle to be used for painting affects. These effects include filling with a brush, outlining, and inverting the current contents

FillRgn

The FillRgn function fills a region by using the specified brush.

BOOL FillRgn(
  HDC hdc,    // handle to device context
  HRGN hrgn,  // handle to region to be filled
  HBRUSH hbr  // handle to brush used to fill the region
);

FrameRgn

The FrameRgn function draws a border around the specified region by using the specified brush.

BOOL FrameRgn(
  HDC hdc,     // handle to device context
  HRGN hrgn,   // handle to region to be framed
  HBRUSH hbr,  // handle to brush used to draw border
  int nWidth,  // width of region frame
  int nHeight  // height of region frame
);

InvertRgn

The InvertRgn function inverts the colors in the specified region.

BOOL InvertRgn(
  HDC hdc,    // handle to device context
  HRGN hrgn   // handle to region to be inverted
);

PaintRgn

The PaintRgn function is similar to the FillRgn function, except that this function paints the specified region by using the brush currently selected into the device context.

BOOL PaintRgn(
  HDC hdc,    // handle to device context
  HRGN hrgn   // handle to region to be painted
);

GetRegionData

The GetRegionData function fills the specified buffer with data desc

DWORD GetRegionData(
  HRGN hRgn,            // handle to region
  DWORD dwCount,        // size of region data bufferribing a region. 
This data includes the dimensions of the rectangles that make up the region.
  LPRGNDATA lpRgnData   // region data buffer
);

Region Data

A WIN32 region is really a set of rectangles managed in one object. The RGN_DATA structure manages this set of rectangles as well as some of the other data that is required to maintain the region. The RGN_DATA structure is accessible through the GetRegionData function. A region object can be created with a RGN_DATA structure with the ExtCreateRgn function. Here is a diagram to show the internal representation of a HRGN object. Each rectangle in the region is painted with an alternating colored brush.


Internal Representation of a region.

ExtCreateRgn

The ExtCreateRegion function creates a region from the specified region and transformation data.

HRGN ExtCreateRegion(
  CONST XFORM *lpXform,     // transformation data
  DWORD nCount,             // size of region data
  CONST RGNDATA *lpRgnData  // region data buffer
);

Something to be aware of, is that Windows 2000 will accept a region that has overlapping rectangles. If you try to create a region with data that contains overlapping rectangles on Windows NT4, this function will fail. Therefore if you create one of these regions on a Windows 2000 machine, and store the RGN_DATA of a region in a file or send the data across the network to a Windows NT4 machine, when you try to call ExtCreateRgn on the structure, it will fail.

The Windows 9x kernel dpes not support world transforms that involve either shearing or rotations. ExtCreateRegion fails if the transformation (XFORM) matrix has a scaling or translation of the region.

Demonstration

The program that has been created to demonstrate some of the possibilities for regions is an interactive window that allows the user to create two regions. The user can add new portions to either one of the source regions with a rectangle, ellipse or round rectangle tool. The polygon has been left out simply because of extra work related to the UI that would be required to incorporate this tool, however, a polygon is completely possible.

Here are the directions for creating a source region:

  1. Select the desired draw mode shape from the menu or the tool bar. There are three choices, Rectangle , Ellipse , or Round Rectangle .
  2. Select and area on the main window, and start dragging the region. A rubber-banding effect will show where the region will appear.
  3. Use the Left mouse button to draw a shape for the Source 1 region.
    Use the Right mouse button to draw a shape for the Source 2 region.
  4. At any time, you can hit the Escape key to cancel the drawing operation.
  5. Let go of the mouse button to update the region with the new shape that you have created.
  6. The Source 1 region will be drawn in RED, the Source 2 region will be drawn in Blue.

On the right-hand side of the window where the regions are drawn, there are four sub-views, where the different combine modes: RGN_AND, RGN_DIFF, RGN_OR, RGN_XOR are all demonstrated. As each source region is modified, these sub-views are updated. It is possible to replace one of the current source regions with one of the sub-view results simply by dragging the region to the window where the source regions are displayed. The Source 1 and Source 2 regions are displayed in Red and Blue respectively, just as in the main view, and the new combine region will be displayed in purple.

Here are the directions for moving the combine region to the source region.

  1. Simply decide which of the four sub-views that you would like to use.
  2. Click in the sub-view and drag the mouse to the main window. An icon will appear indicating that the item is being dragged.
  3. Use the Left mouse button to replace the combine region for the Source 1 region.
    Use the Right mouse button to replace the combine region for the Source 2 region.
  4. At any time, you can hit the Escape key to cancel the replace operation.
  5. Let go of the mouse button to replace the region with the combine region that you dragged..

You can delete the Source1, Source2 or both of the regions by selecting the appropriate menu item.

You can choose to view either the Source1 region, the Source2 region, or all of the regions by selecting the appropriate view from the menu. View All is the default selection.

One last operation in the RgnGuide program is to view the rectangles that compose the region in breakdown mode. You can do this by simply checking either the BreakDown Src 1 or BreakDown Src 2 menu item. The view will then show the selected region broken down into each of the rectangles that creates that region. Each rectangle will be painted with an alternating color. A plain reactangle will be pretty boring with one solid colored rectangle. An ellipse on the otherhand will contain a new rectangle on just about every other scanline.

Conclusion

Regions are a very powerful OS resource that you can use in your program. The demo program simply illustrates how to manage your resources, there are many other uses than the ones that have been described. WIN32 provides a rich set of functions that allows you to manage and manipulate your regions.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

About the Author

Paul Watt
Architect
United States United States
Member
I have been developing Windows applications since Windows 3.1. I have also spent a large amount of time developing on embedded and mobile devices running OSes such as WinCE, Windows Mobile, Linux, and VxWorks. Still my preference is Win32 programming with the WTL framework.
 
My favorite types of programming take advantage of the graphics subsystems and create very intuitive and enjoyable user interfaces.
 
I have known about template meta-programming for quite some time, and have investigated its uses. Lately I have come to the conclusion that it can be used elegantly in a production solution to create a robust and maintainable solution. This seems to be what I spend the majority of my abstract thinking time on.

Sign Up to vote   Poor Excellent
Add a reason or comment to your vote: x
Votes of 3 or less require a comment

Comments and Discussions

 
You must Sign In to use this message board.
Search this forum  
    Spacing  Noise  Layout  Per page   
QuestionRegion from FrameRgnmembermcrawley3 Apr '12 - 7:05 
I am trying to take the region of a parent window, copy it, frame the copy, then clip out the frame region so the frame region can become a child window's clipping region. The child window will sit on top of the parent window and above other child windows and provide resize/move functionality for the parent window. It has to be on top of the other windows and therefore needs to be transparent but accessible to mouse input.
 
I've tried several approaches, but I can't seem to figure it out. I've tried scaling the region. I've tried filling the copied region with a color, SetBkMode to transparent before painting the frame a different color, then XOR the difference would work, but nothing. I'm thinking I'm going to have to line-by-line set the bits I need transparent using GetRegionData before trying to crop again, but that would be slow to execute and tedious to code.
 
If you or someone could point me in the right direction, I would appreciate it.
AnswerRe: Region from FrameRgnmemberPaul Watt6 Apr '12 - 19:46 
First, do you know the region that you are trying to manipulate from the Parent? This seems like the most difficult part to me, once you have the region, it is a matter of mapping between the different coordinate systems.
 
If you have not already discovered these functions, I suggest you check them out:
 
int MapWindowPoints(
  HWND hWndFrom,     // handle to source window
  HWND hWndTo,       // handle to destination window
  LPPOINT lpPoints,  // array of points to map
  UINT cPoints       // number of points in array
);
 
BOOL ClientToScreen(
  HWND hWnd,       // handle to window
  LPPOINT lpPoint  // screen coordinates
);
 
BOOL ScreenToClient(
  HWND hWnd,        // handle to window
  LPPOINT lpPoint   // screen coordinates
);
 
 
When I have attempted to perform similar operations to what you are describing, the coordinate system has been the most common reason for any issues I run into. The origin of the device context you are dealing with comes into play.
 
If your parent window is a top-level window, then it is basically a child of the desktop. So its coordinates will be relative to the upper-left corner of your screen. A child-window of that same parent window will have its coordinates relative to the client area of the parent. If the child window is the size of the entire client area, it will start at (0,0).
 
This 3rd window you mention, will either need to be a child window higher in the z-order than the child window I mentioned above, or possibly a popup window with the parent window as the owner. If it is a popup window, its origin will also start at the corner of your screen.
 
If you want to find the absolute screen coordinates of a child window, use the clientToScreen function. The value you receive will be very close to the parent windows offset, except it will include an offset for the height of the titlebar and the width of one border edge.
 
Finally, what sort of issue do I see when I realize I have a coordinate system issue? If I move my parent window to the upper left corner of my screen, and it appears to work, but then as I move the window further away all of my drawing code for the children seem to move in the same direction as the parent only twice as fast, your child window is painting with screen coordinates.
 
There are other possible issues and solutions, that is the most common one I run into. If this doesnt help, maybe you can provide some more detail of what you are seeing and I will try to give a few more suggestions.
 
Good Luck
All of my software is powered by a single Watt.

QuestionRegionsmembercrazymike193820 Dec '11 - 13:18 
Iwant to create a clipping regionthat restricts drawomg or painting in an irregular figure. Say leave a hole in the middle of a rectangle etc.
 
Mike
AnswerRe: RegionsmemberPaul Watt21 Dec '11 - 14:39 
you will want to use RGN_DIFF then with your region that you want to paint in as the first region, and the "hole" as the second region. Combining them this way will subtract the hole from the larger region.
 
If you look at the example chart, those red and blue shapes are two different regions. The two red squares represents one region, even though they are separate shapes, and the blue oval is the other. In that example, the oval is being subtracted from the two red squares, and the results are the purple shapes.
 
You can then use that region with your clipping operations.
All of my software is powered by a single Watt.

GeneralMy vote of 5membercrazymike193823 Oct '11 - 10:13 
This guy is a genius. This solution is exactly what I have been looking for.
 
Grateful in Portland
 
Mike
GeneralRe: My vote of 5memberPaul Watt23 Oct '11 - 13:54 
Thank you.
 
Comments like this are why I keep writing articles. I am glad you found it useful.
GeneralMy vote of 5memberrkjpsn7 Dec '10 - 11:52 
you may have saved my life with this article. i owe you a beer if we ever meet in a bar somehow.
GeneralGood job!memberJoeJiao12 Jul '10 - 6:36 
Thanks,man!
How to for rabbit.

Questionhow to fill a region of independent block.memberfaju21 Apr '09 - 3:55 
I mean i have created a region something like this ≡ . Independent line/block but single region...
 
How to fill this single region with single / multiple color?
 
Is it possible to fill using single color?
 
Is it possible to fill using multiple color in a single region of independent line/blocks?
 
Thanks in advance
AnswerRe: how to fill a region of independent block.memberPaul Watt21 Apr '09 - 5:28 
I am not sure I understand your question.
 
If you want to fill the region with a single color, you can create a brush with a single color, then use that brush to fill the region:
 
HBRUSH hbr = ::CreateSolidBrush(RGB(0xFF, 0, 0)); // Red
::FillRgn(hDC, hRgn, hbr);
 
If you want to fill lines of the region, you could iterate and use FillRect in a similar way.
QuestionCombining Text In RegionsmemberSparkyNZ8 Jan '07 - 10:17 
Hi there. Your article mentione you could combine text to regions somehow. I would like to remove text from a region - I can easily remove rectangular regions, ellipses etc, but how do you remove text? (ie. create a text "hole") ?
 
Thanks
Paul
GeneralProblem with RectInRegionmemberertl1 Oct '06 - 4:35 
Hi.
I have following problem:
My (MFC) program select/deselect some object with following code
 
BOOL MyObject::Intersects(const CRect& rect)
{
CRgn rgn, rgn1, rgn2;
...
rgn1.CreatePolygonRgn( /*depending on MyObject*/, ALTERNATE);
rgn2.CreatePolygonRgn( /*depending on MyObject, other than rgn1*/, ALTERNATE);
int i = rgn.CombineRgn( &rgn1, &rgn2, RGN_OR );
//in my situation I always get i=COMPLEXREGION
 
return rgn.RectInRegion(rect);
}
 
where rect is rectangle given from mouse.
 
In some special cases (with objects similiar "U" rotated 45dg clockwise) this function does not work correctly.
I select rectangle by mouse outside object (but near to free ends of "U"). If this rectangle does not cross y-axis, then result is correct - RectInRegion and also MyObject::Intersects returns FALSE. If this rectangle has rect.left negative and rect.right positive then result is incorrect - RectInRegion (and also MyObject::Intersects) returns TRUE OMG | :OMG: . This result does not depend on position of MyObject.
 
IMO, there is some mistake in RectInRegion algorithm. Or there are some specialties in CombineRgn or RectInRegion? Or is my program wrong? Mad | :mad:
 


GeneralRe: Problem with RectInRegionmemberertl2 Oct '06 - 6:18 
Problem is only in MS WinXP. In Win98 the same program runs correctly.

GeneralFillRgn or PaintRgn not working with DrawItemmemberNareen Neelamegam11 Sep '05 - 21:59 
Good Article & got my 5,
 
I subclassed button (CButton) class. And used DrawItem to redraw the button shape. But I cannot use FillRgn or PaintRgn over there. I can use FillRect or other drawing functions there. My region data is valid, but not drawn/filled.
Can u tell me why?
 
with regards,
Nareen Neelamegam
GeneralRe: FillRgn or PaintRgn not working with DrawItemmemberrelient12 Sep '05 - 5:38 
Please post some source code. I might be able to help you out.
 
relient
GeneralRe: FillRgn or PaintRgn not working with DrawItemmemberPaul Watt12 Sep '05 - 6:36 
Some problems that I have had in the past when trying to paint with regions is related to the coordinate space that the region is trying to paint in.
 
What are you using to create the region for the button? Are you starting with the rectangle that came in the DRAWITEMSTRUCT, the rcItem rect? When regions dont paint properly for me, I usualy add a couple of lines of code right before where I am trying to paint the region. In the code I get a handle to teh Desktop DC, then use the exact same paint command with the desktop DC. I expect the region to be painted in the upper left hand corner with whatever offset I put into the control that I am trying to paint.
 
I cant think of anything in MFC or Win32 that would prevent you from using a region in that way. Try what I suggested and see if it helps you figure out your problem. Otherwise if you post the code for your OnDrawItem handler I will see if I can help out.
 
Good luck
 

Build a man a fire, and he will be warm for a day
Light a man on fire, and he will be warm for the rest of his life!

GeneralRe: FillRgn or PaintRgn not working with DrawItemmemberNareen Neelamegam12 Sep '05 - 20:13 
Thanks alot Friend,
 
Anyhow, I got the solution at the time itself. The problem is I have created the region in my main dialog and gave it to the button's DrawItem handler. Hence the region created with the dialog's coordinate not matched with the button (since its size is smaller than its parent). In short, problem is with coordinates. FillRgn works actually, but not visible in the button area.
 
Now I have created the button with the window (dialog) size and set its region with the region I got from the dialog. Now it works well.
 
Thanks alot again.
 

 
with regards
Nareen Neelamegam
GeneralCombineRgn problemmemberrelient11 Sep '05 - 19:37 
Sorry to bother you again.
I have a baffling problem at hand. It somewhat pertains to my last thread.
 
Anywho; it seems CombineRgn, used in conjuntion with the "system region", doesn't work with all the available Modes. Here is a list of the working and non-working Modes:
 
RGN_AND - Works; no problems encountered.
RGN_COPY - Haven't tried it but I will assume it works since it only copys.
RGN_DIFF - Works; no problems encountered.
RGN_OR - Does not work; the result is a bit strange, however, the result is way off.
RGN_XOR - Does not work; the result is "exactly" the same as RGN_DIFF.
 
It's weird how some modes do work while others don't. Have you ran into this problem before? Is the problem due to maybe, CombineRgn was not meant to work with "system regions", but, only "application defined regions"? I'm at a total lost here.
 
Any help would be very appreciated.
relient

GeneralRe: CombineRgn problemmemberPaul Watt12 Sep '05 - 6:14 
I have not run into any problems like you have described. My first inclination is to ask are you trying to modify the system region, or is it simply one of the source regions and you have a completely new region that accepts the results?
 
Maybe you can try copying the system region then or'ing the copied region to get your results.
 
I will spend a little more time on this this evening if you havent found a solution and I will let you know what I discover.
 

Build a man a fire, and he will be warm for a day
Light a man on fire, and he will be warm for the rest of his life!

GeneralRe: CombineRgn problemmemberrelient12 Sep '05 - 7:43 
I've build a simple little demonstration program, yet sufficient enough, to allow us to see how I arrived to my conclusions on my last thread.
 
//Variables
HRGN sysRgn, desRgn, srcRgn;
HDC hdc;
PAINTSTRUCT ps;
static int cnt = 1;
 
case WM_PAINT :
// get the system region
sysRgn = CreateRectRgn(0, 0, 0, 0);
GetUpdateRgn(hwnd, sysRgn, FALSE);
 
hdc = BeginPaint(hwnd, &ps);
 

// create a rect to display initially and paint borders W/light gray brush
srcRgn = CreateRectRgn(70, 70, 170, 170);
FrameRgn(hdc, srcRgn, GetStockObject(LTGRAY_BRUSH), 1, 1);
 

// combine the system region obtained W/GetUpdateRgn and RGN_XOR it
// with the above light-gray-framed rectangle (srcRgn)
desRgn = CreateRectRgn(0, 0, 0, 0);
CombineRgn(desRgn, sysRgn , srcRgn, RGN_XOR);
 

// select the resulting region into the device context
SelectClipRgn(hdc, desRgn);
 

 
// drawing functions below will only commence on 3rd WM_PAINT or above - this is to
// allow the oppertunity to position a window (any window; for testing) halfway on
// top of the initially displayed - light gray - rectangle (srcRgn).
if ( cnt++ > 3 )
{
FillRgn(hdc, desRgn, GetStockObject(GRAY_BRUSH));
FrameRgn(hdc, desRgn, GetStockObject(BLACK_BRUSH), 1, 1);
}

DeleteObject(sysRgn);
DeleteObject(srcRgn);
EndPaint(hwnd, &ps);
return 0;

 
Here's what the demonstration program does:
 
1.When the window is first shown, you'll see a rectangle-frame of light gray color; with an all white background.
 
2.You're now supposed to position a window, of any size, halfway on top of the framed-rectangle and minimize-maximize this overlapped window 3 times to see the result. This 3 times; minimize-maximize is to assure we get 3 WM_PAINT's to allow, FillRgn and FrameRgn in the for() loop, to paint.
 
The region created with CombineRgn (destination region) will be painted in pure GRAY - not light gray, with a black frame around it.
 
Try this with all the RGN_XXX Modes and observe the results.
 
side note: I also tried obtaining the system region with GetRandomRgn, instead of GetUpdateRgn, and offset'ed the obtained region with OffsetRgn() and MapWindowPoints() to assure I get the right region coordinates for my system. The result was the same as using GetUpdateRgn. So I know that GetUpdateRgn is not the problem.
 
Thanks for reading,
relient
 
-- modified at 13:47 Monday 12th September, 2005
GeneralRe: CombineRgn problemmemberbikas20 Jul '10 - 1:16 
thanks...... Poke tongue | ;-P
GeneralRe: CombineRgn problemmemberrelient24 Sep '05 - 7:25 
Hey there. It's been a while since I last heard from you. I Hope everything's ok.
I'm still in the same situation, if you've figured out what's the problem, please let me know.
 
Thanks,
relient.
GeneralRe: CombineRgn problemmemberrelient26 Sep '05 - 6:27 
Hi, I'm happy to report that I figured out the problem.
 
I would also like to point out that, although the update-region
returned by BeginPaint is not the sytem region, it
is Identical to that of the system region (in BeginPaint-EndPaint
only) but technically; they're not the same thing. What is returned
from BeginPaint is the system region that "is the intersection of the
update region" plus other window factors . This was affirmed in Feng
Yuangs book too.
 
Anyway. Without further ado; Here's the solution to my problem if you
care to read:
 
http://www.it-faq.pl/mskb/118/472.HTM
GeneralExcluding region of arbitrary size - not rectangularmemberrelient9 Sep '05 - 10:18 
Possible? The only function I know of that can exclude part of a region is ExcludeClipRect. The problem with it is that if you want to exclude a region of an arbitrary size, you can't, because you're limited to rectangles only.
 
Is there any function similar to ExcludeClipRect but for excluding regions of arbitrary (not rectagular) size? If not, what other function/s could I use to accomplish this task, if any?
GeneralRe: Excluding region of arbitrary size - not rectangularmemberPaul Watt9 Sep '05 - 10:40 
You can use SelectClipRgn to Set an arbitrary region.
 
If you want to add a region to the current clip region in the same way excludeClipRect does, simply call GetClipRgn to get the current region, then use CombineRegion to combine the current region with your new region, then finally call SelectClipRgn to replace the current region with the combination of your new region.
 
Coincidentally I wrote another article that describes tons of detail relating to clipping regions in the Win GDI. I describe all of the clipping region functions available to use, and info about all of the clipping planes that exist for a DC.
 
http://www.codeproject.com/gdi/cliprgnguide.asp[^]
 
Good luck

 

Build a man a fire, and he will be warm for a day
Light a man on fire, and he will be warm for the rest of his life!

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Permalink | Advertise | Privacy | Mobile
Web01 | 2.6.130523.1 | Last Updated 11 Mar 2002
Article Copyright 2002 by Paul Watt
Everything else Copyright © CodeProject, 1999-2013
Terms of Use
Layout: fixed | fluid