Дата публикации статьи: 29.02.2004 19:10

Валерий Назаров
Работа с Word
Работа с графическими объектами в Word. Часть 1

Кроме инструментов для работы с таблицами и текстом Word располагает обширным набором функций и методов для работы с графическими объектами. Для этого у Word-a есть встроенный графический редактор, набор инструментов которого вы можете использовать для красочного оформления документов. Вы можете использовать линии, прямоугольники, стрелки, автофигуры и т.д. При этом имеется коллекция ThreeD, для придания практически всем этим графическим элементам, "примитивам", объёма.
Для создания графического объекта вы можете использовать два метода:

  1. явным объявлением объектной переменной типа Shape, например Dim Line1 As Word.Shape, и последующей её инициализацией.
  2. неявной инициализацией объекта Shape.

Оба метода имеют свои преимущества и недостатки, например при 2-м методе не нужно объявлять объектную переменную для каждого графического примитива, но в дальнейшем сложнее получать доступ к свойствам и методам этого конкретного объекта. Это происходит потому, что к заранее объявленному и в последствии инициализированному графическому объекту вы обращаетесь напрямую, а при неявной инициализации вам необходимо знать индекс или имя конкретного графического объекта, что довольно сложно, особенно если не Вы создали часть объектов. Из этого следует, что проще (на мой взгляд) при создании новых графических примитивов сначала инициализировать заранее объявленный объект, получить и запомнить его имя или ввести уникальное, а затем уничтожить ссылку на этот объект (если вы хотите переициализировать переменную) и в дальнейшем использовать для доступа к объекту его уникальное имя. Если вы не собираетесь использовать слишком много графических объектов, то ещё проще, просто объявить нужное количество объектных переменных и в последствии спокойно обращаться к ним.
Следует помнить о том, что новый графический объект создается на текущем листе и принадлежит этому листу, поэтому сначала перейдите на нужный вам лист и только потом инициализируйте примитив. Его координаты задаются от левого верхнего угла листа, а не от этой же части "печатной области", и если вы зададите координаты за пределами листа, то объект создастся, но не будет виден, хотя вы можете впоследствии и передвинуть его в видимую область. Естественно, что координаты задаются в твипах и если вы хотите использовать другие единицы, то должны будете использовать встроенные функции, например CentimetersToPoints(Х,хх). Также нужно (в дальнейшем) пре необходимости изменять координаты графического объекта, помнить о том, что после создания примитива он автоматически привязывается к ближайшей от своей верхней границы текстовой строке и его свойство .Top и .Left будет отсчитываться от начала этой строки. Это сделано для того, чтобы при перемещении "привязанной" строки перемещались и связанные с ней графические объекты. При этом они (объекты) могут перейти при недостатке места на текущем листе на соседний лист, чего вы не сможете сделать, просто изменяя координаты графического объекта.
Остановимся на общем принципе построения графических объектов для понимания принципа работы с ними. Любой Г.О. это (в принципе) квадрат в котором находиться изображение какого ни будь примитива, поэтому у него есть только ширина и высота. Если вы зададите равными ширину и высоту для "овала", то получите круг и т.д. Если вы объедините несколько примитивов (сгруппируете их), то получите новый квадрат с изображением группы примитивов. Так как ширина и высота не могут быть отрицательными, чтобы изменить, например, координаты концов линии вам потребуется зеркально отобразить изображение линии по вертикали или горизонтали, а уже после этого шириной, высотой, отступом сверху и слева привести её к нужному вам виду и расположению. Сразу понять, что получится от применения того или иного кода, сложно, поэтому я вам предлагаю поэкспериментировать и для этого запустить на выполнение программу пример.

Работа с линией

Для начала создадим линию двумя способами:

'инициализируем (создадим) линию
'с координатами (начало_Линии_слева(Х),начало_Линии_сверху(У), 
'конец_Линии_слева(Х),конец_Линии_сверху(У))
Set Line1 = DocWord.Shapes.AddLine(0, 0, CentimetersToPoints(3), CentimetersToPoints(2))
'изменим цвет линии
Line1.Line.ForeColor.RGB = RGB(0, 0, 255)
'изменим толщину линии
Line1.Line.Weight = 2.25

'инициализируем (создадим) линию неявным объявлением
'и присвоим ей уникальное имя для дольнейшего доступа
DocWord.Shapes.AddLine(100, 0, 100, 100).Name = "DDD1"
'изменим цвет линии
DocWord.Shapes("DDD1").Line.ForeColor.RGB = RGB(255, 0, 0)
'или DocWord.Shapes.Range("GGG1").Line.ForeColor.RGB = RGB(1, 255, 0)
'изменим толщину линии
DocWord.Shapes("DDD1").Line.Weight = 4

	заносим данные в талицу:
'добавляем данные в таблицу
TableWord.Cell(2, 1).Range.Text = "Line1"
'получаем имя объекта "линия"
TableWord.Cell(2, 2).Range.Text = Line1.Name
'получяем отступ сверху
TableWord.Cell(2, 3).Range.Text = Line1.Top
'получяем отступ слева
TableWord.Cell(2, 4).Range.Text = Line1.Left
'получаем ширину несушего квадрата
TableWord.Cell(2, 5).Range.Text = Line1.Width
'получаем высоту несушего квадрата
TableWord.Cell(2, 6).Range.Text = Line1.Height
'если нужно в сантиметрах
'Round(Line1.Height / 28.35, 2) & " см"
'меняем имя линии
'Line1.Name = "GGG1"

С помощью этого кода изменим положение линии.
'Смещаем линию (отступ сверху)
Line1.Top = Line1.Top + 10

'Смещаем линию (отступ слева)
Line1.Left = Line1.Left + 10

А с помощью этого кода изменим размеры несущего квадрата, то есть его высоту и ширину.
'изменим ширину несушего квадрата
Line1.Width = Line1.Width + 10

'изменяем высоту несушего квадрата
Line1.Height = Line1.Height + 10

Зеркально отразим изображение примитива (линии) по вертикали и горизонтали, то есть перевернём картинку.
'Зеркально отразим по вертикали
Line1.Flip 1 'msoFlipVertical

'Зеркально отразим по горизонтали
Line1.Flip 0 'msoFlipHorizontal

Для придания объемного вида графическим примитивам вы можете использовать данный код:
'показать объём
Line1.ThreeD.Visible = &HFFFFFFFF 'msoTrue

'скрыть объём
Line1.ThreeD.Visible = 0 'msoFalse

'переключить видимость объёма
Line1.ThreeD.Visible = &HFFFFFFFD 'msoTriStateToggle

'изменим стиль изображения объёма
Line1.ThreeD.SetThreeDFormat 1
Используя Рис. 1 для справки, вы можете самостоятельно выбирать и подставлять номер необходимого вам стиля отображения графического примитива.


Рис. 1

Пример: Word_7.vbp