0

コードが機能しません。/** の問題をコメントアウトしました。
IntPtr ハ​​ンドルを渡しているときにペンデュラム フォームを閉じると、OutOfMemory 例外が発生し、サイズが大きくなります。
また、毎回振り子を振って速度を緩めるのにも問題があります。それらは私の理論の問題ですか、それとも私は何か愚かなことをしましたか.
以下は振り子クラスのコードです。

using System.Drawing; //new
using System.Windows.Forms; //new

  class Pendulum
{
    int length = 50;
    double angle = Math.PI /2;
    double aAcc = -9.81;
    double aVel = 0;
    double gravity = 0.1;
    double mass = 0.2;
    Timer timer;

    public Pendulum(int frmWidth, int frmHeight, IntPtr handle)
    {
        timer = new Timer() { Interval = 30 };

        timer.Tick += delegate(object sender, EventArgs e)
        {
            int originX = frmWidth / 2;
            int originY = 0;
            int bobX; // = frmWidth / 2;
            int bobY; // = (int)length;

            //to be relative to origin we go:
            bobX = originX + (int)(Math.Sin(angle) * length);
            bobY = originY +  (int)(Math.Cos(angle) * length);

            aAcc = -9.81 / length * Math.Sin(angle);

            aVel += aAcc * gravity * mass;
            angle += aVel * gravity; //angle += aVel;
            //aVel = aVel -0.09; /** SPEED UP DRAMATICALLY! SPINS WEIRDLY! **/
            DrawPendulum(originX,originY,bobX,bobY,frmWidth,frmHeight, handle);

        };

        timer.Start();
    }

    public void DrawPendulum(int originX, int originY, int bobX, int bobY, int frmWidth, int frmHeight, IntPtr handle)
    {
        using(Bitmap dblBuffer = new Bitmap(frmWidth, frmHeight))
        using(Graphics g = Graphics.FromImage(dblBuffer))
        using(Graphics f = Graphics.FromHwnd(handle))
        {

        g.DrawLine(Pens.Black, originX, originY, bobX, bobY);
        g.FillEllipse(Brushes.Blue, bobX - 8, bobY, 20, 20); //-8 for tidyness!

        f.Clear(Color.White);
        f.DrawImage(dblBuffer, new Point(0, 0));

        }
    }
}

 public partial class frmPendulum : Form
{
    Pendulum p;
    public frmPendulum()
    {
        frmLogin frm = new frmLogin();
        frm.Close();

        int frmWidth = this.Width;
        int frmHeight = this.Height;
        IntPtr Handle = this.Handle;

         p = new Pendulum(frmWidth, frmHeight, Handle);

        InitializeComponent();
    }

    private void frmPendulum_Load(object sender, EventArgs e)
    {

    }

  public void TimerDispose()
        {
            timer.Dispose();
        }
    }

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

    private void frmLogin_Load(object sender, EventArgs e)
    {

    }

    private void btnSubmit_Click(object sender, EventArgs e)
    {
        frmPendulum f = new frmPendulum();
        f.Show();
        //this.Hide();
    }
}

編集: タイマーを破棄するために、Pendulum p をグローバルにして、以下の pendulum クラス内に配置した新しいメソッドを実行するために使用できるようにしました。

    public void TimerDispose()
    {
        timer.Dispose();
    }

これは、タイマーをグローバルにすることも意味していました。ただし、OutOfMemory 例外は引き続き発生します。すべてのコードは上記の現在の状態です。

4

1 に答える 1

0

なんて混乱....

frmPendulum() の Paint() イベントを処理し、DrawPendulum() に渡しe.Graphicsます。
frmPendulum には、自分自身を更新するだけの独自のタイマーが必要です。

Pendulum では、渡された Graphics に直接描画します。Bitmap と Handle コードを取り除きます。DrawPendulum() でアクセスできるように、変数はすべてクラス レベルである必要があります。Pendulum は、Tick() イベントで自分自身を描画してはなりません。

したがって、次のようになります。

public partial class frmPendulum : Form
{

    private Timer timer;
    private Pendulum p = null;

    public frmPendulum()
    {
        InitializeComponent();

        this.Shown += new EventHandler(frmPendulum_Shown);
        this.Paint += new PaintEventHandler(frmPendulum_Paint);
    }

    void frmPendulum_Shown(object sender, EventArgs e)
    {
        p = new Pendulum(this.ClientRectangle.Width, this.ClientRectangle.Height);
        timer = new Timer() { Interval = 100 };
        timer.Tick += delegate(object s2, EventArgs e2)
        {
            this.Refresh();
        };
        timer.Start();
    }

    void frmPendulum_Paint(object sender, PaintEventArgs e)
    {
        if (p != null)
        {
            p.DrawPendulum(e.Graphics);
        }
    }

}

public class Pendulum
{

    int length = 50;
    double angle = Math.PI / 2;
    double aAcc = -9.81;
    double aVel = 0;
    double gravity = 0.1;
    double mass = 0.2;

    int originX = 0;
    int originY = 0;
    int bobX; // = frmWidth / 2;
    int bobY; // = (int)length;

    Timer timer;

    public Pendulum(int frmWidth, int frmHeight)
    {
        timer = new Timer() { Interval = 50 };

        timer.Tick += delegate(object sender, EventArgs e)
        {
            originX = frmWidth / 2;
            originY = 0;

            //to be relative to origin we go:
            bobX = originX + (int)(Math.Sin(angle) * length);
            bobY = originY + (int)(Math.Cos(angle) * length);

            aAcc = -9.81 / length * Math.Sin(angle);

            aVel += aAcc * gravity * mass;
            angle += aVel * gravity; 
        };

        timer.Start();
    }

    public void DrawPendulum(Graphics G)
    {
        G.DrawLine(Pens.Black, originX, originY, bobX, bobY);
        G.FillEllipse(Brushes.Blue, bobX - 8, bobY, 20, 20); //-8 for tidyness!
    }

}

ここに画像の説明を入力

于 2013-10-07T18:19:07.467 に答える