私は、周りのコントロールを(おそらく同時に複数)エレガントにアニメーション化(変換、フェード)する方法を実装しようとしています。たとえば、左上隅に画像があり、右下隅にテキストボックスがあるとします。これらをウィンドウ上でスムーズにスライドさせ、場所を切り替えることができるようにしたいとします。私はしばらく働いていますが、これをスムーズにまたは簡単に達成するものは何も思いつきません。
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でコントロールをスライドするには、タイマーを使用して、コントロールのTop
および/またはLeft
プロパティを徐々に変更し、フォーム全体に移動できます。ただし、(AFAIK)削除できない厄介なちらつきが発生します。
あなたcould WinFormsでこれを行うには多大な労力が必要なので、WPF(基本的にはまさにこの種のもののために構築されています)を使用するための推奨事項を2番目に説明する必要があります。
WinFormsでこれを行う際の主な障害は、コントロールの場所が整数で指定されていることです。つまり、たとえば、コントロールのLeft
プロパティを45.3425
に設定することはできません。これにより、基本的にコントロールのスムーズなアニメーション(速度と方向を変更する動きが必要な場合)が完全に不可能になります。この方法では、避けられない動きのぎくしゃくした動きが発生します(私が試したので、知っています)。
SLaksが示唆したように、WinFormsでこれを行う唯一の方法は、各コントロールの「スナップショット」を撮って「偽造」することです。基本的に、フォームのBackColorで描画された、フォームのサイズの非表示のビットマップから始めます。次に、アニメーション化する各コントロールでDrawToBitmap()を呼び出して「スナップショット」を作成し、スナップショットをキャンバスに描画して移動効果を作成します(System.Drawing
は浮動小数点座標で画像を描画でき、回避します。整数位置のジャーキネス)。
しかし、これはあまりにもひどい仕事です。 WPFを使用するだけです。 :)
編集:実際にはeasy WinFormsでこのようなことをするのは、ひどくぎくしゃくしてアマチュアっぽく見えてもかまわない限りです。私の上記のコメントは、これを行うことの難しさについて言及していますwell。
組み込みのAnimateWindowを使用するというこの答えは、この目的にははるかに優れていると思います: C#でコントロールに移動効果を追加するにはどうすればよいですか?
各アイテムのx値とy値のコピーをfloatとして保存します。
タイマーを使用し、ティックごとに左上のアイテムのx位置とy位置に値を追加します。右下のアイテムのxとyから同じ値を引きます。
ここでは必ずキャッシュされたfloat値を使用してください。そうしないと、アイテムがフォームに再配置されたときに丸め誤差が発生する可能性があります。
画像/コントロールに使用している表面にペイントしている場合は、ティックごとに無効にします。
簡単なはずです。
編集:
透過的なコントロールについては、BobPowellのヒントとコツを確認してください。
http://www.bobpowell.net/transcontrols.htm
そして、これが半透明のコントロールを作成する方法についての彼自身の回答です:
http://www.mofeel.net/67-Microsoft-public-dotnet-framework-windowsforms-controls/4860.aspx