Home > Illustlation > グラフィックツール > Corel Draw > CorelDrawの公式マクロ文書の和訳 > CorelDRAW開発者エリアにようこそ > プログラミング・ガイド > 8-オブジェクト・モデルを理解する 8.8 - 開いた文書を配置する

8.8 - 開いた文書を配置する

新規作成日 2020-02-28
最終更新日

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

タイル・ビュー:

タイル・ビュー:
このエントリーをはてなブックマークに追加