2009-05-07 15 views
2

ボタンにアニメーションgifが配置されています。 (ほとんどの時:P)アニメーション化されていますが、ウィンドウが再描画(再描画)されるとアニメーションが停止します。私はペイントイベントを処理中にボタン(button.Refresh())をリフレッシュしようとしましたが、問題を解決しませんでした。 \ボタン上のアニメーションgifは、フォームの移動(再描画)後に停止します

これを修正する方法を知っている人はいますか?

+0

これをテストしたところ、ウィンドウが再描画されてもアニメーションは停止しません。 onPaintイベントを処理するときに他のことを行いますか?あなたはonPaintをオーバーライドしないで試しましたか? – jgallant

+0

BackgroundWorkerが動作しています(ただし、これは別のスレッドです)。ウィンドウを移動すると、アニメーションが機能しなくなります。また、アニメーションが始まらない場合もあります:/(p。アニメーション付きのこのボタンは、別のボタンをクリックするまで表示されないため、アクティブ化する前に無効または不可視です)。 – kyrisu

+0

いくつかの検討の後 - それは後でXPマシンでそれをテストする必要があるWindows 7の互換性の問題かもしれません。しかしそれほど重要な問題ではない。 – kyrisu

答えて

3

おそらく私は誤解されていますが、アニメーション化されたオブジェクトが別のウィンドウによって隠されているときに、フォームが再描画されたときにアニメーションが停止するという問題があると思います。これは意図された動作です。バグはWindows VistaとWindows 7ではディスプレイが合成されているため、ウィンドウが「覆い隠されていても」本当に隠されていないにもかかわらず、アニメーションを戻すペイントメッセージが表示されることはありません。

このバグは、アニメーションオブジェクトを持つButtonBaseから派生したコントロールに影響するように見えます。

問題は、Control.IsWindowObscured関数です。それは真実を返すでしょう。

if (IsWindowObscured) { 
StopAnimate(); 
return; 
} 

、そこには問題がある:あなたが言う非常に最後の行のコードがあり、System.Windows.Forms.ButtonBase.OnFrameChangedで、ButtonBase.csファイルで見ることができます。

FYI、OnFrameChangedはImageAnimatorスレッドから呼び出されます。これはImageAnimator.Animate(image、eventhandler)で指定されたコールバックです。 ButtonBaseはこれをprivate void Animate(bool animate)関数で設定します。 ImageAnimatorスレッドは50msごとにポーリングを行い、監視している画像に新しいフレームが必要かどうかを確認します。そうであれば、コントロールを無効にして新しいフレームを描画するフラグを設定します。

これは私達にはアクセスできないため、私たちはそれについて多くのことができるとは思わない。回避策として、フォームに500msごとにコントロールを無効にするタイマーを実装しました。これにより、以前に停止した場合に再起動されます。オーバーライドしたりアクセスしたりすることはできません。私は唯一の解決策は、上記のハック、または自分自身または第三者が作成したコントロールを作成または使用することです。

これは、Windows VistaまたはWindows 7でデスクトップ構成を使用している場合にのみ問題です。問題は、デスクトップがデスクトップ構成を使用していないときと同じように、ウィンドウが本当に不明瞭になることはないということです。それらは常にウィンドウマネージャによってバッファリングされます。 (Windows2000 +には特別なレイヤードウィンドウがありますが、現在は無視されています)。以前は、画面に表示されていないか、別のウィンドウに隠れていた場合、ウィンドウの一部が表示されませんでした。彼らが視野に戻ったとき、焦点や位置などを変えることによって、システムはそれを再描画するようにその領域に通知する。しかし、デスクトップコンポジションを使用する場合は、ウィンドウの実際の内容が他の場所でバッファされるため、再ペイントは決して必要ありません。これは、ウィンドウプレビューがタスクバーで動作し、Flip-3dが動作する理由です。副作用は、隠蔽された後に再度表示されたときにペイントメッセージを受け取ることを期待するコードが失敗することです。 ButtonBaseコードは、ビューに戻るとペイントメッセージを受け取ることを期待しています。これにより、アニメーションが再び開始されます。したがって、この最適化はバグとなりました。

この問題は、Microsoft Connectで報告する必要がありますが、解決される可能性は低いです。

+0

Thxについて詳しく説明しています。私の問題はどうにかして修正されました...うーん..本当に何が正確にわかっていない - 私のVSを更新し、gifを変更する。私は基本的にあきらめて、コードとgifの無数の変更の後、最終的に私が望むように働き始めました:P – kyrisu

関連する問題