如何在主裁剪区域和其他一些裁剪区域之间进行 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 调用来定义两个传入区域之间的布尔运算。