dポイントプレゼントキャンペーン実施中!

VB.Netで開発をしています。

フォーム1のピクチャーボックスにアニメぎfを表示させて、
その上から40%ほど透過させたフォーム2を表示させて
フォーム1全体の色合いを変える処理をしたいのですが
フォーム2を表示させるとフォーム1にあったアニメGifの動きが止まってしまいます。
その後、フォーム2を閉じてもフォーム1のアニメGifはとまったままになってしまいます。

他のフォームを表示させるとアニメGifは正常に動かなくなってしまうのでしょうか?
ちなみにフォーム1の処理自体は正常に動いています。
どなたかご存知方いましたらご教授ください。
よろしくお願いします。

A 回答 (2件)

>フォーム1にはPictureBoxがあってそのイメージにGifアニメ


ならば、ボックスを継承したクラスを作成し、それに処理をさせたらよいかと思います。

そうしたら、今後も楽をできると思いますし、思いついた機能を盛り込ませやすいです。
さらに、そのクラスを別プロジェクトにも流用しやすいです。

以下に改造手順を書きますが、MSのフレーム拡張の基礎なので、多少面倒ですが、がんばってみてください。
(機能は最小限ですので、バグが出たら自分でつぶしてください。わからなければ別スレッドで、継承について質問してください。)



まずクラスを作成してください

MyPicture.vb
'------------------------------------------------------------------------------------------------------
Public Class MyPicture
  Inherits System.Windows.Forms.PictureBox

  'イメージクリア用
  Public Sub ImageSet()
    Me.Image = Nothing
  End Sub

  'イメージセット用
  Public Sub ImageSet(ByVal p_strImagePath As String)
    Call ImageSet()
    Me.Image = New Bitmap(p_strImagePath)
    Call ImageAnimator.Animate(Me.Image, New EventHandler(AddressOf Me.Image_FrameChanged))
  End Sub

  'イベントハンドラ:再描画
  Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
    MyBase.OnPaint(e)
    System.Drawing.ImageAnimator.UpdateFrames()
  End Sub

  'イベントハンドラ:アニメーション描画
  Private Sub Image_FrameChanged(ByVal sender As Object, ByVal e As EventArgs)
    Me.Invalidate()
  End Sub
End Class
'------------------------------------------------------------------------------------------------------


次にフォームをコードで開き、ピクチャボックスの宣言部を見つけ、改造を加えてください
------------------------------------------------------------------
※1.Friend WithEvents PictureBox1 As System.Windows.Forms.PictureBox
※2.Me.PictureBox1 = New System.Windows.Forms.PictureBox()
------------------------------------------------------------------

------------------------------------------------------------------
※1.Friend WithEvents PictureBox1 As MyPicture
※2.Me.PictureBox1 = New MyPicture()
------------------------------------------------------------------
という感じ



最後に
>fs = New System.IO.FileStream("File名", IO.FileMode.Open)
>PictureBox1.Image = Image.FromStream(fs)

PictureBox1.ImageSet("D:\My Documents\My Pictures\moving.gif")
とするだけで、良いです。


画像の切り替えも、パスを渡すだけで、アニメーションが描画されます。
    • good
    • 0
この回答へのお礼

上記の方法で行ったらフォーム下でも動くようになりました。
ありがとうございました。

お礼日時:2006/03/27 11:15

こんな感じでフォーム1があるのですか?



Private gifimg As Bitmap
Protected Overrides Sub OnLoad(ByVal e As System.EventArgs)
  gifimg = New Bitmap("D:\My Documents\My Pictures\moving.gif")
  Call ImageAnimator.Animate(gifimg, New EventHandler(AddressOf Me.Image_FrameChanged))
End Sub
Protected Overrides Sub OnPaint(ByVal e As Windows.Forms.PaintEventArgs)
  Call ImageAnimator.UpdateFrames(gifimg)
  Call e.Graphics.DrawImage(gifimg, 0, 0)
End Sub
Private Sub Image_FrameChanged(ByVal sender As Object, ByVal e As EventArgs)
  Call Me.Invalidate()
End Sub

であれば、フォーム2を表示させても大丈夫のような気がしますが、だめであれば
Me.Invalidate
を実行してあげると良いと思います。

別方法でアニメーションを走らせているのであれば、コードを見ないことには想像も付きません。

この回答への補足

説明不足ですいません。
フォーム1にはPictureBoxがあってそのイメージにGifアニメを指定してます。
コードは以下の通りです。

Dim fs As System.IO.FileStream

fs = New System.IO.FileStream("File名", IO.FileMode.Open)
PictureBox1.Image = Image.FromStream(fs)

1050YENさんの方法でGifアニメを表示した場合は大丈夫でした。
ただ画像の数(コントロールの数)が多く、動的に表示を切り替えているので
この方法のままでいい方法があればなぁ、と思っています。

不思議なことに動いているGifアニメの全体をフォームで覆わなければ動いています。
全体を覆ってしまうと動きが止まってしまうようです。
もしも分かるようでしたらご教授願います。

補足日時:2006/03/24 19:04
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています