我正在寻找一种解决方案,如何使用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
我对如何获得进一步处理的结果路径感兴趣。
其中一个解决方案是在其他HDC上绘制剪切路径,创建透明图像并将其用于下一个绘图。但是这种方法会增加结果文件(例如PDF)。
答案 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;
}
}