0

アプリケーションが何か大きなものをロードしているときに、画面上にローディング サークル (.gif) を描画したいと考えています。しかし、メモリの問題が発生するため、円を思うように速く走らせることはできません。これらを解決する方法を知っている人はいますか (1000ms ではなく 75ms)? 完了時に円を削除する方法 (円はもう消えません)。

EDIT:ウィンドウサイズが変更されたときにload関数が実行されます。

    public Main()
    {
        InitializeComponent();
        StartUp();
        WindowState = FormWindowState.Maximized;
    }

    bool onrun;
    bool done;
    System.Threading.Timer timer;
    GifImage Circle;
    Point center;

    void StartUp()
    {
        onrun = true;
        done = false;
        timer = new System.Threading.Timer(new System.Threading.TimerCallback(Animate));
        timer.Change(0, 500);
    }

    void Animate(object sender)
    {
        if (onrun == true)
        {
            Circle = new GifImage("circleAnim.gif");
            Circle.ReverseAtEnd = false;
            int width = Screen.PrimaryScreen.Bounds.Width;
            int height = Screen.PrimaryScreen.Bounds.Height;
            center = new Point((width / 2) - 150, (height / 2) - 150);
            onrun = false;
        }
        else if (done == true)
        {
            timer.Dispose();
        }

        Image i = Circle.GetNextFrame();
        System.Drawing.Graphics GraphicsObject = Graphics.FromHwnd(IntPtr.Zero);
        try
        {
            GraphicsObject.DrawImage(i, center);
            i.Dispose();
            GraphicsObject.Dispose();
        }
        catch { }
    }

    private void Load(object sender, EventArgs e)
    {
        int hduizend = 100000;

        for (int i = 1; i <= 100000000; i++)
        {
            hduizend /= 2;
            hduizend *= 2;
        }

        done = true;
    }

EDIT2 (エラー): 「保護されたメモリを読み書きしようとしました。これは多くの場合、他のメモリが破損していることを示しています」。

また、gif 画像自体は問題ではありません。

public class GifImage
{
private Image gifImage;
private FrameDimension dimension;
private int frameCount;
private int currentFrame = -1;
private bool reverse;
private int step = 1;

public GifImage(string path)
{
    gifImage = Image.FromFile(path); 
    dimension = new FrameDimension(gifImage.FrameDimensionsList[0]); 
    frameCount = gifImage.GetFrameCount(dimension); 
}

public bool ReverseAtEnd 
{
    get { return reverse; }
    set { reverse = value; }
}

public Image GetNextFrame()
{

    currentFrame += step;


    if (currentFrame >= frameCount || currentFrame < 1)
    {
        if (reverse)
        {
            step *= -1;
            currentFrame += step; 
        }
        else
            currentFrame = 0;
    }
    return GetFrame(currentFrame);
}

public Image GetFrame(int index)
{
    gifImage.SelectActiveFrame(dimension, index); 
    return (Image)gifImage.Clone(); 
}

}

4

1 に答える 1

1

GIFをPictureBoxに割り当て、必要に応じてPictureboxを表示します。アニメーションを担当します。いつ表示する必要があるか、そのときに配置する必要があるだけです。

private PictureBox pictureBox = new PictureBox();
Image animatedPicture = Image.FromFile(path);

...
int width = Screen.PrimaryScreen.Bounds. 
int height = Screen.PrimaryScreen.Bounds.Height;
center = new Point((width / 2) - 150, (height / 2) - 150);
pictureBox.Location = center;
pictureBox.Visible = true;
于 2012-09-21T17:24:07.930 に答える