2

これは私の最初の投稿です。まず、いくつかの背景について説明します。私は C# を初めて使用し、文字通り歯が生える段階にあります。私は化学エンジニアで、主に MATLAB や Mathematica などの言語の経験がありますが、ずっとプログラミングが好きで、C# を学習して、使用しているいくつかのプログラム用のユーザー フレンドリーなインターフェイスを作成することにしました。WPFではなくWindowsフォームを使用していることに注意してください。

私がやりたいことは、さまざまなフォームにリンクするメイン メニュー画面を持つことです。見栄えを良くするために、私がやりたいのはこれです。メイン ウィンドウのピクチャ ボックス (画像はボタンのものです) にカーソルを合わせると、ボタンが少し「大きく」なり、離れると元のサイズに「縮小」するはずです。これまでのところ、私の方法は、mouseEnter イベントでこの成長アニメーションの gif を読み込んでから、mouseLeave で縮小アニメーションを読み込もうとしていましたが、これはそれぞれの gif を何度もループするだけです。GIFを1回だけ再生するにはどうすればよいですか?

フレーム間にスレッドスリープを入れてフレームを順番にロードしようとしましたが、これを行うときに表示されるのは、ロードしようとした最後の画像だけです。これは、このメソッドに使用されるコードの例です。1 つの画像を表示し、0.1 秒後に別の画像を表示しようとしています

    private void pictureBox1_MouseEnter(object sender, EventArgs e)
    {
        pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
        ((PictureBox)sender).Image =Image.FromFile("C:/Users/michael/Desktop/131.bmp");

        Thread.Sleep(100);
        ((PictureBox)sender).Image = Image.FromFile("C:/Users/michael/Desktop/131a.bmp");
    }

また、for ループを使用してボタンやピクチャ ボックスのサイズを大きくするなど、gif なしでこれを行う方法はありますか?

編集1:2番目のアニメーションを開始すると最初のアニメーションが停止するように、タイマーストップをどこに配置しますか?

      private void pictureBox1_MouseEnter(object sender, EventArgs e)
       {
        pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
        Timer timeraf = new Timer();
        timeraf.Interval = 10;
        timeraf.Tick += new EventHandler(timerAfwd_Tick);
        timeraf.Start();
     }

   private void pictureBox1_MouseLeave(object sender, EventArgs e)
    {

        pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
        Timer timerab = new Timer();
        timerab.Interval = 10;
        timerab.Tick += new EventHandler(timerAbwd_Tick);
        timerab.Start();
    }
4

1 に答える 1

1

メインスレッドをスリープ状態にすると、ユーザー入力がロックアウトされ、ペイントを処理するスレッドがブロックされることは間違いありません。したがって、画像はアニメーションをペイントできません。次のようなタイマーを使用してみてください。

public partial class Animation : Form
{
    Image img1 = Properties.Resources.img1;
    Image img2 = Properties.Resources.img2;
    Image img3 = Properties.Resources.img3;

    List<Image> images = new List<Image>();
    Timer timer = new Timer();

    public Animation()
    {
        InitializeComponent();

        timer.Interval = 250;
        timer.Tick += new EventHandler(timer_Tick);

        images.Add(img1);
        images.Add(img2);
        images.Add(img3);

        animated_pbx.Image = img1;
    }

    private void timer_Tick(object sender, EventArgs e)
    {
        if (this.InvokeRequired)
        {
            this.BeginInvoke(new EventHandler(timer_Tick));
        }
        else
        {
            // Loop through the images unless we've reached the final one, in that case stop the timer
            Image currentImage = animated_pbx.Image;
            int currentIndex = images.IndexOf(currentImage);

            if (currentIndex < images.Count - 1)
            {
                currentIndex++;

                animated_pbx.Image = images[currentIndex];

                animated_pbx.Invalidate();
            }
            else
            {
                timer.Stop();
            }
        }
    }

    private void animated_pbx_MouseEnter(object sender, EventArgs e)
    {
        timer.Start();
    }

    private void animated_pbx_MouseLeave(object sender, EventArgs e)
    {
        timer.Stop();
        animated_pbx.Image = img1;
        animated_pbx.Invalidate();
    }
}

編集: PictureBox にカーソルを合わせたときにアニメーションを追加するようにコードを変更しました。ホバリングしている間、アニメーションは最終フレームにとどまります。マウスが離れると、最初のフレームにリセットされます。必要な数のフレームを使用できます。また、MouseDown と MouseUp を処理し、押された状態または「ダウン」状態を示す画像をもう 1 つ作成する必要があります。

于 2012-01-21T03:31:57.353 に答える