GDI + GraphicsContainer不起作用

时间:2017-10-16 10:50:25

标签: c++ graphics mfc gdi+

如果我将Page Unit设置为Inch,那么GraphicsContainer似乎无法工作。

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

enter image description here

在这段代码中,我绘制了2个省略号 - 在容器开始之前(第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);

1 个答案:

答案 0 :(得分:2)

之前曾致电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的早期转换,它将处于错误的位置。