タイトルバーのないダイアログを作成するには?.NET TIPS

Windowsアプリケーションで「読み込んでいます……」といった実行中の処理内容を簡潔に表示する場合、「タイトルバーのないダイアログ」を用いるという方法がある。C#およびVB.NETでのダイアログ作成方法を紹介する。

» 2005年07月22日 05時00分 公開
[一色政彦デジタルアドバンテージ]
「.NET TIPS」のインデックス

連載目次

 Windowsアプリケーションで現在実行中の処理の概要(例えば、「読み込んでいます……」)などを簡潔にユーザーに提示したい場合に、「タイトルバーのないダイアログ」を用いるケースがある。本稿では、そのようなダイアログの作成方法を紹介する。

 具体的には、次のようなダイアログを作成する。

タイトルバーのないダイアログの表示例 タイトルバーのないダイアログの表示例
実行中の処理概要(この例では「読み込んでいます……」)などを簡潔にユーザーに提示したい場合に、このような「タイトルバーのないダイアログ」を用いるケースがある。
  (1)[タイトルバーのないダイアログを表示]ボタンをクリックする。これによりダイアログが表示される。
  (2)タイトルバーのないダイアログが表示される。このダイアログでは、タイトルバーがないだけでなく、ウィンドウの境界線が3D形式、つまり盛り上がった感じのウィンドウになっていることに注目していただきたい。

 このようなダイアログを作成するには、最初に、そのダイアログとなるWindowsフォームの外観を、(通常のウィンドウから)「タイトルバーのないウィンドウ」に変更する。

タイトルバーのないウィンドウを作成する

 具体的には、フォームのFormBorderStyleプロパティを「None」(=System.Windows.Forms名前空間のFormBorderStyle列挙体の値)に設定する。次の画面は、この作業をVisual Studio .NET(以降、VS.NET)で行っている例である。

VS.NETによるタイトルバーのないウィンドウの作成手順 VS.NETによるタイトルバーのないウィンドウの作成手順
Windowsフォームをタイトルバーのないウィンドウに変更する。
  (1)Windowsフォーム・デザイナでフォームをクリックして選択する。
  (2)[プロパティ]ウィンドウで[FormBorderStyle]プロパティの値を「None」に設定する。

 この作業により、フォームはタイトルバーのないウィンドウになった。

 しかしこれだけでは、フォームの外側に境界線が存在しないため、ほかのウィンドウと重なったときにその境界が分かりにくいし、第一、このフォームはダイアログには見えない。通常、Windowsのユーザー・インターフェイスでダイアログといえば、ウィンドウの境界が3Dで盛り上がったような形状になっているが、このダイアログにはその3Dの境界線がないためだ。

 そこで次に、このタイトルバーのないウィンドウに、3Dの境界線を持たせることにしよう。

