0

カスタム コントロールで GDI+ と C++ を使用して四角形とパスを描画しています。これが私のコードです...

Gdiplus::RectF myRectF(50.0f, 50.0f, 50.0f, 50.0f);
Gdiplus::Matrix myMatrix(0.0f, 1.0f, 0.0f, 0.0f, 30.0f, 30.0f);
Gdiplus::Graphics gdiGraphics(hDC); // hdC is my Device Context

Gdiplus::Pen* myPen = new Gdiplus::Pen(Gdiplus::Color::White);
myPen->SetWidth(2);

gdiGraphics.TranslateTransform(100.0f, 100.0f, Gdiplus::MatrixOrderAppend);
gdiGraphics.SetTransform(&myMatrix);
gdiGraphics.DrawRectangle(myPen, myRectF);

Gdiplus::GraphicsPath *myPath = new Gdiplus::GraphicsPath();
myPath->AddRectangle(myRectF);
myPath->Transform(&myMatrix);
gdiGraphics.FillPath(new SolidBrush(Color.Green), myPath);

しかし、Rectangle は Path とは異なる場所に描画されます。

両方 (Rectangle と Path) から変換部分を実行しないと、これら 2 つが同じ座標で描画されるため、これら 2 つの変換の動作が異なるのか、間違った API を使用しているのか疑問に思っていました。

パスに描かれた四角形は、本来あるべき正しいものです。

4

1 に答える 1

2

パスに変換を 2 回適用するため、Rectangle とパスは異なる場所に描画されます。まず、Graphics Object のワールド変換として設定すると、次のようになります。

gdiGraphics.SetTransform(&myMatrix);

次に、パスも変換します。

myPath->Transform(&myMatrix);

オブジェクトが描画されるとき、Rectangle は Graphics オブジェクトの平行移動のみに影響されますが、Path は Graphics オブジェクトの平行移動とそれ自体の平行移動の両方の影響を受けます。

両方の形状を同じ場所に描画したい場合は、Graphics オブジェクトに変換を適用するだけで十分です。

また、グラフィックス オブジェクトの変換マトリックスを SetTransform() で設定すると、前の TranslateTransform() 操作がオーバーライドされます。

于 2012-06-04T12:38:12.987 に答える