如果我将页面单位设置为英寸,GraphicsContainer 似乎不起作用。
所以我像下面的代码一样进行了测试。
在这段代码中,我画了 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)
。显然,在 BeginContainer
之后需要第二次调用 g.SetPageUnit(Gdiplus::UnitInch)
:
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);
如果在 BeginContainer
之后不调用 SetPageUnit(Gdiplus::UnitInch)
,您会得到一个以像素为单位的较小圆圈,并且它将位于错误的位置由于 UnitInch
中的早期转换。
关于c++ - GDI+ GraphicsContainer 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46768568/