Windows API Code Packによるアプリ開発 第13回 Windows 7 タスクバー ~タブ サムネイルのイベント処理~

Windows API Code Packによるアプリ開発 [TechED2010 ポストセッション]
第13回 Windows 7 タスクバー ~タブ サムネイルのイベント処理~

タブ サムネイルの実装には、サムネイルの数を増やすなどの見た目の部分の実装以外に、各サムネイルをクリックしたときなどのイベントに対応した処理の実装が必要になります。

前回の「タブ サムネイルの実装」では、見た目の部分の実装を行いました。
前回の実装で、一見サムネイルの追加に成功したように見えます。しかし、サムネイルに対する操作を行うと、対応するコードを用意していないため、動きが変になってしまいます。
今回は、イベントに対応する実装方法を紹介します。

[ イベントの種類 ]
タブ サムネイルを作成したとき、タブ サムネイルに対して発生する可能性があるイベントは、以下の5つのイベントです。
TabbedThumbnailActivated : サムネイルがクリックされたときに発生
TabbedThumbnailClosed : サムネイルの右上にある赤い X ボタンがクリックしたときに発生
TabbedThumbnailMaximized : サムネイル上で右クリックしたときに表示されるコンテキストメニューの[最大化]を選択したときに発生
TabbedThumbnailMinimized : サムネイル上で右クリックしたときに表示されるコンテキストメニューの[最小化]を選択したときに発生
TabbedThumbnailBitmapRequested : タブ サムネイルを最初に表示したときなどに発生

これらのイベントに対応するイベントハンドラを用意しない場合は、ユーザーが該当する操作を行っても、アプリケーションは反応しません。

[イベントハンドラの実装 ]
ここでは、TabbedThumbnailActivatedとTabbedThumbnailClosedのイベントに対応する処理を実装します。
まずは、これらの2つに対応するイベントハンドラを実装しましょう。

// サムネイルをクリックしたときのイベントハンドラ
void preview_TabbedThumbnailActivated(object sender, TabbedThumbnailEventArgs e)
{
foreach (TabPage page in tabControl1.TabPages)
{
if (page.Handle == e.WindowHandle)
{
// クリックされたサムネイルに該当するタブを選択された状態にする
tabControl1.SelectedTab = page;
TaskbarManager.Instance.TabbedThumbnail.SetActiveTab(page);
}
}
}

// サムネイルを閉じたきのイベントハンドラ
void preview_TabbedThumbnailClosed(object sender, TabbedThumbnailEventArgs e)
{
foreach (TabPage page in tabControl1.TabPages)
{
if (page.Handle == e.WindowHandle)
{
// タブコントロール上の該当するタブを削除する
tabControl1.TabPages.Remove(page);
page.Dispose();
break;
}
}

TabbedThumbnail tabbedThumbnail = sender as TabbedThumbnail;
if (tabbedThumbnail != null)
{
// 追加していたイベントハンドラを削除する
tabbedThumbnail.TabbedThumbnailActivated -= (preview_TabbedThumbnailActivated);
tabbedThumbnail.TabbedThumbnailClosed -= (preview_TabbedThumbnailClosed);
}
}

そして、イベントハンドラを追加します。
以下のコードは、前回の記事にあるソースコードの、「サムネイルに対して操作を行った時のイベントハンドラをここで追加」というコメントの下に記述してください。

// サムネイルに対して操作を行った時のイベントハンドラをここで追加
preview.TabbedThumbnailActivated += preview_TabbedThumbnailActivated;
preview.TabbedThumbnailClosed += preview_TabbedThumbnailClosed;

TabbedThumbnailActivatedに対応したイベントハンドラでは、クリックされたサムネイルがどのタブのページに対応するものかを検索し、そのタブをアクティブにしています。
TabbedThumbnailClosedに対応したイベントハンドラでは、タブコントロールから X ボタンがクリックされたタブを削除し、タブ サムネイル用に追加いていたイベントハンドラも削除しています。

次回は、サムネイルのクリッピングについて説明します。

[ 参考資料 ]
TechEDでのビデオとスライド
https://msdn.microsoft.com/ja-jp/events/ff973814.aspx
内容を早く知りたい方や、デモを確認されたい方は、ビデオをご覧ください。
本連載は、Code Packのバージョン1.1を元に説明しています。
TechEDでは、当時の最新バージョンである1.01を元に説明しました。
内容はほぼ同じですが、クラス名など一部に小さな違いがあることがあります。

[Windows API Code Packのダウンロード ]https://code.msdn.microsoft.com/WindowsAPICodePack

このページの右上にある、「Current Release」と書かれた部分のすぐ下にあるリンクをクリックすると、ダウンロードページに飛びます。

[Windows API Code PackによるWindowsアプリ開発 / TechEDポストセッション ]
第1回 : Windows API Code Packとは
第2回 : アプリケーションの再起動と修復その1
第3回 : アプリケーションの再起動と修復その2
第4回 : 電源の状況の把握
第5回 : Windows 7 タスクバー ~アイコンオーバーレイ~
第6回 : Windows 7 タスクバー ~進行状況バー ( プログレス バー )
第7回 : Windows 7 タスクバー ~サムネイルツールバー その1
第8回 : Windows 7 タスクバー ~サムネイルツールバー その2
第9回 : Windows 7 タスクバー ~サムネイルについて知っておくべきこと~
第10回 : Windows 7 タスクバー ~アプリケーションユーザー モデル ID (AppID)
第11回 : Windows 7 タスクバー ~タブに対応したサムネイル~
第12回 : Windows 7 タスクバー ~タブ サムネイルの実装~
第13回 : Windows 7 タスクバー ~タブサムネイルのイベント処理~

番外編 : Windowsフォームアプリによる電源の状況の把握
番外編1 : アプリをクラッシュさせるには
番外編2 : シューティングゲームにタスクバーの機能を追加
サムネイルのあとは、ジャンプリストの説明を行います。

マイクロソフト
田中達彦