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

从设备句柄(WinAPI)获取当前剪辑路径,winapi,gdi,clipping,Winapi,Gdi,Clipping,我正在寻找一个解决方案,如何使用WinAPI调用从设备句柄(HDC)提取当前剪辑路径作为一组点(移动到、直线到、贝塞尔曲线)。例如,WinAPI允许使用AND、OR、XOR和DIFF逻辑运算符创建复杂的剪裁路径,并且可以以不同的方式使用。例如,下面的代码将创建三个圆,并将其与某些逻辑(模式1和模式2)合并: 我感兴趣的是如何获得进一步处理的结果路径 解决方案之一是在其他HDC上绘制剪裁路径,创建透明图像并将其用于下一次绘制。但是这种方法会增加结果文件(例如PDF)。已经找到了一种解决方案,可以

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

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


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

已经找到了一种解决方案,可以用矩形近似结果区域

  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;
    }
  }
void Emf2PdfEngine::选择剪报路径(void){
Rgn Rgn(CreateRectRgn(0,0,1,1));//HRGN对象的RAII
如果(!GetClipRgn(mHdc,rgn))
返回;
DWORD const rgnSize=GetRegionData(rgn,0,nullptr);
标准::矢量rgnData(rgnSize);
GetRegionData(rgn,rgnSize,(rgnda*)rgnda.data());
rgnda*rawData=(rgnda*)rgnda.data();
uint32\u t const count=rawData->rdh.nCount;//RECT对象的计数
如果(!计数)
返回;
mCurrentDeviceState->mIsClipped=true;
mCurrentDeviceState->mClippingPathPoints.resize(计数*2);
mCurrentDeviceState->mClippingPathTypes.resize(计数*2);
RECT*RECT=(RECT*)原始数据->缓冲区;
对于(std::size\u t i=0;imClippingPathPoints[i*2]={rect[i]。左,rect[i]。顶};
McCurrentDeviceState->mClippingPathPoints[i*2+1]={rect[i]。右-rect[i]。左,rect[i]。下-rect[i]。上};
mCurrentDeviceState->mClippingPathTypes[i*2]=PT_RECT;
mCurrentDeviceState->mClippingPathTypes[i*2+1]=PT_RECT;//PT|u CLOSEFIGURE;
}
}

已经找到了一种解决方案,可以用矩形近似结果区域

  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;
    }
  }
void Emf2PdfEngine::选择剪报路径(void){
Rgn Rgn(CreateRectRgn(0,0,1,1));//HRGN对象的RAII
如果(!GetClipRgn(mHdc,rgn))
返回;
DWORD const rgnSize=GetRegionData(rgn,0,nullptr);
标准::矢量rgnData(rgnSize);
GetRegionData(rgn,rgnSize,(rgnda*)rgnda.data());
rgnda*rawData=(rgnda*)rgnda.data();
uint32\u t const count=rawData->rdh.nCount;//RECT对象的计数
如果(!计数)
返回;
mCurrentDeviceState->mIsClipped=true;
mCurrentDeviceState->mClippingPathPoints.resize(计数*2);
mCurrentDeviceState->mClippingPathTypes.resize(计数*2);
RECT*RECT=(RECT*)原始数据->缓冲区;
对于(std::size\u t i=0;imClippingPathPoints[i*2]={rect[i]。左,rect[i]。顶};
McCurrentDeviceState->mClippingPathPoints[i*2+1]={rect[i]。右-rect[i]。左,rect[i]。下-rect[i]。上};
mCurrentDeviceState->mClippingPathTypes[i*2]=PT_RECT;
mCurrentDeviceState->mClippingPathTypes[i*2+1]=PT_RECT;//PT|u CLOSEFIGURE;
}
}