特集:Windowsフォームにスパイスを――MessengerやOutlookに見る不定形フォームテクVisual Studio Magazine(4/4 ページ)

» 2004年11月09日 10時41分 公開
[Andrew Flick, Jason Beres,FTPOnline]
前のページへ 1|2|3|4       

 このようにして、ユーザーからの対応を要する情報を上品に表示する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刊)の共著者。

日本語訳:大澤文孝

前のページへ 1|2|3|4       

© Copyright 2001-2005 Fawcette Technical Publications

注目のテーマ