DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

タスクトレイのアイコンをアニメーション表示する

タスクトレイにアイコンを表示する方法は、「タスクトレイにアイコンを表示する」で紹介しました。ここでは、タスクトレイのアイコンをアニメーションで表示する方法を説明します。

タスクトレイにアイコンを表示する」の方法が理解できていれば、これは簡単です。NotifyIconオブジェクトのIconプロパティをタイマーを使って変更させるだけです。

以下に、具体的な例を示します。

  1. タスクトレイにアイコンを表示する」で紹介したのと同じように、NotifyIconコンポーネントをフォームに配置します。ここでは、このNotifyIconの名前を"NotifyIcon1"とします。
  2. Timerコンポーネント(System.Windows.Forms.Timerクラス)をフォームに配置します。ここでは、このTimerの名前を"Timer1"とします。
  3. さらに、"Button1"という名前のButtonコントロールも配置します。
  4. フォームのクラスに以下のようなコードを記述します。ここでは、アニメしていない時にタスクトレイに表示するアイコンをフォームのIconプロパティと同じにしています。また、アニメーションに使うアイコンは、Icon型の配列であるtasktrayIconsフィールドに格納しています。
    VB.NET
    コードを隠すコードを選択
    'タスクトレイにアニメで表示するアイコン
    Private tasktrayIcons() As Icon
    'アニメで現在表示しているアイコンのインデックス
    Private currentTasktrayIconIndex As Integer
    
    'フォームのLoadイベントハンドラ
    Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) _
            Handles MyBase.Load
        'タスクトレイアイコンをフォームのアイコンにする
        Me.NotifyIcon1.Icon = Me.Icon
        Me.NotifyIcon1.Visible = True
        'タイマーを無効にしておく(初めはアニメしない)
        Me.Timer1.Enabled = False
        'アニメ時は、1秒毎にアイコンを変更する
        Me.Timer1.Interval = 1000
    
        'タスクトレイにアニメで表示するアイコンを指定する
        Me.currentTasktrayIconIndex = 0
        Me.tasktrayIcons = New Icon() { _
            New Icon("C:\anime1.ico"), _
            New Icon("C:\anime2.ico"), _
            New Icon("C:\anime3.ico"), _
            New Icon("C:\anime4.ico")}
    
        'イベントハンドラへの関連付け
        AddHandler Button1.Click, AddressOf Button1_Click
        AddHandler Timer1.Tick, AddressOf Timer1_Tick
    End Sub
    
    'Button1のClickイベントハンドラ
    Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs)
        Me.currentTasktrayIconIndex = 0
    
        'タイマーが動いている時は止め、止まっているときは動かす
        Me.Timer1.Enabled = Not Me.Timer1.Enabled
    
        If Me.Timer1.Enabled Then
            'アニメを開始したときは、初めのアイコンを表示する
            Me.ChangeAnimatedTasktrayIcon()
        Else
            'アニメが終了した時は、アイコンを元に戻す
            Me.NotifyIcon1.Icon = Me.Icon
        End If
    End Sub
    
    'Timer1のTickイベントハンドラ
    Private Sub Timer1_Tick(ByVal sender As Object, ByVal e As EventArgs)
        Me.ChangeAnimatedTasktrayIcon()
    End Sub
    
    'アニメ表示時にタスクトレイアイコンを変更する
    Private Sub ChangeAnimatedTasktrayIcon()
        'タスクトレイアイコンを変更する
        Me.NotifyIcon1.Icon = Me.tasktrayIcons(Me.currentTasktrayIconIndex)
    
        '次に表示するアイコンを決める
        Me.currentTasktrayIconIndex += 1
        If Me.currentTasktrayIconIndex >= Me.tasktrayIcons.Length Then
            Me.currentTasktrayIconIndex = 0
        End If
    End Sub
    
    C#
    コードを隠すコードを選択
    //タスクトレイにアニメで表示するアイコン
    private Icon[] tasktrayIcons;
    //アニメで現在表示しているアイコンのインデックス
    private int currentTasktrayIconIndex;
    
    //フォームのLoadイベントハンドラ
    private void Form1_Load(object sender, EventArgs e)
    {
        //タスクトレイアイコンをフォームのアイコンにする
        this.NotifyIcon1.Icon = this.Icon;
        this.NotifyIcon1.Visible = true;
        //タイマーを無効にしておく(初めはアニメしない)
        this.Timer1.Enabled = false;
        //アニメ時は、1秒毎にアイコンを変更する
        this.Timer1.Interval = 1000;
    
        //タスクトレイにアニメで表示するアイコンを指定する
        this.currentTasktrayIconIndex = 0;
        this.tasktrayIcons = new Icon[] {
            new Icon(@"C:\anime1.ico"),
            new Icon(@"C:\anime2.ico"),
            new Icon(@"C:\anime3.ico"),
            new Icon(@"C:\anime4.ico")};
    
        //イベントハンドラへの関連付け
        Button1.Click += new EventHandler(Button1_Click);
        Timer1.Tick += new EventHandler(Timer1_Tick);
    }
    
    //Button1のClickイベントハンドラ
    private void Button1_Click(object sender, EventArgs e)
    {
        this.currentTasktrayIconIndex = 0;
    
        //タイマーが動いている時は止め、止まっているときは動かす
        this.Timer1.Enabled = !this.Timer1.Enabled;
    
        if (this.Timer1.Enabled)
        {
            //アニメを開始したときは、初めのアイコンを表示する
            this.ChangeAnimatedTasktrayIcon();
        }
        else
        {
            //アニメが終了した時は、アイコンを元に戻す
            this.NotifyIcon1.Icon = this.Icon;
        }
    }
    
    //Timer1のTickイベントハンドラ
    private void Timer1_Tick(object sender, EventArgs e)
    {
        this.ChangeAnimatedTasktrayIcon();
    }
    
    //アニメ表示時にタスクトレイアイコンを変更する
    private void ChangeAnimatedTasktrayIcon()
    {
        //タスクトレイアイコンを変更する
        this.NotifyIcon1.Icon = this.tasktrayIcons[this.currentTasktrayIconIndex];
    
        //次に表示するアイコンを決める
        this.currentTasktrayIconIndex++;
        if (this.currentTasktrayIconIndex >= this.tasktrayIcons.Length)
            this.currentTasktrayIconIndex = 0;
    }
    
  5. 以上で、Button1をクリックするとアニメを開始し、もう一度クリックするとアニメが終了します。
補足:上記の例ではアイコンをファイルから読み込んでいますが、通常はアイコンをリソースとして用意して使うほうがよいでしょう。リソースについては、「Visual Studioでリソースを管理する」などをご覧ください。

注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。

  • イベントハンドラの意味が分からない、C#のコードをそのまま書いても動かないという方は、こちらをご覧ください。
  • Windows Vista以降でUACが有効になっていると、ファイルへの書き込みに失敗する可能性があります。詳しくは、こちらをご覧ください。
  • .NET Tipsをご利用いただく際は、注意事項をお守りください。