## RectVisible - Windows API

Please discuss general Delphi programming topics here.

### RectVisible - Windows API

The RectVisible function determines whether any part of the specified rectangle lies within the clipping region of a device context.

Code: Select all
function RectVisible(DC: HDC; const Rect: TRect): BOOL; stdcall;

The PtVisible function determines whether the specified point is within the clipping region of a device context.

Code: Select all
function PtVisible(DC: HDC; X, Y: Integer): BOOL; stdcall;

Drawing on a canvas is very time-consuming, especially when there are many things to draw. Using two mentioned APIs, we can determine which parts of a canvas is updated, and redraw only those parts to save lot of cpu time. Sounds great! Yeah?

However, there is a fact that says: "There's always something to suck". Let I tell you when these two APIs suck. To have a wrong return value, the following conditions should be satisfied:

1. The DC parameter shoud be a metafile device context (e.g. TMetafileCanvas.Handle).
2. The dimension of metafile device context (DC) should be bigger than dimension of its referenced device context (RefDC parameter of TMetafileCanvas constructor).
3. The Rect parameter should be outside of the referenced device context's bounding rectangle (RefDC). Obviously, it should be inside bounding rectangle of the metafile device context (DC).
To see it by yourself, compile and run the attached program. The program displays a green or red rectangle on botton right corner of the form. Here are interpretation of the colors:

• GREEN RECTANGLE
The RectVisible API tells the rectangle is visible, which is true.
• RED RECTANGLE
The RectVisible API tells the rectangle is not visible, which is wrong because you are seeing it with your own eyes.
There is something more. During drawing a metafile, Windows calls the RectVisible function internally. Because of the bug in the RectVisible function, if we draw a metafile on a metafile canvas at a position that satifies the above conditions, the metafile will not be drawn. As a workaround, you can draw the metafile on a bitmap, and then draw the bitmap on the metafile canvas.

Maybe there's no bug in these APIs, and I just did something wrong.
Attachments
RectVisibleBug.zip
RectVisible Bug - Demonstration
Kambiz

Kambiz

Posts: 2430
Joined: March 7th, 2003, 7:10 pm

Have you tried to post this question in the Delphi newsgroups of Borland? The audience there is bigger and the B-Team members are always around for the realy hard questions.
Fotis

kokkoras
Moderator

Posts: 317
Joined: March 12th, 2005, 11:19 pm
Location: Thessaloniki, Greece

I tested the case with pure API calls to be sure it's a Windows bug. I think it's better to ask for a fix on microsoft newsgroups.
Kambiz

Kambiz

Posts: 2430
Joined: March 7th, 2003, 7:10 pm

I found a post on google groups that describes this problem with metafiles. However, since two years ago nobody answered it.

Kambiz

Kambiz

Posts: 2430
Joined: March 7th, 2003, 7:10 pm

Hihi,

Currently, I have once again the same problem here. during the last ten years I tried several time to get a solution even directly from Microsoft. They told me that this should be fix in the next API revision........

Perhaps with vista....???

For a 'cutting plotter (A0 size)' preview, I have been searching at least 10 years for a code helping me to overlay two meta EMF files transparently. I did not yet manage it and asked for a hint in this forum half an hour before. So You are not allone. (programmer since 1969!)

Whenever I asked with or without an explanation of the problem, I never got any answer. So I think this might be a sin as a gift for generations, and it follows us to everywhere.
norbert
Active Member

Posts: 17
Joined: May 13th, 2006, 8:49 am
Location: Germany

### Who is online

Users browsing this forum: No registered users and 4 guests