アプリケーションウィザード


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 Sub
Sub 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
ここで、実際にツリービューとリストビューを移動しているようですね。
ラベルやステータスバーの移動なども行なっている様ですが、今回は関係無いので説明は省きます。
複雑に見えても、細かく見ていくと、そんなに難しくなさそうです。

ここまでのまとめです。
  1. スプリッタに使用しているのは、イメージピクチャコントロールである。
  2. スプリッタの移動はイメージのイベントルーチン内で行なっている。
  3. 実際のコントロールの移動はSizeControlサブルーチンで行っている
この点を押さえて、スプリットコンテナコントロールを作っていきます。

Step1.lzh 5,738 Byteこの章で使ったサンプルソースの見たい方はこちら