このようにして、ユーザーからの対応を要する情報を上品に表示するMessengerスタイルの通知を作成できる(リスト3)。
さらに、Messenger APIを使ってアラートを取り込むこともでき、Microsoft Alerts SDKを使うこともできる。しかしながら、これは少しより多くの作業を必要とするだけで、Windowsフォームにスパイスを加えるということと本質的に同じだ。
Messengerスタイルの通知の作成は、Outlook 2003スタイルの通知の作成とほとんど同じだ。唯一の違いは、フォームがどのようにポップアップするか、そして、それがどこからポップアップするかという点だ。デスクトップ作業域を計算し、それに基づいた高さと幅をベースとしてフォームを読み込むためには、WorkingArea.Sizeプロパティを使う。
リスト3■Messengerスタイルの通知を作る(C#) |
private void PopUp_Load(object sender, System.EventArgs e) { Size desktopSize; desktopSize = System.Windows.Forms.SystemInformation. WorkingArea.Size; int height = desktopSize.Height + this.Size.Height; int width = desktopSize.Width; this.SetDesktopLocation(height, width); pop.Enabled = true; pop.Interval = 50; pop.Start(); pop.Tick += new EventHandler(pop_Tick); } private void pop_Tick(object sender, EventArgs e) { Size desktopSize; desktopSize = System.Windows.Forms.SystemInformation. WorkingArea.Size; int height = desktopSize.Height; if(this.Top >= desktopSize.Height - this.Size.Height) this.Top -= 10; else unPop(); } private void unPop() { pop.Stop(); pop.Dispose(); Timer downPop = new Timer(); downPop.Interval = 50; downPop.Start(); downPop.Tick += new EventHandler(downPop_Tick); } private void downPop_Tick(object sender, EventArgs e) { Size desktopSize; desktopSize = System.Windows.Forms.SystemInformation. PrimaryMonitorSize; if(this.Top <= desktopSize.Height) this.Top += 10; else this.Close(); } |
フォーム上で、コントロールを動かしたりサイズを変更したりドッキングしたりできるようにする仕組みは、パワーユーザーにとって必須の機能といえよう。
そうとはいえ、ユーザーがボタンやラベルをフォームに沿って動かしたり、サイズを変更したりできることを望むわけではない。そうではなく、コンテナコントロールをフォームに沿って移動したりドッキングしたり、サイズを変更したりできるようにしたい。
コンテナコントロールは、PictureBoxだったり、Panelだったり、GroupBoxだったりする。これらは、他のコントロールを含むコントロールだ。
Windowsフォームのなかのコンテナ(およびフォーム自身)の便利な点は、ドッキング処理の複雑さの一部を自動的に扱ってくれるという点だ。Windowsフォームにドッキング可能なパネルを作るため、Panelクラスから継承したDockingControlと名付けたコントロールを作っていこう。DockingControlでは、パネルの移動やドッキングの複雑さを処理するようにする。
新しいWindowsコントロールライブラリを作成し、必要な名前空間を参照するためにImportsステートメントを追加し、Panelクラスから継承するように変更してほしい。
Imports System.Windows.Forms Imports System.Drawing Imports System.Drawing.Drawing2D Public Class DockingControl Inherits System.Windows.Forms.Panel |
フォームに沿ってドラッグできるDockingControlは、不定形なフォームをドラッグするのと同じコードで実現できる。ただし、ここではC#の代わりにVB.NETでコーディングした。したがってわずかな文法上の違いがある(リスト4)。
フォームに沿ってドラッグできるDockingControlのコードは、不定形なフォームをデスクトップ上でドラッグするのと同じコードで実現できる。DockingControlはC#の代わりにVB.NETで書いてある。したがって、文法上のわずかな違いがある。
リスト4■ドラッグコントロール(VB.NET) |
Protected Overrides Sub OnMouseMove _ (ByVal e As _ System.Windows.Forms.MouseEventArgs) If _dragging = True Then MyBase.Left = e.X + MyBase.Left - _offSetX MyBase.Top = e.Y + MyBase.Top - _offSetY End If End Sub Protected Overrides Sub OnMouseUp _ (ByVal e As _ System.Windows.Forms.MouseEventArgs) _dragging = False _resizing = False End Sub Protected Overrides Sub OnMouseDown _ (ByVal e As _ System.Windows.Forms.MouseEventArgs) _dragging = True _offSetX = e.X _offSetY = e.Y End Sub |
それでは、フォームの縁にコントロールをドッキングできるようにしていこう。そのためには、フォームの縁を絶えず調べるために、MouseMoveイベントのコードを修正する。
次のようにすれば、いったんコントロールが格納された縁(この縁はフォームあるいは、ほかのドッキングされたコントロールの縁)の位置内に入った時、パネルを適所に自動的にドッキング処理する。
If MyBase.Left < 1 Then MyBase.Dock = DockStyle.Left _dragging = False ElseIf MyBase.Top < 1 Then MyBase.Dock = DockStyle.Top _dragging = False ElseIf ' 中略(訳注:右端、下端に達したときのコードを入れることになる) End If |
コントロールのドッキングを解くには、パネルがドラッグされており、すでにドッキングされているかどうかを確認する必要がある。そして、コントロールを前の大きさに戻し、ほかのものに自動的にドッキングされないように、コントロールが格納されている縁から十分遠くに移動させる。
そのためには、MouseMoveイベントにおけるコントロールをドッキングさせるコードに、次のような簡単なコードを加えればよい。
If MyBase.Dock <> DockStyle.None Then If MyBase.Dock = DockStyle.Left Then MyBase.Dock = DockStyle.None MyBase.Size = _size MyBase.Left = 5 Return ' 訳注:上記は左端のドッキングのコードであり、 ' 以下、上、右、下について同等なコードが必要となる |
このようにして簡単に、ドッキングしたり、サイズを変更したり、ドラッグしたりする柔軟なコントロールを作成できる。
この種のコントロールは、「不定形なフォーム」「スタイリッシュな通知」に加えて、ユーザーが期待する柔軟で近代的で一貫したユーザーインタフェースをユーザーに提供するスパイスとなるだろう。
著者について:
Andrew Flick氏は、Microsoft Visual Studio Industry PartnerであるInfragistics社の.NETテクニカルエバンジェリスト。Infragistics社のテクノロジーデモンストレーションを世界に伝えるかたわら、アプリケーションの実装サンプルや.NETテクノロジーの記事を著す責務も担う。Microsoft .NET MVPであり、INETA学術委員会に属している。
Jason Beres氏は、Microsoft Visual Studio Industry PartnerであるInfragistics社の.NETテクニカルエバンジェリスト。Microsoft .NET MVPであり、INETA議長局に属しており、INETA学術委員会の共同議長を務めている。「Sams Teach Yourself Visual Studio .NET 2003 in 21 Days」の著者であり、「Visual Basic .NET Bible」と「C# Bible」(ともにWiley刊)の共著者。
日本語訳:大澤文孝
© Copyright 2001-2005 Fawcette Technical Publications