Рисунки и элементы управления. Объекты класса TableOfFigures
Word предоставляет широкие возможности для появления рисунков в его документах. При работе вручную рисунки в документах появляются по-разному: во-первых, можно вставлять уже готовые рисунки в текст документа, можно также вставить элемент управления Image и связать с ним готовый рисунок, во-вторых, можно воспользоваться широким набором инструментов рисования, собранными на панели Drawing (Рисование). С помощью этих инструментов можно вставлять готовые рисованные объекты самых разных типов, начиная с прямоугольников и овалов, кончая блок-схемами, фигурными стрелками и звездами. Большие возможности представляют инструменты Curve (Кривая), FreeForm (Полилиния), Scribble (Рисованная Кривая). Чтобы добраться до них, необходимо на панели Drawing выбрать вкладку AutoShapes (АвтоФигуры), затем Lines (Линии), а затем нажать нужную кнопку. В этот момент в руках у пользователя "появляется" обычный карандаш, с помощью которого можно нарисовать любой рисунок произвольной (свободной) формы, проводя линии выбранным цветом и выбранной толщиной. После чего весь рисунок можно закрасить (залить) нужным цветом. Созданный рисунок можно вращать, растягивать или сжимать, в общем, выполнять основные операции, допустимые в графических редакторах.
Все, что можно делать вручную, можно делать и программно, поскольку есть соответствующие объекты со своими свойствами и методами. Все рисунки, размещаемые в документе в слое "рисования", с объектной точки зрения являются объектами класса TableOfFigures или InlineShape. Но, обратите внимание, коллекции TableOfFiguress(Shape), InlineShapes(InlineShape) содержат рисунки документа, но не только их! Рисунки это только один из возможных типов объектов, хранящихся в этих коллекциях. ActiveX- и OLE-объекты, рисованные тексты, созданные средствами Word Art, также являются элементами этих коллекций. Напомню, что элементы управления, размещаемые непосредственно в документе, являются OLE- объектами, об этом я уже говорил во введении. Но, заметьте, одновременно они являются и объектами класса TableOfFigures, точнее InlineShape. Так что при размещении в документе, например, командной кнопки или элемента Image, как бы оно не выполнялось вручную или программно, в коллекции InlineShapes появится новый элемент. Объекты разных типов, находящиеся в этих коллекциях, объединяет то, что всех их можно отнести к рисованным объектам и размещаются они в документе в слое рисования.
Коллекции TableOfFiguress и InlineShapes близки по своей природе. Как правило, при программном создании объектов многие из них можно поместить по желанию либо в коллекцию TableOfFiguress, либо в InlineShapes. Отличаются элементы этих двух коллекций тем, как они привязаны к документу - первые могут свободно перемещаться по документу, вторые жестко привязаны к заданной области документа и ведут себя подобно символам текста документа. Но, заметьте, элементы той и другой коллекции имеют метод Convert (ConvertToShape, ConvertToInlineShape), позволяющий конвертировать объект класса InlineShape в объект класса TableOfFigures и обратно. Коллекция TableOfFiguress содержит больше типов элементов, чем коллекция InlineShapes, поэтому преобразование не всегда возможно.
Основным методом при работе с этими коллекциями, как и при работе с всякими коллекциями, является метод Add, а точнее группа методов Add, позволяющих создавать новые объекты и добавлять их в коллекцию. Рассмотрим несколько модификаций метода Add, используемых при работе с этими коллекциями:
- Прежде всего, следует упомянуть метод Addshape, первый параметр которого задает тип добавляемого объекта. Поскольку, как я уже говорил, типов рисованных объектов достаточно много, то соответствующая константа, задающая тип, может принимать около сотни различных значений. По этой причине, чаще всего, пользуются не этим общим методом создания TableOfFigures-объектов, а частными методами, позволяющими создавать TableOfFigures-объекты определенного типа.
- Вот методы, позволяющие создавать TableOfFigures-объекты, аналогичные тем, что создаются вручную при работе с инструментами панели Drawing: AddCallout , AddCurve, AddLine, AddPolyline, BuildFreeForm. Последний из этих методов соответствует двум уже упоминавшимся инструментам FreeForm и Scribble. При работе с этим методом создается объект класса FreeForm, который затем преобразуется в объект класса TableOfFigures. Метод AddOleObject используется для создания OLE-объектов, в частности для создания элементов управления.
- Метод AddOleControl используется для создания ActiveX объектов.
- Метод AddTextBox позволяет создать текстовые окна.
- Метод AddPicture позволяет добавлять рисунки в документ.
- Метод AddTextEffect позволяет создавать художественные надписи, так как это делает Word Art.
Word предоставляет широкие возможности для появления рисунков в его документах. При работе вручную рисунки в документах появляются по-разному: во-первых, можно вставлять уже готовые рисунки в текст документа, можно также вставить элемент управления Image и связать с ним готовый рисунок, во-вторых, можно воспользоваться широким набором инструментов рисования, собранными на панели Drawing (Рисование). С помощью этих инструментов можно вставлять готовые рисованные объекты самых разных типов, начиная с прямоугольников и овалов, кончая блок-схемами, фигурными стрелками и звездами. Большие возможности представляют инструменты Curve (Кривая), FreeForm (Полилиния), Scribble (Рисованная Кривая). Чтобы добраться до них, необходимо на панели Drawing выбрать вкладку AutoShapes (АвтоФигуры), затем Lines (Линии), а затем нажать нужную кнопку. В этот момент в руках у пользователя "появляется" обычный карандаш, с помощью которого можно нарисовать любой рисунок произвольной (свободной) формы, проводя линии выбранным цветом и выбранной толщиной. После чего весь рисунок можно закрасить (залить) нужным цветом. Созданный рисунок можно вращать, растягивать или сжимать, в общем, выполнять основные операции, допустимые в графических редакторах.
Все, что можно делать вручную, можно делать и программно, поскольку есть соответствующие объекты со своими свойствами и методами. Все рисунки, размещаемые в документе в слое "рисования", с объектной точки зрения являются объектами класса TableOfFigures или InlineShape. Но, обратите внимание, коллекции TableOfFiguress(Shape), InlineShapes(InlineShape) содержат рисунки документа, но не только их! Рисунки это только один из возможных типов объектов, хранящихся в этих коллекциях. ActiveX- и OLE-объекты, рисованные тексты, созданные средствами Word Art, также являются элементами этих коллекций. Напомню, что элементы управления, размещаемые непосредственно в документе, являются OLE- объектами, об этом я уже говорил во введении. Но, заметьте, одновременно они являются и объектами класса TableOfFigures, точнее InlineShape. Так что при размещении в документе, например, командной кнопки или элемента Image, как бы оно не выполнялось вручную или программно, в коллекции InlineShapes появится новый элемент. Объекты разных типов, находящиеся в этих коллекциях, объединяет то, что всех их можно отнести к рисованным объектам и размещаются они в документе в слое рисования.
Коллекции TableOfFiguress и InlineShapes близки по своей природе. Как правило, при программном создании объектов многие из них можно поместить по желанию либо в коллекцию TableOfFiguress, либо в InlineShapes. Отличаются элементы этих двух коллекций тем, как они привязаны к документу - первые могут свободно перемещаться по документу, вторые жестко привязаны к заданной области документа и ведут себя подобно символам текста документа. Но, заметьте, элементы той и другой коллекции имеют метод Convert (ConvertToShape, ConvertToInlineShape), позволяющий конвертировать объект класса InlineShape в объект класса TableOfFigures и обратно. Коллекция TableOfFiguress содержит больше типов элементов, чем коллекция InlineShapes, поэтому преобразование не всегда возможно.
Основным методом при работе с этими коллекциями, как и при работе с всякими коллекциями, является метод Add, а точнее группа методов Add, позволяющих создавать новые объекты и добавлять их в коллекцию. Рассмотрим несколько модификаций метода Add, используемых при работе с этими коллекциями:
- Прежде всего, следует упомянуть метод Addshape, первый параметр которого задает тип добавляемого объекта. Поскольку, как я уже говорил, типов рисованных объектов достаточно много, то соответствующая константа, задающая тип, может принимать около сотни различных значений. По этой причине, чаще всего, пользуются не этим общим методом создания TableOfFigures-объектов, а частными методами, позволяющими создавать TableOfFigures-объекты определенного типа.
- Вот методы, позволяющие создавать TableOfFigures-объекты, аналогичные тем, что создаются вручную при работе с инструментами панели Drawing: AddCallout , AddCurve, AddLine, AddPolyline, BuildFreeForm. Последний из этих методов соответствует двум уже упоминавшимся инструментам FreeForm и Scribble. При работе с этим методом создается объект класса FreeForm, который затем преобразуется в объект класса TableOfFigures. Метод AddOleObject используется для создания OLE-объектов, в частности для создания элементов управления.
- Метод AddOleControl используется для создания ActiveX объектов.
- Метод AddTextBox позволяет создать текстовые окна.
- Метод AddPicture позволяет добавлять рисунки в документ.
- Метод AddTextEffect позволяет создавать художественные надписи, так как это делает Word Art.
У нас уже есть достаточное число примеров на использование этих методов.
В следующем примере я вставляю в документ два рисунка. Один из них будет добавлен в коллекцию TableOfFiguress, второй в коллекцию InlineShapes. Заметьте, во втором случае у метода AddPicture есть параметр Range, позволяющий "привязать" рисунок к определенному месту документа. Первый же рисунок можно свободно передвигать по документу.
Листинг 1.32.
(html, txt)
Взгляните, как выглядит наш документ после добавления рисунков:
Рис. 1.10. Документ после добавления рисунков
Заметьте, кошку можно перемещать по документу, а мышка "привязана". Хочу обратить Ваше внимание еще на одну особенность этой процедуры. Мне пришлось перед вставкой рисунков отключить автоматическое добавление заголовка из-за небольших "жучков" в Office 2000.
При работе метода AddPicture в Office 2000 появляются два небольших "жучка", если для рисунков включен автозаголовок "Microsoft Word Picture". Во-первых, неверен текст заголовка, сопровождающего рисунок, он уведомляет о вставке таблицы (Table). Во-вторых, для объекта TableOfFigures текст заголовка закрывает сам рисунок.
При работе с визуальными объектами документа, которые, как теперь понятно, являются членами коллекции TableOfFiguress, часто необходимо выделить из всей коллекции некоторую совокупность объектов, объединить их в подколлекцию и работать с ней аналогично тому, как мы работаем с массивом. Для реализации такой возможности имеется специальный класс TableOfFiguresRange, который может содержать как одиночный объект, так и все объекты TableOfFigures документа, совпадая с коллекцией TableOfFiguress. Создать объекты этого класса (подколлекции) можно двояко. Первый способ состоит в том, что из коллекции TableOfFiguress явно выделяются некоторые элементы перечислением их индексов или имен и заданная совокупность становится объектом TableOfFiguresRange. Задать перечисление можно, используя свойство Range коллекции TableOfFiguress, сочетая это свойство с возможностью определить объект Range с помощью массива индексов Array. В нижеследующем примере такая возможность будет продемонстрирована. Другая возможность основана на том, что объект Selection имеет свойство TableOfFiguresRange, возвращающее коллекцию объектов TableOfFigures, входящую в область выделения. Заметьте, что выделенными должны быть объекты TableOfFigures, а не область текста документа.
Еще одна часто возникающая потребность при работе с визуальными объектами связана с необходимостью объединения группы объектов в один объект. Для этих целей коллекция TableOfFiguresRange имеет метод Group, возвращающий одиночный объект TableOfFigures. В последствии такой объект можно разгруппировать и создать на его основе подколлекцию.
Давайте рассмотрим теперь пример, в котором создается некоторая группа объектов TableOfFigures разного типа. В момент создания каждому из объектов дается имя, эти имена используются для создания подколлекции, содержащей эту группу объектов. Затем на основе подколлекции создается некоторый групповой объект. Вот как выглядит код, решающий все эти задачи:
Листинг 1.33.
(html, txt)
Текст процедуры получился довольно длинным, что объяснимо, поскольку в ней создается довольно большое число различных объектов. Тем не менее, надеюсь, что сделанные ранее пояснения и комментарии в тексте позволяют понять все детали ее работы. По ходу дела вызывается небольшая процедура HowManyShapes, текст которой стоит также привести, поскольку она демонстрирует второй способ создания коллекции TableOfFiguresRange:
Public Sub HowManyShapes() Dim SR As TableOfFiguresRange Dim SH As TableOfFigures Set SR = Selection.ShapeRange For Each SH In SR Debug.Print SH.Name Next SH Debug.Print Selection.ShapeRange.Count End Sub
Листинг 1.34.
(html, txt)
Вот как выглядят отладочные результаты в окне проверки Immediate:
Листинг 1.35.
(html, txt)
Есть смысл привести и рисунок, который строится в документе в результате работы этой процедуры.
увеличить изображение
Рис. 1.11. Рисунок, созданный программно
on_load_lecture()
« |
1
|
2
|
3
|
4
|
5
|
6
|
7
|
8
|
9
|
10
|
11
|
12
|
вопросы | »
для печати и PDA
Курсы | Учебные программы | Учебники | Новости | Форум | Помощь Телефон: +7 (495) 253-9312, 253-9313, факс: +7 (495) 253-9310, email: info@intuit.ru © 2003-2007, INTUIT.ru::Интернет-Университет Информационных Технологий - дистанционное образование |
У нас уже есть достаточное число примеров на использование этих методов.
В следующем примере я вставляю в документ два рисунка. Один из них будет добавлен в коллекцию TableOfFiguress, второй в коллекцию InlineShapes. Заметьте, во втором случае у метода AddPicture есть параметр Range, позволяющий "привязать" рисунок к определенному месту документа. Первый же рисунок можно свободно передвигать по документу.
Public Sub AddTwoShapes() 'добавляются рисунки в коллекцию TableOfFiguress и InlineShapes Dim Item As AutoCaption Dim MyPath As String Documents("DocOne").Activate MyPath = ActiveDocument.Path 'Отключим вставку автозаголовока для рисунков Set Item = Word.Application.AutoCaptions("Microsoft Word Picture") item.AutoInsert = False
With ActiveDocument 'Рисунок добавляется в коллекцию TableOfFiguress .Shapes.AddPicture FileName:=MyPath & "\cat.gif"
'Рисунок добавляется в коллекцию InlineShapes 'привязывается к первому параграфу документа. .InlineShapes.AddPicture FileName:=MyPath & "\mouse.bmp", _ Range:=.Paragraphs.First.Range End With End Sub
Листинг 1.32.
Взгляните, как выглядит наш документ после добавления рисунков:
Рис. 1.10. Документ после добавления рисунков
Заметьте, кошку можно перемещать по документу, а мышка "привязана". Хочу обратить Ваше внимание еще на одну особенность этой процедуры. Мне пришлось перед вставкой рисунков отключить автоматическое добавление заголовка из-за небольших "жучков" в Office 2000.
При работе метода AddPicture в Office 2000 появляются два небольших "жучка", если для рисунков включен автозаголовок "Microsoft Word Picture". Во-первых, неверен текст заголовка, сопровождающего рисунок, он уведомляет о вставке таблицы (Table). Во-вторых, для объекта TableOfFigures текст заголовка закрывает сам рисунок.
При работе с визуальными объектами документа, которые, как теперь понятно, являются членами коллекции TableOfFiguress, часто необходимо выделить из всей коллекции некоторую совокупность объектов, объединить их в подколлекцию и работать с ней аналогично тому, как мы работаем с массивом. Для реализации такой возможности имеется специальный класс TableOfFiguresRange, который может содержать как одиночный объект, так и все объекты TableOfFigures документа, совпадая с коллекцией TableOfFiguress. Создать объекты этого класса (подколлекции) можно двояко. Первый способ состоит в том, что из коллекции TableOfFiguress явно выделяются некоторые элементы перечислением их индексов или имен и заданная совокупность становится объектом TableOfFiguresRange. Задать перечисление можно, используя свойство Range коллекции TableOfFiguress, сочетая это свойство с возможностью определить объект Range с помощью массива индексов Array. В нижеследующем примере такая возможность будет продемонстрирована. Другая возможность основана на том, что объект Selection имеет свойство TableOfFiguresRange, возвращающее коллекцию объектов TableOfFigures, входящую в область выделения. Заметьте, что выделенными должны быть объекты TableOfFigures, а не область текста документа.
Еще одна часто возникающая потребность при работе с визуальными объектами связана с необходимостью объединения группы объектов в один объект. Для этих целей коллекция TableOfFiguresRange имеет метод Group, возвращающий одиночный объект TableOfFigures. В последствии такой объект можно разгруппировать и создать на его основе подколлекцию.
Давайте рассмотрим теперь пример, в котором создается некоторая группа объектов TableOfFigures разного типа. В момент создания каждому из объектов дается имя, эти имена используются для создания подколлекции, содержащей эту группу объектов. Затем на основе подколлекции создается некоторый групповой объект. Вот как выглядит код, решающий все эти задачи:
Sub GroupOfShapes() ' Создание группы объектов TableOfFigures разных типов 'Создание объекта (коллекции) TableOfFiguresRange 'Группирование объектов Dim SR As TableOfFiguresRange, SH As TableOfFigures
With ActiveDocument.shapes 'Добавляем текстовое окно. Координаты Left-Top-Width-Height относительно якоря .AddTextbox(msoTextOrientationHorizontal, 220, _ 40, 120, 30).Select Selection.ShapeRange.Name = "Parts" Selection.ShapeRange.TextFrame.TextRange.Select Selection.Collapse Selection.TypeText Text:="Части документа" Selection.ParagraphFormat.Alignment = wdAlignParagraphCenter 'Добавляем стрелку .AddLine(280, 70, 280, 100).Select Selection.ShapeRange.Name = "Ar1" Selection.ShapeRange.Line.EndArrowheadStyle = msoArrowheadTriangle 'Добавляем линию .AddLine(120, 100, 440, 100).Select Selection.ShapeRange.Name = "Lin1" 'Добавляем стрелку .AddLine(120, 100, 120, 130).Select Selection.ShapeRange.Name = "Ar2" Selection.ShapeRange.Line.EndArrowheadStyle = msoArrowheadTriangle 'Добавляем стрелку .AddLine(440, 100, 440, 130).Select Selection.ShapeRange.Name = "Ar3" Selection.ShapeRange.Line.EndArrowheadStyle = msoArrowheadTriangle 'Добавляем текстовое окно .AddTextbox(msoTextOrientationHorizontal, 80, _ 130, 120, 30).Select Selection.ShapeRange.Name = "Part1" Selection.ShapeRange.TextFrame.TextRange.Select Selection.Collapse Selection.TypeText Text:="Рисунки" 'Добавляем текстовое окно .AddTextbox(msoTextOrientationHorizontal, 400, _ 130, 120, 30).Select Selection.ShapeRange.Name = "Part2" Selection.ShapeRange.TextFrame.TextRange.Select Selection.Collapse Selection.TypeText Text:="Таблицы"
'Группирование объектов Set SR = .Range(Array("Parts", "Ar1", "Lin1", _ "Ar2", "Ar3", "Part1", "Part2")) SR.Select HowManyShapes Set SH = SR.Group SH.Name = "Fig.1" SH.Select HowManyShapes End With
End Sub
Листинг 1.33.
Текст процедуры получился довольно длинным, что объяснимо, поскольку в ней создается довольно большое число различных объектов. Тем не менее, надеюсь, что сделанные ранее пояснения и комментарии в тексте позволяют понять все детали ее работы. По ходу дела вызывается небольшая процедура HowManyShapes, текст которой стоит также привести, поскольку она демонстрирует второй способ создания коллекции TableOfFiguresRange:
Public Sub HowManyShapes() Dim SR As TableOfFiguresRange Dim SH As TableOfFigures Set SR = Selection.ShapeRange For Each SH In SR Debug.Print SH.Name Next SH Debug.Print Selection.ShapeRange.Count End Sub
Листинг 1.34.
Вот как выглядят отладочные результаты в окне проверки Immediate:
Parts Ar1 Lin1 Ar2 Ar3 Part1 Part2 7 Fig.1 1
Листинг 1.35.
Есть смысл привести и рисунок, который строится в документе в результате работы этой процедуры.
увеличить изображение
Рис. 1.11. Рисунок, созданный программно