C#プログラミングTips

フェードイン/アウトするウィンドウを作るには

デジタルアドバンテージ
2001/05/30


 .NET Frameworkのベータ1では、ウィンドウを作成するためのFormクラスに、フォームの透明度が設定可能なOpacityプロパティが含まれている。このプロパティを利用すれば、半透明のウィンドウ(下にある背景が透けて見えるウィンドウ)を簡単に作ることができる。

 このOpacityプロパティを利用し、起動時にフェードインしながら徐々に現れ、ウィンドウを閉じるとフェードアウトしながら徐々に消えていくウィンドウを作ってみよう。まずは、このプログラムが起動する様子、そして起動後にウィンドウ右上のクローズ・ボタン(小さな×印のボタン)をクリックして、ウィンドウを閉じている様子を示す。

 なお、実行環境によっては今回のサンプル・プログラムは正しく動作しない可能性があるので注意が必要だ(マウス・カーソルに影がついている環境では動作するはずだ)。

フェードイン/フェードアウトするウィンドウ
画面はプログラムを起動し、起動後にウィンドウ右上のクローズ・ボタンをクリックして閉じている様子(実際にはもっと滑らかに動作する)。

 このサンプル・プログラムのソース・コードを次に示す。ファイル名はfade.csとした。

 1: // fade.cs
 2:
 3: using System;
 4: using System.WinForms;
 5: using System.ComponentModel;
 6:
 7: public class Fade : Form {
 8:
 9:   public Fade() {
10:     this.Text = "フェード・サンプル";
11:
12:     this.Opacity = 0;
13:     this.Visible = true;
14:
15:     for (int i = 0; i <= 100; i++) {
16:       this.Opacity = (double)i / 100;
17:     }
18:   }
19:
20:   protected override void OnClosing(CancelEventArgs e) {
21:     base.OnClosing(e);
22:     for (int i = 100; i >= 0; i--) {
23:       this.Opacity = (double)i / 100;
24:     }
25:   }
26:
27:   public static void Main() {
28:     Application.Run(new Fade());
29:   }
30: }  
fadeサンプル・プログラムのソース・コード

fade.csのダウンロード
コンパイル用バッチ・ファイル make.batのダウンロード

 このプログラムをコンパイルするには、コマンド・プロンプトから次のように指定する。

csc /r:Microsoft.Win32.Interop.DLL /r:System.DLL
  /r:System.WinForms.DLL fade.cs
fadeサンプル・プログラムのコンパイル方法

フェードイン時の処理

 Opacityプロパティは、double型で0から1までの間の値をとる。そしてこの値が0なら完全に透明なウィンドウ(つまり、まったく見えないウィンドウ)が、1なら透明でないウィンドウが表示される。通常のウィンドウでは、この値が1になっている。プログラムの起動時、ウィンドウが表示されるまでの間に、この値を0から1に小刻みに変化させていけば、フェードインしながらウィンドウが登場するようになる。次のリストはこの処理を行っている部分だけを抜き出したものだ。

 9: public Fade() {
       ・・・
12:   this.Opacity = 0;
13:   this.Visible = true;
14:
15:   for (int i = 0; i <= 100; i++) {
16:     this.Opacity = (double)i / 100;
17:   }
18: }
フェードインしながらウィンドウを表示するための処理

 今回のサンプル・プログラムでは、Formクラスから派生させて定義しているFadeクラスのコンストラクタでこの処理を行った。ここでポイントとなるのは12〜13行目で、ここではまずウィンドウの透明度であるOpacityプロパティを0(完全に透明)にし、さらにフォームの可視/不可視を示すVisibleプロパティをtrue(可視)に設定している。このコンストラクタが呼び出された時点では、通常これらの値はOpacity = 1、Visible = falseになっている。つまり、すでにウィンドウが作成されているが、表示はされていない状態となっているのである。そこでまず、透明なウィンドウを強制的に表示している。

 いったんウィンドウを透明な状態で表示すれば、後はOpacityプロパティが1になるまでループしながら値を増やしていくだけだ。ところで、プロパティに値を代入するだけで、その瞬間に実際のウィンドウの状態が更新されるということに新鮮さを感じるプログラマがいるかもしれない。これはVisual Basicではごく自然なことだが、これまでのCやC++を使ったプログラミングではできなかったことである。これはC#の「プロパティ」と呼ばれる機能によるものだ。ここでは詳細は述べないが、プロパティを使うと、フィールド(クラスやインスタンスがもつ変数)にアクセスされたときに実行される処理を記述することができる。Opacityプロパティに値を代入しているだけに見える処理も、その影ではウィンドウの更新等が実行されているのだ。

 なお、今回はVisibleプロパティをtrueに設定してウィンドウを表示したが、FormのShowメソッドを呼び出しても同様の処理を行えるようだ。

フェードアウト時の処理

 次は、ウィンドウを閉じるときにフェードアウトしながら消えていくための処理を説明しよう。今回のサンプル・プログラムでは、ウィンドウがクローズされる直前に呼び出されるFormクラスのOnClosingメソッドをオーバーライドして記述した。これを行っているのが次の部分である。

20: protected override void OnClosing(CancelEventArgs e) {
21:   base.OnClosing(e);
22:   for (int i = 100; i >= 0; i--) {
23:     this.Opacity = (double)i / 100;
24:   }
25: }
ウィンドウのクローズ時にフェードアウトさせるための処理

 OnClosingメソッドのパラメータは、System.ComponentModeネームスペースのCancelEventArgsオブジェクトである。今回のプログラムでは使用していないが、このオブジェクトのCancelプロパティをtrueに設定すれば(e.Cancel = trueとする)、ウィンドウがクローズされるのをキャンセルすることができる。例えばテキスト・エディタなどで、編集途中のデータを保存せずにウィンドウを閉じようとした場合のワーニング・メッセージなどはこのタイミングで表示することができる。

 OnClosingをオーバーライドする場合の注意点は、オーバーライドしているベース・クラスのメソッドを呼び出す必要がある点だ。これを行っているのが21行目のbase.OnClosing(e)である。その後は、起動時とは逆に、Opacityプロパティを1から0へと徐々に減らしていく。

イベント・ハンドラを用いたフェードアウト処理

 フェードアウト処理は、OnClosingメソッドのオーバーライドではなく、デリゲートによるイベント・ハンドラを作成して記述することもできる。デリゲートを用いたフェードアウト処理は次のようになる。

protected void fadeout(object s, CancelEventArgs e) {
  for (int i = 100; i >= 0; i--) {
    this.Opacity = (double)i / 100;
  }
}

public Fade() {
       ・・・
  this.Closing += new CancelEventHandler(fadeout);
       ・・・
}
イベント・ハンドラを用いたOnClosing時のフェードアウト処理

 このイベント・ハンドラの設定手順は、Windowsアプリケーションのスケルトンを知るの「ボタンのイベント・ハンドラ作成」で行ったボタンがクリックされたときの処理の記述とまったく同様だ。

 今回のプログラムに限って言えば、どちらの方法で記述してもたいした違いはない。今回オーバーライドを用いた理由は、若干プログラムがすっきりするのと、2つの方法があることを示したかったからだ。もちろんオーバーライドによる処理は派生クラスを定義したときにしか使用することができない。イベント・ハンドラを用いた場合では、1つのイベントに対して複数のイベント・ハンドラを容易に設定することができる。また、複数のイベントに対して、1つのイベント・ハンドラを設定することも容易だ。イベント・ハンドラに関するこのあたりの話題は、いずれ回を改めて紹介しよう。End of Article

「C#プログラミングTips」

 



Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間