Windows 7のプログラミング:タスクバー。 パート5-CustomWindowsManager

Windows 7のタスクバーの可能性を引き続き検討します。同じアプリケーションを複数回実行すると、Windows 7がタスクバーの1つのボタンに自動的にグループ化することに気付いたでしょう。 また、このアプリケーションのアイコンにカーソルを合わせると、タスクバーにこれらのウィンドウのプレビューセットが表示されます。



ただし、Internet Explorer 8の開いているタブに対して同じ動作が実装されていることがわかります。この場合、IE8の1つのインスタンスが実際に起動され(技術的な詳細は省略)、多くのタブがあります。 この場合、Internet Explorerはそれらを複数のプレビューとして表示します。 この場合、非常に便利です。 タスクバーから、すぐに目的のタブに切り替えることができます。











ご想像のとおり、このような機能はアプリケーションに簡単に実装できます。 これは、ウィンドウに他のウィンドウのセットが含まれている場合に当てはまります(IE8の場合)。 これらの目的のために、.NET InteropサンプルライブラリにはCustomWindowsManagerクラスが含まれています。 そのようなアプリケーションの作成について詳しく見てみましょう。



したがって、まず最初に、アプリケーションを作成する必要があります。 このアプリケーションをMDIモードで動作させます。 私たちの目標は、このアプリケーションのすべての子ウィンドウがタスクバーにも表示されるようにすることです。 メインウィンドウと子ウィンドウを作成したら、最後のウィンドウを作成しましょう。



このウィンドウがすでに作成されていて準備ができているときに、ウィンドウを表示する時間が必要です。 OnShownイベントは、これらの目的に非常に適しています。 ハンドラーでは、CustomWindowsManagerオブジェクトのインスタンスを作成し、MDIモデルの観点から親ウィンドウだけでなく、子ウィンドウのハンドルを渡す必要があります。



CustomWindowsManager _windowsManager;



protected override void OnShown(EventArgs args)

{

_windowsManager =

CustomWindowsManager.CreateWindowsManager(Handle, MdiParent.Handle);

base.OnShown(args);

}








CustomWindowsManagerオブジェクトへのリンクを保存します。後で必要になります。 ただし、これらのアクションは正しい操作には不十分です。 まず、ThumbnailRequestedイベントをサブスクライブする必要があります。このイベントでは、タスクバーのポップアップ用のウィンドウの表示を含むビットマップを生成します。 次に、PeekRequestedイベントにサブスクライブする必要があります。PeekRequestedイベントでは、ウィンドウの表示を含むビットマップを生成し、タスクバーのウィンドウのプレビュー上にマウスカーソルを置いたときに選択します。



ThumbnailRequestedイベントには、BitmapRequestedEventArgs型のパラメーターが含まれています。 このオブジェクトは、タスクバーに表示されるものを制御します。 できる最も簡単なことは、UseWindowScreenshotパラメーターをtrueに設定することです。 この場合、参加せずにウィンドウのスクリーンショットが撮られます。 プレビューウィンドウに何らかの独自の画像を表示する場合は、ビットマップパラメータを使用して、表示するビットマップオブジェクトを配置できます。 ただし、このオブジェクトは厳密に指定された次元を持たなければならないことを理解する必要があります。 BitmapRequestedEventArgsからこれらのサイズを取得することもできます。



_windowsManager.ThumbnailRequested += (o, e) =>

{

Bitmap bmp = new Bitmap(e.Width, e.Height);

this.DrawToBitmap(bmp, new Rectangle(0, 0, e.Width, e.Height));

e.Bitmap = bmp;

};








ここでは、このオブジェクトが便利であるため、このオブジェクトを操作できることは明らかです。 たとえば、プレビューに画像をオーバーレイできます。



_windowsManager.ThumbnailRequested += (o, e) =>

{

Bitmap bmp = new Bitmap(e.Width, e.Height);

this.DrawToBitmap(bmp, new Rectangle(0, 0, e.Width, e.Height));

Graphics.FromImage(bmp).DrawImage(Images.coffeecup, 35, 5);

e.Bitmap = bmp;

};








PeekRequestedイベントは、タスクバーのプレビューにカーソルを合わせたときにウィンドウを強調表示することを目的としています。 タイプBitmapRequestedEventArgsのパラメーターもあります。 同様に、UseWindowScreenshotおよびBitmapプロパティを使用できます。



_windowsManager.PeekRequested += (o, e) =>

{

var result = new Bitmap(e.Width, e.Height);

DrawToBitmap(result, new Rectangle(0, 0, e.Width, e.Height));

e.Bitmap = result;

};








これらの例では、フォームのDrawToBitmapメソッドを使用しています。 ただし、他のコントロールのプレビューを表示できます。 たとえば、TextBoxを表示できます。



最後に、ウィンドウが閉じるときにWindowClosedメソッドを呼び出す必要があります。 OnClosedイベントはこれに適しています。



protected override void OnClosed(EventArgs e)

{

if (_windowsManager != null)

{

_windowsManager.WindowClosed();

}



base.OnClosed(e);

}








その後、次のアプリケーションを取得しました。











タスクバーを見ると、次のことがわかります。











ただし、フォームの外観を変更し始めると、プレビューが変更されていないことがわかります。 これは、Windows 7がプレビュー受信イベントを要求しなかったためです。 これは、ビデオなどの絶えず変化するコンテンツがフォームに含まれている場合に特に重要です。 この場合、プレビューの更新を強制する方法があります。 これを行うには、InvalidatePreviewsメソッドを呼び出します。



private void InvalidateButton_Click(object sender, EventArgs e)

{

_windowsManager.InvalidatePreviews();

}








いずれの場合も、このメソッドは適切なタイミングで呼び出す必要があります。 たとえば、TextBoxのテキストを更新する場合。 ビデオの場合、タイマーで呼び出すことをお勧めします。











これにより、アプリケーションの子ウィンドウの数を簡単かつ簡単に表示できます。



デモアプリケーション:

Taskbar-WindowsManager.zip



All Articles