以前にこれと同様のことを行い、GDI+ を使用して実装しました。
ボタンは、描画メソッドで 2 つのことを行う必要があります。
- 透明度を考慮せずにデフォルトのボタンを描画します。
- 指定されたアルファでマウスオーバー画像を描画します。
BackgroundWorker を使用して、スムーズなアニメーションを実現します。したがって、マウスオーバーで BackgroundWorker を開始し、Alpha が 1.0f に達するまで実行します。マウスがボタンから離されると、ワーカーはアルファが 0.0f に達するまで減らす必要があります。BackgroundWorker が何をすべきかを理解できるように、fadingin という変数を用意します。マウス インおよびマウス アウト イベントは、fadingin を true または false に適切に設定し、BackgroundWorker を開始する必要があります (まだ実行されていない場合)。
BackgroundWorkers の DoWork メソッドは次のようになります。
void backgroundWorker_DoWork(object sender, DoWorkEventArgs e) {
long ticks1 = 0;
long ticks2 = 0;
double interval = (double)Stopwatch.Frequency / 60;
while (true) {
ticks2 = Stopwatch.GetTimestamp();
if (ticks2 >= ticks1 + interval) {
ticks1 = Stopwatch.GetTimestamp();
if(_fadeIn){
_fadeAlpha += 0.1f;
if(_fadeAlpha > 1f){
_fadeAlpha = 1f;
break;
}
}else{
_fadeAlpha -= 0.1f;
if(_fadeAlpha < 0f){
_fadeAlpha = 0f;
break;
}
}
backgroundWorker.ReportProgress(0);
}
Thread.Sleep(1);
}
backgroundWorker.ReportProgress(0);
}
ここでのストップウォッチとループ構造により、アニメーションは 60fps アニメーションを目指します。
backgroundWorker ProgressChanged は、ColorMatrix を適切なアルファ値に変更し、ColorMatrix を ImageAttributes にバインドし、Invalidate を呼び出してコントロールを無効にする必要があります。これは、GUI の再描画が BackgroundWorker スレッドではなくメイン スレッドから要求されるようにするために実行する必要があります。これを DoWork から直接行うと、描画操作の実行中に ImageAttributes を変更しようとすると例外が発生します。
これが、ボタンでスムーズなアニメーションを作成するのに役立つことを願っています。