如何在主裁剪区域和其他一些裁剪区域之间进行 AND 运算?
How to make AND operation between a main and some other clipping regions?
我使用 Win API 调用(多边形)在 Delphi 中绘制带有可选孔的填充区域。由裁剪区域裁剪的孔洞(不是用背景色填充)。它工作正常,直到我调用打印预览(并且打印预览看起来很好,直到预览页面不包含带孔的填充区域)。 filledarea同样的方法调用绘制的打印预览中的页面内容,只是在调用dc上设置的纸张大小缩放和裁剪区域之前。填充区域对象绘制方法不结合自身的裁切操作由页面裁剪一个。切页夹和其他夹子(切孔夹之间应该是OR关系)如何做AND运算。
FilledArea对象的绘制方法(只是裁剪特定的线条):
...
try
if ( fHoles^.getCount > 0 ) then
begin
// Get a copy of the page clipping rgn
getClipRgn( dc, rgnPrev );
for i := 0 to fHoles^.getCount-1 do
begin
...
// create a rgn to the Xth hole
rgn := createPolygonRgn( rgnPts^, rgnPtsCount, ALTERNATE );
if ( rgn <> 0 ) then
begin
// combine the Xth rgn with the active rgn (OR because there could be many holes in a single filled area)
extSelectClipRgn( dc, rgn, RGN_DIFF );
// releases the Xth rgn
deleteObject( rgn );
end;
...
end;
end;
// draw the polygon
finally
if ( fHoles^.getCount > 0 ) then
begin
// selects a copy of the page cutting rgn copy
selectClipRgn( dc, rgnPrev );
// releases the copy of the page cutting rgn
deleteObject( rgnPrev );
end;
end;
打印预览裁剪区域绘制代码:
// Creates a page clipping rgn
rcRegion := createRectRgn( rcDevLeft_, rcDevTop_, rcDevRight_ + 2, rcDevBottom_ + 2 );
try
// Selects a copy of the page clipping rgn
selectClipRgn( dc_, rcRegion );
...
// draw the page contents
...
finally
// Selects an empty clipping rgn
selectClipRgn( dc_, 0 );
// Releases the created page clipping rgn
deleteObject( rcRegion );
end;
带有两个孔的填充区域的设计时屏幕截图:
同一设计的打印预览截图(等高线偏移是忽略分页区域的标志,由于两页内容绘制了两次)
好的。我找到了。我应该使用 combineRgn Win API 调用来定义两个传入区域之间的布尔运算。
我使用 Win API 调用(多边形)在 Delphi 中绘制带有可选孔的填充区域。由裁剪区域裁剪的孔洞(不是用背景色填充)。它工作正常,直到我调用打印预览(并且打印预览看起来很好,直到预览页面不包含带孔的填充区域)。 filledarea同样的方法调用绘制的打印预览中的页面内容,只是在调用dc上设置的纸张大小缩放和裁剪区域之前。填充区域对象绘制方法不结合自身的裁切操作由页面裁剪一个。切页夹和其他夹子(切孔夹之间应该是OR关系)如何做AND运算。
FilledArea对象的绘制方法(只是裁剪特定的线条):
...
try
if ( fHoles^.getCount > 0 ) then
begin
// Get a copy of the page clipping rgn
getClipRgn( dc, rgnPrev );
for i := 0 to fHoles^.getCount-1 do
begin
...
// create a rgn to the Xth hole
rgn := createPolygonRgn( rgnPts^, rgnPtsCount, ALTERNATE );
if ( rgn <> 0 ) then
begin
// combine the Xth rgn with the active rgn (OR because there could be many holes in a single filled area)
extSelectClipRgn( dc, rgn, RGN_DIFF );
// releases the Xth rgn
deleteObject( rgn );
end;
...
end;
end;
// draw the polygon
finally
if ( fHoles^.getCount > 0 ) then
begin
// selects a copy of the page cutting rgn copy
selectClipRgn( dc, rgnPrev );
// releases the copy of the page cutting rgn
deleteObject( rgnPrev );
end;
end;
打印预览裁剪区域绘制代码:
// Creates a page clipping rgn
rcRegion := createRectRgn( rcDevLeft_, rcDevTop_, rcDevRight_ + 2, rcDevBottom_ + 2 );
try
// Selects a copy of the page clipping rgn
selectClipRgn( dc_, rcRegion );
...
// draw the page contents
...
finally
// Selects an empty clipping rgn
selectClipRgn( dc_, 0 );
// Releases the created page clipping rgn
deleteObject( rcRegion );
end;
带有两个孔的填充区域的设计时屏幕截图:
同一设计的打印预览截图(等高线偏移是忽略分页区域的标志,由于两页内容绘制了两次)
好的。我找到了。我应该使用 combineRgn Win API 调用来定义两个传入区域之间的布尔运算。