从设备句柄(WinAPI)获取当前剪切路径

时间:2017-07-12 11:06:33

标签: winapi gdi clipping

我正在寻找一种解决方案,如何使用WinAPI调用从设备句柄(HDC)中提取当前剪切路径作为一组点(移动到,行到Bezier曲线)。例如,WinAPI允许使用AND,OR,XOR和DIFF逻辑运算符创建复杂的剪切路径,并且可以以不同的方式使用它。例如,下面的代码将创建三个圆圈并将其与某个逻辑(mode1和mode2)合并:

Set oFSO = CreateObject("Scripting.FileSystemObject")

sDirectoryPath = "C:\Users\Desktop\z\"

Set oFolder = oFSO.GetFolder(sDirectoryPath)
Set oFileCollection = oFolder.Files

If oFile.Size > 20000000 And ofile.Filename = "nor.dotm Then
  oFile.Delete(True)
End If

The result of clipping here

我对如何获得进一步处理的结果路径感兴趣。

其中一个解决方案是在其他HDC上绘制剪切路径,创建透明图像并将其用于下一个绘图。但是这种方法会增加结果文件(例如PDF)。

1 个答案:

答案 0 :(得分:0)

找到了一个允许用矩形近似结果区域的解决方案。

  void Emf2PdfEngine::selectClippingPath(void){
    Rgn rgn(CreateRectRgn(0, 0, 1, 1)); // RAII for HRGN object
    if (!GetClipRgn(mHdc, rgn))
      return;

    DWORD const rgnSize = GetRegionData(rgn, 0, nullptr);
    std::vector<uint8_t> rgnData(rgnSize);
    GetRegionData(rgn, rgnSize, (RGNDATA *) rgnData.data());
    RGNDATA *rawData = (RGNDATA *) rgnData.data();

    uint32_t const count = rawData->rdh.nCount; // count of RECT objects
    if (!count)
      return;

    mCurrentDeviceState->mIsClipped = true;
    mCurrentDeviceState->mClippingPathPoints.resize(count * 2);
    mCurrentDeviceState->mClippingPathTypes.resize(count * 2);

    RECT *rect = (RECT *) rawData->Buffer;
    for (std::size_t i = 0; i < count; ++i){
      mCurrentDeviceState->mClippingPathPoints[i * 2] = {rect[i].left, rect[i].top};
      mCurrentDeviceState->mClippingPathPoints[i * 2 + 1] = {rect[i].right - rect[i].left, rect[i].bottom - rect[i].top};
      mCurrentDeviceState->mClippingPathTypes[i * 2] = PT_RECT;
      mCurrentDeviceState->mClippingPathTypes[i * 2 + 1] = PT_RECT;// | PT_CLOSEFIGURE;
    }
  }