CorelDRAWでマクロを利用するためのドキュメント「8.8 - Arranging open documents」の和訳です。
あなたは、必要に応じて、開いている複数の文書を整理してドッキングできます。あなたが、文書をメイン・ウインドウからドラッグするとき、それが、新しいフローティング・ウインドウに配置されます。VBAオブジェクト・モデルでは、これらのウィンドウは、FrameWindowsと呼ばれます。メインフレーム・ウィンドウは、デフォルトでは、メニュー、ステータス・バー、そして、すべてのドッキング・ウィンドウをホストします。;そして、閉じられるとき、アプリケーションが終了する原因になります。
Application.FrameWork.MainFrameWindowは、メインフレーム・ウィンドウを表現します。Application.FrameWork.FrameWindowsは、浮動ドッキング・ウィンドウと浮動ツールバーをホストするメインフレームとフレーム・ウィンドウを含む、すべてのフレーム・ウィンドウのコレクションです。
DockHostは、順番に、1つ以上のアイテムをホストできる、線形ドッキング領域です。DockHostやViewHostアイテムである可能性があります。DockHostは、一次元のテーブルと似ています。それは、水平または垂直のいずれかです。複雑な2次元レイアウトを作成するために、あなたは、DockHostsを入れ子にする必要があります。
このDockHostツリーの終了ノードは、1つ以上のビュー・ウィンドウが含まれているViewHostです。それらは、それぞれの文書ビューが、タブとして、UIに表示されるタブの付いたウィンドウ・コントロールです。次のスクリーン・キャプチャと図は、5つのビューが含まれているCorelDRAWの例、そして、DockHostsとViewHostsを使用して、このレイアウトが、どのように達成されたかを示しています。
レイアウト例:
水平DockHostは、直接の子として、垂直DockHostsだけを含めることができます。つまり、あなたは、水平DockHost内のセルを水平に分割することはできません。そのかわりに、あなたは、他のセルを挿入する必要があります。
開いている文書を配置するための詳細については、次のトピックを参照してください。:
- レイアウト構造体を理解する
- ビューを結合する
- カスケード・ビュー
- タイル・ビュー
レイアウト構造体を理解する
Understanding the layout structure
次のマクロは、それぞれのフレーム・ウィンドウのドッキング構造を走査します。そして、レイアウト構造を(VBA「イミディエイト」ウィンドウに)印刷します。:
Sub DumpLayout()
Dim s As String
Dim f As FrameWindow
For Each f In FrameWork.FrameWindows
DumpFrameWindows f, 0, s
Next f
Debug.Print s
End Sub
Private Sub DumpDockItem(d As DockItem, indent As Long, ByRef s As String)
If d.Type = cuiDockItemDockHost Then
DumpDockHost d.DockHost, indent, s
Else
DumpViewHost d.ViewHost, indent, s
End If
End Sub
Private Sub DumpDockHost(d As DockHost, indent As Long, ByRef s As String)
If d Is Nothing Then Exit Sub
Dim item As DockItem
s = s & Space(indent) & "DockHost: " & d.ID & " - " & IIf(d.Orientation = _
cuiDockHostHorizontal, "H", "V") & vbCrLf
For Each item In d.Children
DumpDockItem item, indent + 2, s
Next item
End Sub
Private Sub DumpViewWindow(w As ViewWindow, indent As Long, ByRef s As String)
s = s & Space(indent) & "View: " & w.ID & " - Kind: " & w.Kind & _
" - " & w.Title & " / " & w.Description & vbCrLf
End Sub
Private Sub DumpViewHost(v As ViewHost, indent As Long, ByRef s As String)
Dim w As ViewWindow
s = s & Space(indent) & "ViewHost: " & v.ID & " - " & _
v.Views.Count & " view(s)" & vbCrLf
For Each w In v.Views
DumpViewWindow w, indent + 2, s
Next
End Sub
Private Sub DumpFrameWindows(f As FrameWindow, indent As Long, ByRef s As String)
s = s & Space(indent) & "FrameWindow: " & f.ID & " - " & IIf(f.IsMainFrame, _
"MainFrame", "Secondary") & vbCrLf
DumpDockHost f.RootDockHost, indent + 2, s
s = s & vbCrLf
End Sub
あなたが、SampleレイアウトのDumpLayoutマクロを実行する場合、あなたは、次のような出力が表示されます。:
FrameWindow: Framework_MainFrame - MainFrame
DockHost: fc796773-64ff-4250-8d64-3bd07fd9352f - V
DockHost: 1304df1c-d014-4daf-a755-c0fbbd983127 - H
ViewHost: 5795efd1-b582-4b80-b05c-469450c3babd - 2 view(s)
View: a961c249-6f05-4fbf-bb83-311d82c2444a - Kind: 1a9379f7-f018-3eb7-41e2-51436969b66f - Welcome Screen /
View: 7a1d8b68-a01f-45ad-80bc-67a8ab2b1a86 - Kind: ab303a90-464d-5191-423f-613c4d1dcb2c - Untitled-4 / Untitled-4
DockHost: ed290c1b-448e-49e6-a1e4-fbee981b9545 - V
ViewHost: 3ad110d1-94cb-4cab-9fab-2b431086aed4 - 1 view(s)
View: 235e9f22-79c5-42ed-ad20-9fa17248c83c - Kind: ab303a90-464d-5191-423f-613c4d1dcb2c - Untitled-2 / Untitled-2
ViewHost: e713b707-d067-4ef8-a60e-7ff492b545df - 1 view(s)
View: 338e338a-0f03-4013-965e-ceac1725bef9 - Kind: ab303a90-464d-5191-423f-613c4d1dcb2c - Untitled-3 / Untitled-3
ViewHost: 14f31f64-f810-4934-8c37-4f733393317e - 1 view(s)
View: dedddb8a-3bd7-46bc-9e14-0179c00963db - Kind: ab303a90-464d-5191-423f-613c4d1dcb2c - Untitled-1 / Untitled-1
要素の各々-FrameWindow、DockHost、ViewHost、ViewWindow-あなたが、要素を識別するために使用できる一意のID(GUID)を持っています。ビュー・ウィンドウは、あなたが、通常のドキュメント・ウィンドウ(種類:ab303a90-464d-5191-423f-613c4d1dcb2c)から、Welcome画面(種類:1a9379f7-f018-3eb7-41e2-51436969b66f)を区別できる、GUIDも持っています。
ビューを結合する
Combining views
次のVBAの例は、すべての文書ビューを取得します。そして、メイン・フレーム・ウィンドウの1つのViewHostで、それらのすべてを配置します。どんなドッキング、あるいは、浮動文書でも、メインフレーム内に、配置されます。
Sub CombineAllViews()
Dim vh As ViewHost, vhc As ViewHost
Dim f As FrameWindow
For Each f In FrameWork.FrameWindows
For Each vh In f.ViewHosts
If vhc Is Nothing Then
If FrameWork.MainFrameWindow.ViewHosts.Count = 0 Then _
FrameWork.MainFrameWindow.RootDockHost.InsertViewHost vh, 1
Set vhc = vh
Else
vhc.InsertViewHost vh, vhc.Views.Count + 1
End If
Next vh
Next f
End Sub
上記のマクロが、Sampleレイアウトで実行される場合、ビューが、結合されます。そして、すべての開いている文書が、タブ付きで表示されます。
開いた文書が、タブ付きで表示されます。:
カスケード・ビュー
Cascading views
次のVBAの例は、それ自身のフローティング・ウインドウに、それぞれのビューを抽出することで、すべてのビューをカスケードします。そして、メイン・フレーム・ウィンドウの上部にビューを配置します。
Sub CascadeViews()
Dim vh As ViewHost, rc As ScreenRect, v As ViewWindow, fw As FrameWindow
Set rc = FrameWork.MainFrameWindow.RootDockHost.Position.GetCopy
rc.Resize rc.Width * 0.75, rc.Height * 0.75
For Each vh In FrameWork.MainFrameWindow.ViewHosts
For Each v In vh.views
Set fw = FrameWork.CreateFrameWindowForView(v)
fw.Position.CopyAssign rc
fw.Position.CopyAssign rc
rc.Move rc.Left + 20, rc.Top + 20
Next v
Next vh
End Sub
カスケード・ビュー
タイル・ビュー
Tiling views
次のVBAマクロは、グリッドを使用して、メイン・フレーム・ウィンドウの中に、すべてのビューをタイル表示します。
Sub TileViews()
Dim views As New Collection
Dim fw As FrameWindow
Dim vh As ViewHost, vw As ViewWindow, dh As DockHost
Dim rows As Long, cols As Long
Dim x As Long, y As Long, i As Long
Dim r As DockItem, c As DockItem
For Each fw In FrameWork.FrameWindows
For Each vh In fw.ViewHosts
For Each vw In vh.views
views.Add vw
Next vw
Next vh
Next fw
If views.Count = 0 Then Exit Sub
rows = CLng(Sqr(views.Count))
cols = (views.Count + rows - 1) \ rows
Set fw = FrameWork.MainFrameWindow
For y = 1 To rows
i = (y - 1) * cols + 1
If dh Is Nothing Then
If fw.RootDockHost.Orientation = cuiDockHostVertical Then
Set vh = fw.RootDockHost.InsertView(views(i), y)
Set dh = vh.DockHost
Else
Set vh = fw.RootDockHost.InsertView(views(i), _
0, cuiDockOperationSplitTopLeft)
Set dh = vh.DockHost
End If
Else
Set vh = dh.InsertView(views(i), y)
End If
For x = 2 To cols
i = i + 1
If i <= views.Count Then
If dh.Children(y).Type = cuiDockItemDockHost Then
dh.Children(y).DockHost.InsertView views(i), x
Else
dh.InsertView views(i), y, cuiDockOperationSplitBottomRight
End If
End If
Next x
Next y
For Each r In fw.RootDockHost.Children
r.RelativeSize = fw.RootDockHost.Position.Height / rows
If r.Type = cuiDockItemDockHost Then
For Each c In r.DockHost.Children
c.RelativeSize = fw.RootDockHost.Position.Width / cols
Next c
End If
Next r
End Sub
タイル・ビュー: