私は、エレガントに(同時に複数の可能性がある)コントロールをアニメーション化(変換、フェード)する方法を実装しようとしています。たとえば、左上隅に画像があり、右下隅にテキスト ボックスがあるとします。それらをウィンドウ上でスムーズにスライドさせて場所を切り替えられるようにしたいと考えています。私はしばらく取り組んできましたが、これをスムーズに、または簡単に達成できるものは思いつきませんでした。
5 に答える
Google Codeのdot-net-transitionsプロジェクトを確認してください。ここに Githubのクローンがあります。として nuget でも利用できますdot-net-transitions
。波紋などのより複雑な効果に使用できる複合トランジションを含む、さまざまな線形/非線形トランジションをサポートしています。
目的の動作を示す実際のサンプルを次に示します。
var pictureBox = new PictureBox
{
ImageLocation = "http://icons2.iconarchive.com/icons/klukeart/summer/128/hamburger-icon.png",
SizeMode = PictureBoxSizeMode.AutoSize
};
var textBox = new TextBox
{
Text = "Hello World",
Location = new Point(140, 140)
};
var form = new Form
{
Controls =
{
textBox,
pictureBox
}
};
form.Click += (sender, e) =>
{
// swap the Left and Top properties using a transition
var t = new Transition(new TransitionType_EaseInEaseOut(1000));
t.add(pictureBox, "Left", textBox.Left);
t.add(pictureBox, "Top", textBox.Top);
t.add(textBox, "Left", pictureBox.Left);
t.add(textBox, "Top", pictureBox.Top);
t.run();
};
form.ShowDialog();
WPF に切り替えることをお勧めします。それははるかに簡単になります。
WinForms でコントロールをフェードすることは完全に不可能です。Windows コントロールには不透明度を設定できません。
最も近い方法は、フォーム上のコントロールとその領域をビットマップのペアにレンダリングし、ColorMatrix を使用して PictureBox でビットマップをクロスフェードすることです。
WinForms でコントロールをスライドするには、Timer を使用して、コントロールのTop
および/またはLeft
プロパティを徐々に変更し、フォーム上で移動できます。ただし、(私の知る限り)除去することは不可能な、厄介なちらつきが発生します。
これは WinForms で行うことができますが、多大な労力が必要になるため、WPF を使用するように推奨する必要があります (これは本質的に、まさにこの種のことのために構築されています)。
WinForms でこれを行う際の主な障害は、コントロールの場所が整数で指定されているという事実です。つまり、コントロールのLeft
プロパティを に設定することはできません45.3425
。これにより、基本的にコントロールのスムーズなアニメーションが完全に不可能になります (速度と方向を変更する動きが必要であると仮定します)。
SLaks が示唆したように、WinForms でこれを行う唯一の方法は、各コントロールの「スナップショット」を取得して「偽造」することです。基本的に、フォームの BackColor で描画された、フォームのサイズの非表示のビットマップから始めます。次に、アニメーション化する各コントロールで DrawToBitmap() を呼び出して「スナップショット」を作成し、スナップショットをキャンバスに描画して移動効果を作成します (System.Drawing
浮動小数点座標で画像を描画し、整数位置のぎくしゃくした動きを回避できます)。 .
しかし、これはあまりにも面倒な作業です。WPFを使用するだけです。:)
編集: WinForms でこのようなことを行う のは実際には簡単であることに言及する必要があります。私の上記のコメントは、これをうまく行うことの難しさについて言及しています。
この目的には、組み込みの AnimateWindow を使用するというこの回答の方がはるかに優れている と思います。C# でコントロールに移動効果を追加するにはどうすればよいですか?
各項目の x 値と y 値のコピーを float として保存します。
タイマーを使用し、ティックごとに左上のアイテムの x および y 位置に値を追加します。右下の項目の x と y から同じ値を引きます。
ここでは必ずキャッシュされた float 値を使用してください。そうしないと、項目がフォーム上で再配置されたときに丸めエラーが発生する可能性があります。
画像/コントロールに使用している表面にペイントしている場合は、ティックごとに無効にします。
簡単なはずです。
編集:
透過的なコントロールについては、Bob Powell の Tips & Tricks を参照してください。
https://web.archive.org/web/20141227200000/http://bobpowell.net/transcontrols.aspx
そして、半透明のコントロールを作成する方法についての彼自身の回答は次のとおりです。
http://www.mofeel.net/67-microsoft-public-dotnet-framework-windowsforms-controls/4860.aspx