アプリケーションウィザード
VBの機能の中に、アプリケーションウィザードと言うものがあります。 これを使うと、ある程度までプログラムを記述してくれるので、結構楽できます。
本格的なプログラミングには、たくさんの修正個所があるので、実用向きではないのですが、サンプル程度にはもってこい之代物です。
ソースの記述も、結構きれいに書かれていますので、試しに動かしてみましょう。
さて、なぜ急にアプリケーションウィザードの話をしたかと言うと、このウィザードが作ってくれたサンプルの中に、今回のスプリットコンテナのヒントがありました。
アプリケーションウィザードで、エクスプローラスタイルのアプリケーションを作ってみてください。すると、この様なフォームが作成されます。
このフォームの中にある、ツリービューとリストビューを区切っているスプリットバーを、今回はコントロール化します。
早速、どの様にスプリットバーを実現しているのか、ソースを見てみましょう。
ソースの内容(関係ない部分は省いてあります。) Private Sub imgSplitter_MouseDown(Button As Integer, _
Shift As Integer, _
X As Single, Y As Single)
With imgSplitter
picSplitter.Move .Left, .Top, .Width \ 2, .Height - 20
End With
picSplitter.Visible = True
mbMoving = True
End Subこのルーチンは、スプリッタ(区切線)の移動開始のルーチンの様です。
変数も設定やスプリッタの影の設定を行なっていますね。Private Sub imgSplitter_MouseMove(Button As Integer, _
Shift As Integer, _
X As Single, Y As Single)
Dim sglPos As Single
If mbMoving Then
sglPos = X + imgSplitter.Left
If sglPos < sglSplitLimit Then
picSplitter.Left = sglSplitLimit
ElseIf sglPos > Me.Width - sglSplitLimit Then
picSplitter.Left = Me.Width - sglSplitLimit
Else
picSplitter.Left = sglPos
End If
End If
End Subここは、スプリッタ移動中のルーチンの様です。
スプリッタの影の移動を行なっています。
スプリッタが範囲を超えない様にもしていますね。Private Sub imgSplitter_MouseUp(Button As Integer, _
Shift As Integer, _
X As Single, Y As Single)
SizeControls picSplitter.Left
picSplitter.Visible = False
mbMoving = False
End Subこの2つのルーチンは、スプリッタ移動終了ルーチンの様です。
マウスカーソルのボタンを放した位置を元にして、SizeControlsと言うサブルーチンを呼んでいますね。
実際の処理はそのサブルーチンで行なっている様です。Private Sub TreeView1_DragDrop(Source As Control, _
X As Single, Y As Single)
If Source = imgSplitter Then
SizeControls X
End If
End SubSub SizeControls(X As Single)
On Error Resume Next
'幅を設定します。
If X < 1500 Then X = 1500
If X > (Me.Width - 1500) Then X = Me.Width - 1500
tvTreeView.Width = X
imgSplitter.Left = X
lvListView.Left = X + 40
lvListView.Width = Me.Width - (tvTreeView.Width + 140)
lblTitle(0).Width = tvTreeView.Width
lblTitle(1).Left = lvListView.Left + 20
lblTitle(1).Width = lvListView.Width - 40
'上辺を設定します。
If tbToolBar.Visible Then
tvTreeView.Top = tbToolBar.Height + picTitles.Height
Else
tvTreeView.Top = picTitles.Height
End If
lvListView.Top = tvTreeView.Top
'高さを設定します。
If sbStatusBar.Visible Then
tvTreeView.Height = Me.ScaleHeight - _
(picTitles.Top + picTitles.Height + sbStatusBar.Height)
Else
tvTreeView.Height = Me.ScaleHeight - _
(picTitles.Top + picTitles.Height)
End If
lvListView.Height = tvTreeView.Height
imgSplitter.Top = tvTreeView.Top
imgSplitter.Height = tvTreeView.Height
End Subここで、実際にツリービューとリストビューを移動しているようですね。
ラベルやステータスバーの移動なども行なっている様ですが、今回は関係無いので説明は省きます。
複雑に見えても、細かく見ていくと、そんなに難しくなさそうです。
ここまでのまとめです。
この点を押さえて、スプリットコンテナコントロールを作っていきます。
- スプリッタに使用しているのは、イメージとピクチャコントロールである。
- スプリッタの移動はイメージのイベントルーチン内で行なっている。
- 実際のコントロールの移動はSizeControlサブルーチンで行っている
この章で使ったサンプルソースの見たい方はこちら