1
現在のクリッピングパスをデバイスハンドル(HDC)からポイントセット(移動、ライン、ベジェ曲線)として抽出する方法を探していますWinAPI呼び出しを使用します。たとえば、WinAPIでは、論理演算子AND、OR、XOR、およびDIFFを使用して複雑なクリッピングパスを作成でき、さまざまな方法で使用できます。例えば、以下のコードは、3つの円を作成し、いくつかのロジック(MODE1およびMODE2)とそれをマージします:デバイスハンドル(WinAPI)から現在のクリッピングパスを取得
void clippingTest(HDC dc, int x, int y, std::wstring const &text, int mode1, int mode2){
SaveDC(dc);
HBRUSH redBrush = CreateSolidBrush(RGB(255, 0, 0));
HBRUSH greenBrush = CreateSolidBrush(RGB(0, 255, 0));
HBRUSH blueBrush = CreateSolidBrush(RGB(0, 0, 255));
LOGFONT lf = {0};
lf.lfHeight = -MulDiv(12, GetDeviceCaps(dc, LOGPIXELSY), 72);
std::wstring const faceName = L"Arial";
wcscpy_s(lf.lfFaceName, LF_FACESIZE, faceName.c_str());
HFONT font = CreateFontIndirect(&lf);
RECT rect = {x, y, x + 700, y + 650};
FillRect(dc, &rect, greenBrush);
BeginPath(dc);
Ellipse(dc, x, y, x + 400, y + 400);
//drawStar(dc, x, y);
EndPath(dc);
SelectClipPath(dc, RGN_COPY);
BeginPath(dc);
Ellipse(dc, x + 300, y, x + 700, y + 400);
//drawStar(dc, x, y);
EndPath(dc);
SelectClipPath(dc, mode1);
BeginPath(dc);
Ellipse(dc, x + 150, y + 250, x + 550, y + 650);
//drawStar(dc, x + 300, y);
EndPath(dc);
SelectClipPath(dc, mode2);
SetPolyFillMode(dc, ALTERNATE);
FillRect(dc, &rect, blueBrush);
BeginPath(dc);
Rectangle(dc, rect.left, rect.top, rect.right, rect.bottom);
EndPath(dc);
SelectClipPath(dc, RGN_COPY);
SelectObject(dc, font);
DrawText(dc, text.c_str(), text.length(), &rect, DT_CENTER | DT_TOP);
RestoreDC(dc, -1);
}
そして私は、更なる処理のために、結果のパスを取得する方法に興味があります。
解決策の1つは、他のHDCにクリッピングパスを描き、透明なイメージを作成して次の描画に使用することです。しかし、この方法は結果ファイル(例えば、PDF)を増加させるでしょう。