1

**次のコードを使用して実行時に楕円を描画します。そのコードでは、描画にグラフィックパスを使用し(実際にはこれはプロジェクトの要件です)、グラフィックパスに widen メソッドを使用しました。しかし、「メモリ不足」というランタイム例外が発生します。楕円の場合にこのメソッドを使用できますか?

実行時に長方形を描画する場合に widen メソッドを使用すると、正しく機能します。

この問題を解決して、何か提案をお願いします**

public partial class Form2 : Form
   {
       public Form2()
       {
           InitializeComponent();
       }

        Rectangle r;
        bool isDown = false;
        int initialX;
        int initialY;
        bool IsDrowing =true;
        GraphicsPath gp1;
        GraphicsPath gp2;
        GraphicsPath gp3;
        GraphicsPath gp;
       Graphics g;
       bool contained;
       bool containedE;
       bool containedC;

    private void Form2_MouseDown(object sender, MouseEventArgs e)
    { 

       isDown = true;
       IsDrowing = true;

      initialX = e.X;
     initialY = e.Y;

    }

    private void Form2_MouseMove(object sender, MouseEventArgs e)
    {
    //IsDrowing = true;
    if (isDown == true)
     {


     int width = e.X - initialX, height = e.Y - initialY;
     r = new Rectangle(Math.Min(e.X, initialX),
                      Math.Min(e.Y, initialY),
                     Math.Abs(e.X - initialX),
                    Math.Abs(e.Y - initialY));


                this.Invalidate();


      }

    }

    private void Form2_Paint(object sender, PaintEventArgs e)
    {
    g = this.CreateGraphics();
    gp = new GraphicsPath();
    Pen pen = new Pen(Color.Red);
    gp.AddEllipse(r);
    gp.Widen(pen);
    pen.DashStyle = DashStyle.Dash;
    if (IsDrowing)
    {
    g.DrawPath(pen, gp);
    }
    private void Form2_MouseUp(object sender, MouseEventArgs e)
        {
            IsDrowing = false;
            this.Refresh();
         }
    }
4

1 に答える 1

0

基本的に: GraphicsPath.Widen メソッドは避けてください。バグがあります。「スピログラフ バグ」で検索してください

あなたの場合、0×0の長方形を広げようとするため、これが現れます。次のようにコードを変更します。

private void Form2_Paint(object sender, PaintEventArgs e)
{
    if (IsDrowing)
    {
        g = e.Graphics;
        gp = new GraphicsPath();
        gp.AddEllipse(r);
        gp.Widen(new Pen(Color.Red, 10));

        Pen pen = new Pen(Color.Red, 1);
        pen.DashStyle = DashStyle.Dash;

        g.DrawPath(pen, gp);
    }
}

追加の作業が必要になる場合がありますが、空の長方形/楕円を広げないようにしてください。

于 2013-04-06T09:58:57.950 に答える