GDI+ GraphicsContainer 不工作
GDI+ GraphicsContainer doesn't work
如果我将页面单位设置为英寸,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)
,你会得到一个以像素为单位的较小的圆圈,并且由于[=16=中的较早转换,它会在错误的位置].
如果我将页面单位设置为英寸,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)
,你会得到一个以像素为单位的较小的圆圈,并且由于[=16=中的较早转换,它会在错误的位置].