Windowsアプリケーションで「読み込んでいます……」といった実行中の処理内容を簡潔に表示する場合、「タイトルバーのないダイアログ」を用いるという方法がある。C#およびVB.NETでのダイアログ作成方法を紹介する。
Windowsアプリケーションで現在実行中の処理の概要(例えば、「読み込んでいます……」)などを簡潔にユーザーに提示したい場合に、「タイトルバーのないダイアログ」を用いるケースがある。本稿では、そのようなダイアログの作成方法を紹介する。
具体的には、次のようなダイアログを作成する。
このようなダイアログを作成するには、最初に、そのダイアログとなるWindowsフォームの外観を、(通常のウィンドウから)「タイトルバーのないウィンドウ」に変更する。
具体的には、フォームのFormBorderStyleプロパティを「None」(=System.Windows.Forms名前空間のFormBorderStyle列挙体の値)に設定する。次の画面は、この作業をVisual Studio .NET(以降、VS.NET)で行っている例である。
この作業により、フォームはタイトルバーのないウィンドウになった。
しかしこれだけでは、フォームの外側に境界線が存在しないため、ほかのウィンドウと重なったときにその境界が分かりにくいし、第一、このフォームはダイアログには見えない。通常、Windowsのユーザー・インターフェイスでダイアログといえば、ウィンドウの境界が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
この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
以上でダイアログの実装は完了だ。
ダイアログ全体のソース・コードは次のリンクからダウンロードできる。
後はこのダイアログを(モードレスで)呼び出すためのコードを記述すればよいが、その詳細は(たいして難しくないので)割愛する。冒頭に示したサンプル・プログラムのソース・コードについては、次のリンクからダウンロードできる。
グラフィカルな2D形式のダイアログを実装する場合には
本稿では、通常のウィンドウと同じような境界線が3D表示のダイアログの実装例を示したが、次の画面のような、グラフィカルな(境界線が)2D表示のダイアログを使いたい場合もあるかもしれない。
このようなユーザー・インターフェイスのダイアログを作成する方法については、「TIPS:Windowsアプリケーションでスプラッシュ・スクリーンを表示するには?」が参考になるため、詳しくはそちらを参照してほしい。
カテゴリ:Windowsフォーム 処理対象:ダイアログ
使用ライブラリ: FormBorderStyle列挙体(System.Windows.Forms名前空間)
使用ライブラリ:CreateParamsクラス(System.Windows.Forms名前空間)
関連TIPS:Windowsアプリケーションでスプラッシュ・スクリーンを表示するには?
Copyright© Digital Advantage Corp. All Rights Reserved.