我试着(简单地)画一些沿着椭圆路径旋转的线,我想我有一个很好的简单的方法。不幸的是,我的解决方案似乎有一些问题:
void EllipseDisplayControl::OnPaint(PaintEventArgs^ e)
{
Graphics^ gfx = e->Graphics;
gfx->SmoothingMode = Drawing2D::SmoothingMode::AntiAlias;
int width = 100;
int height = 10;
for( int i = 0; i < 15; i ++ )
{
Drawing::Pen^ myPen = (Drawing::Pen^) Drawing::Pens::RoyalBlue->Clone(); //use the standard blue as a start point
myPen->Color = Drawing::Color::FromArgb(64, 32, 111, 144);
myPen->Width = 3;
myPen->DashStyle = Drawing::Drawing2D::DashStyle::Solid;
gfx->DrawEllipse(myPen, 0, 50+i*20, width, height); // Draw the blue ring
float ellipseCircumference = Math::PI * Math::Sqrt(2* (Math::Pow(0.5*width,2) + Math::Pow(0.5*height,2)));
array<Single>^ pattern = {4, ellipseCircumference};
Drawing::Pen^ myPen2 = (Drawing::Pen^) Drawing::Pens::White->Clone(); //use the standard blue as a start point
myPen2->DashPattern = pattern;
myPen2->DashOffset = i*10;
gfx->DrawEllipse(myPen2, 0, 50+i*20, width, height); // Draw the rotating white dot
}
}...produces:
http://www.joncage.co.uk/media/img/BadPattern.png
为什么第二个椭圆是全白的?,...and,我怎么才能避免这个问题?
发布于 2010-12-21 19:25:45
这可能是众多GDI+错误中的一个。这是由于结合了抗锯齿和DashPattern。有趣的是(好吧,有点...),如果你删除SmoothingMode = AntiAlias,你会得到一个很棒的OutOfMemoryException (如果你在谷歌上搜索"gdi+ pattern outofmemoryexception“,你会找到成百上千的这样的异常。啊!怎么这么乱呀。
由于GDI+并没有真正得到维护(尽管它也用在.NET框架Winforms中,但我用.NET C#重现了您的问题),正如这个链接可以告诉我们的:Pen.DashPattern throw OutOfMemoryException using a default pen,解决这个问题的唯一方法就是尝试不同的值。
例如,如果您使用以下代码更改DashOffset设置:
myPen2->DashOffset = i*ellipseCircumference;您将生成一组很好的省略号,所以也许您可以找到一个真正适合您的组合。祝你好运:-)
发布于 2010-12-21 19:06:09
我不能想象它会解决这个问题,但你可以在循环中减少很多处理:
void EllipseDisplayControl::OnPaint(PaintEventArgs^ e)
{
Graphics^ gfx = e->Graphics;
gfx->SmoothingMode = Drawing2D::SmoothingMode::AntiAlias;
int width = 100;
int height = 10;
Drawing::Pen^ myPen = (Drawing::Pen^) Drawing::Pens::RoyalBlue->Clone(); //use the standard blue as a start point
myPen->Color = Drawing::Color::FromArgb(64, 32, 111, 144);
myPen->Width = 3;
myPen->DashStyle = Drawing::Drawing2D::DashStyle::Solid;
float ellipseCircumference = Math::PI * Math::Sqrt(2* (Math::Pow(0.5*width,2) + Math::Pow(0.5*height,2)));
array<Single>^ pattern = {4, ellipseCircumference};
Drawing::Pen^ myPen2 = (Drawing::Pen^) Drawing::Pens::White->Clone(); //use the standard blue as a start point
myPen2->DashPattern = pattern;
for( int i = 0; i < 15; i ++ )
{
gfx->DrawEllipse(myPen, 0, 50+i*20, width, height); // Draw the blue ring
myPen2->DashOffset = i*10;
gfx->DrawEllipse(myPen2, 0, 50+i*20, width, height); // Draw the rotating white dot
}
}https://stackoverflow.com/questions/4270015
复制相似问题