C#メモ Windows API Code Packに入っているTaskDialogクラスを使って少しリッチなメッセージダイアログを表示してみる

C#

よく例外とかで表示されるあのダイアログってMessageBoxクラスより少しリッチでいいなぁ…。
でも、標準だとそれっぽいダイアログが表示できないし…どうやってやるんだろうって思ってネットに聞いてまわったらあるんだねぇ…。

ポイントはこんな感じ…そんなむずくない。

  • プロジェクトを開く(または新規作成する)
  • Windows API Code Packをインストールする
  • Microsoft.WindowsAPICodePack.Dialogs.TaskDialogクラスのShow()メソッドを使ってダイアログを表示する

まずはWindows API Code Packってのをインストールする。
こいつは基本的にはプロジェクト毎で使うっぽいのでプロジェクトを作成するところから始める。

  1. Visual Studioのメニューで"ファイル/新規作成/プロジェクト"をクリックする。
  2. ウィザードが起動する。
    とりあえず、今回は"Windows フォーム アプリケーション (.NET Framework)"ってテンプレート"を使うことにする。

    テンプレートを使って作ったプロジェクトはこんな感じ。

次にパッケージをダウンロードしてくる。

  1. Visual Studioのメニューで"表示/その他のウィンドウ/パッケージマネージャー コンソール"をクリックする。

    “パッケージ マネージャー コンソール"ってウィンドウが表示される。
  2. パッケージマネージャーコンソールってウィンドウはコマンドプロンプトみたいにキー入力できる

    入力するコマンドはこんな感じ。

    Install-Package WindowsAPICodePack-Core

    実行すると何やら"パッケージマネージャーコンソール"にメッセージが表示されてパッケージをダウンロードとかしてくるのでしばらく待っとく。

  3. ダウンロードとかが終わると"ソリューションエクスプローラー"に"packages.config"って項目が追加される。

    実際にはソリューションのフォルダーにpackagesってフォルダーが追加されていて…

    Windows API Code Packに関係するフォルダーやファイルが追加される。

    これでWindows API Code Packが使えるようになったっぽい。

とりあえず、コードはこんな感じ。
いろいろできるみたいだけど、まずはMessageBoxクラスに相当する感じで。

/// <summary>
/// フォームがロードされたときのイベント
/// </summary>
/// <param name="sender">イベントのオブジェクト</param>
/// <param name="arguments">イベントの引数</param>
private void OnLoad(object sender, EventArgs arguments)
{
	try
	{
		Microsoft.WindowsAPICodePack.Dialogs.TaskDialog dialog = new Microsoft.WindowsAPICodePack.Dialogs.TaskDialog();
		dialog.Caption = @"タスクダイアログのタイトル";
		dialog.InstructionText = @"概要を表示する感じかも";
		dialog.Text = "詳細なメッセージの内容を書く感じかも\nたぶん2行とかで表示する感じかな?";
		dialog.Icon = Microsoft.WindowsAPICodePack.Dialogs.TaskDialogStandardIcon.Information;
		dialog.StandardButtons = Microsoft.WindowsAPICodePack.Dialogs.TaskDialogStandardButtons.Ok | Microsoft.WindowsAPICodePack.Dialogs.TaskDialogStandardButtons.Cancel;
		dialog.Show();
	}
	catch (Exception exception)
	{
		MessageBox.Show(exception.Message);
	}
}

実行してみるとこんな感じ。
ちょっとリッチ?

ちなみに、コンソールアプリだと例外が表示されちゃう。
dllのバージョンが云々言ってるんだけど…ここの問題はあと回し…。

そんなこんなで、明日への自分へのメモってことで。