如果将“页面单位”设置为“英寸”,则GraphicsContainer似乎无法正常工作。

所以我测试了下面的代码。

c++ - GDI + GraphicsContainer不起作用-LMLPHP

在此代码中,我绘制了两个椭圆-容器开始之前(第1个)和之后(第2个)。
如果容器有效,则圆圈的颜色应为蓝色。但它仍然是绿色的。这意味着BeginContainer()下的第二个绘图代码根本不起作用。

当我将页面单位设置为UnitPixel或UnitWorld(UnitInch。除外)时,这从未发生过。
是什么原因?我错过了什么吗?我该如何解决?

CPaintDC dc(this); CRect rec; GetClientRect(&rec);
Gdiplus::Graphics g(dc.GetSafeHdc());
g.SetPageUnit(UnitInch);
float dx = 2; float dy = 4;
REAL DpiX = g.GetDpiX(); REAL DpiY = g.GetDpiY();
Matrix flipMatrix(1.0f, 0.0f, 0.0f,-1.0f,-dx,dy);
g.SetTransform(&flipMatrix);
g.TranslateTransform((rec.Width()/2)/DpiX ,(rec.Height()/2)/DpiY, Gdiplus::MatrixOrderAppend);
//Pen//
Gdiplus::Pen RedPen(Gdiplus::Color::Red, 0.1);
Gdiplus::Pen BluePen(Gdiplus::Color::Blue, 0.1);
Gdiplus::Pen GreenPen(Gdiplus::Color::Green, 0.1);
//Draw Cross
g.DrawLine(&GreenPen, PointF(dx-1.0f,dy+1.0f), PointF(dx+1.0f, dy-1.0f));
g.DrawLine(&GreenPen, PointF(dx+1.0f,dy+1.0f), PointF(dx-1.0f, dy-1.0f));
//Draw 1st Ellipse without Container
g.DrawEllipse(&RedPen, dx-1,dy-1, 2.0f,2.0f);
GraphicsContainer C;
//Start Container------
C=g.BeginContainer();
//Draw 2nd Ellipse within Container
g.DrawEllipse(&BluePen, dx-1,dy-1, 2.0f,2.0f);
//End Container
g.EndContainer(C);

最佳答案

之前有一个g.SetPageUnit(UnitInch)的电话。显然,在g.SetPageUnit(Gdiplus::UnitInch)之后需要再次调用BeginContainer:

g.SetPageUnit(UnitInch);
...
GraphicsContainer C;
//Start Container------
C = g.BeginContainer();
g.SetPageUnit(Gdiplus::UnitInch); //<== put after g.BeginContainer
//Draw 2nd Ellipse within Container
g.DrawEllipse(&BluePen, dx - 1, dy - 1, 2.0f, 2.0f);
//End Container
g.EndContainer(C);

如果不在SetPageUnit(Gdiplus::UnitInch)之后调用BeginContainer,则会得到一个较小的以像素为单位的圆圈,由于UnitInch的过渡较早,因此其位置会错误。

07-24 14:16