c++ - GDI+ GraphicsContainer 不起作用

标签 c++ graphics mfc gdi+

如果我将页面单位设置为英寸,GraphicsContainer 似乎不起作用。

所以我像下面的代码一样进行了测试。

enter image description here

在这段代码中,我画了 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/

相关文章:

math - 是否可以创建允许 360 度旋转的四元数扭曲解决方案?

c++ - 了解多字节/Unicode

c++ - 设计调用外部API的类时测试实现是否正确?

c# - 用鼠标绘图会导致像素之间出现间隙

c++ - Visual Studio 2012 中的 OpenGL 未解析的外部符号 _gluLookAt@72 和 _gluPerspective@32

algorithm - 如何检测二维形状是否包含另一个具有 R 树的形状?

c++ - 如何扩展库类的功能?

c++ - MFC 在标签之间提取 CString

c++ - 如何摆脱这个 Eclipse 警告?

c# - 在 C++ 代码中使用 C# dll