Formを半透明化するアニメーションコンポーネント

VS2008からインテリセンスの候補リストを表示している時にCtrlキーを押すと候補リストが半透明になる。この機能を自分のアプリケーションでも使いたくなったので作ってみたら案外簡単にできたので、この機能を再利用可能なコンポーネントにまとめてみた。

OpacityAnimation.cs

using System;
using System.Windows.Forms;
using System.ComponentModel;
using System.Diagnostics;

/// <summary>
/// 対象にしたFormでCtrlキーを押している間、Formを半透明化するアニメーションを実行するコンポーネントクラス
/// </summary>
public class OpacityAnimation : Component {
    /// <summary>
    /// アニメーションのタイマー
    /// </summary>
    private Timer timer;

    private Form targetForm;

    private int step = 25;
    private double toOpacity = 0.2;

    /// <summary>
    /// 対象のフォームを取得、設定します。
    /// </summary>
    [DefaultValue(null)]
    [Category("Behavior"), Description("アニメーション対象のフォームです。")]
    public Form TargetForm {
        get { return targetForm; }
        set {
            if(!this.DesignMode && targetForm != null) {
                targetForm.KeyDown -= new KeyEventHandler(targetForm_KeyDown);
                targetForm.KeyUp -= new KeyEventHandler(targetForm_KeyUp);
            }
            targetForm = value;

            if(!this.DesignMode && targetForm != null) {
                TargetForm.KeyPreview = true;
                targetForm.KeyDown += new KeyEventHandler(targetForm_KeyDown);
                targetForm.KeyUp += new KeyEventHandler(targetForm_KeyUp);
            }
        }
    }
    /// <summary>
    /// アニメーションのステップを取得、設定します。
    /// </summary>
    [DefaultValue(25)]
    [Category("Behavior"), Description("アニメーションのステップです。")]
    public int AnimationStep {
        get { return step; }
        set { step = value; }
    }
    /// <summary>
    /// 遷移先の不透明度を取得、設定します。
    /// </summary>
    [DefaultValue(0.2)]
    [Category("Behavior"), Description("アニメーション後の不透明度です。")]
    public double ToOpacity {
        get { return toOpacity; }
        set { toOpacity = value; }
    }

    /// <summary>
    /// 標準的なコンストラクタ
    /// </summary>
    public OpacityAnimation() {
    }
    /// <summary>
    /// コンテナを設定するコンストラクタ
    /// </summary>
    /// <param name="container">コンテナ</param>
    public OpacityAnimation(IContainer container) {
        container.Add(this);
    }

    /// <summary>
    /// キーが押された時
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void targetForm_KeyDown(object sender, KeyEventArgs e) {
        if(e.Control) {
            if(timer == null) {
                timer = new Timer();
                timer.Interval = AnimationStep;
                timer.Tick += (_sender, _e) => {
                    if(TargetForm.Opacity > ToOpacity) TargetForm.Opacity -= 0.01;
                };
                timer.Start();
            }
        } else {
            TargetForm.Opacity = 1.0;
        }
    }
    /// <summary>
    /// キーが離された時
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void targetForm_KeyUp(object sender, KeyEventArgs e) {
        if(timer != null) {
            timer.Stop();
            timer = null;
        }
        TargetForm.Opacity = 1.0;
    }
}

このコンポーネントツールボックスからFormにDrag&Dropして、TargetFormプロパティを設定すれば、Ctrlキーを押している間Formを半透明にするアニメーションが実行されるようになる。

たいした事はしてないけど、業務アプリケーションでもこういうエフェクトがあれば結構おもしろいかもしれない。