タイトルバーのないウィンドウに3Dの境界線を持たせる

 これを行うには、フォームのCreateParamsプロパティをオーバーライドし、そのプロパティの中で、基本クラスのCreateParamsオブジェクト(System.Windows.Forms名前空間)を取得して、そのオブジェクトのExStyleプロパティに「WS_EX_DLGMODALFRAME」(=C#では「0x00000001」、VB.NETでは「&H1」という数値と同等)を追加設定すればよい(再設定するのではなくて、設定を追加するだけなので、注意すること)。具体的には、次のようなコードになる。

protected override CreateParams CreateParams
{
  get
  {
    const int WS_EX_DLGMODALFRAME = 0x00000001;
    CreateParams cp = base.CreateParams;
    cp.ExStyle = cp.ExStyle | WS_EX_DLGMODALFRAME;
    return cp;
  }
}

Protected Overrides ReadOnly Property CreateParams() As System.Windows.Forms.CreateParams
  Get
    Const WS_EX_DLGMODALFRAME As Integer = &H1
    Dim cp As CreateParams = MyBase.CreateParams
    cp.ExStyle = cp.ExStyle Or WS_EX_DLGMODALFRAME
    Return cp
  End Get
End Property

タイトルバーのないウィンドウに3Dの境界線を持たせるコード(上:C#、下:VB.NET)
フォームのCreateParamsプロパティをオーバーライドして、基本クラスのCreateParamsオブジェクトのExStyleプロパティに「WS_EX_DLGMODALFRAME」を追加設定する(= |演算子(C#)/Or演算子(VB.NET)により、既存のプロパティ値との「ビットごとの論理和」(=OR)を求めて、算出された値をプロパティに代入する)。このWS_EX_DLGMODALFRAMEの追加設定により、3Dの境界線が描かれるようになる。

 このWS_EX_DLGMODALFRAMEの追加設定により、3Dの境界線が描かれるようになる。これでダイアログのユーザー・インターフェイスの実装については完了だ。

 しかしこのままでは、[Alt]+[F4]キーというシステム・ショートカット・キーが押された場合、ダイアログが閉じられてしまう。タイトルバーのないダイアログでは、ユーザーにダイアログを閉じさせたくないケースの方が多いだろう(タイトルバーがないということは、通常のウィンドウの右上にある[×]ボタンもないので、基本的にユーザーが閉じるためのインターフェイスは存在しないことになるのだから)。

 そこで最後に、このようにしてダイアログが閉じられるのを阻止するためのコードも実装しておくことにしよう。

システム・ショートカット・キーによりダイアログが閉じられるのを阻止する

 これを実装する方法はいくつか考えられるが、ここではごくシンプルに、[Alt]+[F4]キーが押されたときに発行される、Windowsメッセージ(具体的には「WM_SYSCOMMAND」)をハンドルして、さらにその詳細なメッセージ(=システムコマンド・メッセージ)の内容が「ウィンドウを閉じる」というメッセージ(具体的には「SC_CLOSE」)の場合には、その動作をそこでストップするようにしよう(「WM_SYSCOMMAND」と「SC_CLOSE」の2つのメッセージの組み合わせが、[Alt]+[F4]キーが押されたときに発行される)。

 実際にこれをコードで記述するには、フォームのWndProcメソッドをオーバーライドして、WndProcメソッドに送られてきたWindowsメッセージが「WM_SYSCOMMAND」で、かつそのシステムコマンド・メッセージの内容が「SC_CLOSE」の場合には何も行わないようすればよい(それ以外のメッセージについては、Windows標準の処理を行うために、基本クラスのWndProcメソッドを呼び出す)。具体的には次のようなコードになる。

protected override void WndProc(ref Message m)
{
  const int WM_SYSCOMMAND = 0x0112;
  const int SC_CLOSE = 0xF060;

  if ((m.Msg == WM_SYSCOMMAND) && (m.WParam.ToInt32() == SC_CLOSE))
  {
    return// Windows標準の処理は行わない
  }
  base.WndProc(ref m);
}

Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
  Const WM_SYSCOMMAND As Integer = &H112
  Const SC_CLOSE As Integer = &HF060
  If (m.Msg = WM_SYSCOMMAND) AndAlso (m.WParam.ToInt32() = SC_CLOSE) Then
    Return  ' Windows標準の処理は行わない
  End If
  MyBase.WndProc(m)
End Sub

システム・ショートカット・キーによるダイアログの終了を阻止するコード(上:C#、下:VB.NET)
フォームのWndProcメソッドをオーバーライドして、Windowsメッセージが「WM_SYSCOMMAND」で、かつそのシステムコマンド・メッセージの内容が「SC_CLOSE」の場合に、基本クラスのWndProcメソッドの処理を呼び出さないようにする。

 以上でダイアログの実装は完了だ。

ソース・ファイルのダウンロード

 ダイアログ全体のソース・コードは次のリンクからダウンロードできる。

 後はこのダイアログを(モードレスで)呼び出すためのコードを記述すればよいが、その詳細は(たいして難しくないので)割愛する。冒頭に示したサンプル・プログラムのソース・コードについては、次のリンクからダウンロードできる。

 グラフィカルな2D形式のダイアログを実装する場合には

 本稿では、通常のウィンドウと同じような境界線が3D表示のダイアログの実装例を示したが、次の画面のような、グラフィカルな(境界線が)2D表示のダイアログを使いたい場合もあるかもしれない。

グラフィカルな2D形式のダイアログの例 グラフィカルな2D形式のダイアログの例
Windows XPのコントロール・パネルにある[画面]のプロパティで、テーマを変更すると提示される(境界線が)2D表示のウィンドウ。

 このようなユーザー・インターフェイスのダイアログを作成する方法については、「TIPS:Windowsアプリケーションでスプラッシュ・スクリーンを表示するには?」が参考になるため、詳しくはそちらを参照してほしい。

カテゴリ:Windowsフォーム 処理対象:ダイアログ
使用ライブラリ: FormBorderStyle列挙体(System.Windows.Forms名前空間)
使用ライブラリ:CreateParamsクラス(System.Windows.Forms名前空間)
関連TIPS:Windowsアプリケーションでスプラッシュ・スクリーンを表示するには?


「.NET TIPS」のインデックス

.NET TIPS

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。