2010-11-24 3 views
4

Ich versuche (einfach) einige Linien zu zeichnen, die sich entlang eines Ellipsenpfades drehen, und dachte, ich hätte eine schöne, einfache Art und Weise, dies zu tun. Leider scheint meine Lösung einige Probleme zu haben:Warum erzeugt das Zeichnen einer Ellipse mit Pen :: DashPattern nicht das erwartete Ergebnis?

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 
    } 
} 

... produziert:

http://www.joncage.co.uk/media/img/BadPattern.png

... also warum sind die beiden zweiten Ellipsen vollständig weiß? ... und wie kann ich das Problem vermeiden?

+0

Typische GDI + Verlust. –

Antwort

1

ich mir nicht vorstellen kann, wird das Problem zu beheben, aber Sie können aus der Schleife eine Menge der Verarbeitung nehmen:

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 
    } 
} 
+0

Der Code war nur ein Beispiel. In Wirklichkeit zeichne ich nur eine dieser Ellipsen auf einmal. Ich habe nur ein paar hinzugefügt, um das Problem hervorzuheben. –

3

Dies ist wahrscheinlich einer der zahlreichen GDI ist + Bug. Dies ist auf das Antialiasing in Kombination mit dem DashPattern zurückzuführen. Lustig (naja, irgendwie ...), wenn Sie SmoothingMode = AntiAlias ​​entfernen, erhalten Sie eine wunderbare OutOfMemoryException (und wenn Sie auf "gdi + pattern outofmemoryexception" googlen, werden Sie Hunderte von diesen finden. Was für ein Durcheinander.

Da GDI + nicht wirklich gepflegt wird (obwohl es auch in .NET Framework Winforms verwendet wird, BTW reproducierte ich Ihr Problem mit .NET C#), wie dieser Link uns sagen kann: Pen.DashPattern throw OutOfMemoryException using a default pen, die einzige Möglichkeit, die Sie wahrscheinlich umgehen können, ist verschiedene Werte, um zu versuchen

zum Beispiel, wenn Sie die DashOffset mit diesem statt Einstellung ändern.

myPen2->DashOffset = i*ellipseCircumference; 

Sie werden eine schöne Auswahl an Ellipsen erstellen, so dass Sie vielleicht eine Kombination finden, die wirklich zu Ihnen passt. Viel Glück :-)

+0

Das Problem ist, dass ich mehrere verschiedene Umfänge habe, wenn dieser Code im normalen Betrieb ist. Ich kann einige finden, die in einigen Fällen funktionieren, aber ich muss es für alle arbeiten. –

+0

Hmmm ... Das klingt schlecht. Kannst du nicht etwas anderes als GDI + verwenden? Wie WPF? –

+0

Unsere GUI ist mit C++/Windows Forms geschrieben, also nicht ohne ein Umschreiben. –

Verwandte Themen