- Машинная графика
- Рисуем? Где? Чем?
- Что позволяет рисовать система VB?
- Работа с отдельными точками
- Отрезки прямых и прямоугольники
- Окружности, эллипсы, дуги и сектора
- Очистка канвы графического объекта
- Что позволяют рисовать системы BCB и Delphi?
- Отрезки прямых и ломаные
- Стандартные прямоугольники
- Нестандартные многоугольники
- Кривые второго порядка
- Обмен с графическими файлами
- Вывод символьных и числовых данных на канве
- Отображение текстовой и числовой информации в VB
- Работа с текстами в BCB и Delphi
- Графические объекты в системе VB
- Графические объекты в системах BCB и Delphi
- Копирование растровых изображений
- Создание монотонно изменяющегося фона
- Формирование регулярных заливок замкнутых областей в BCB
- Формирование регулярных заливок замкнутых областей в Delphi
Графические объекты в системе VB
Опубликовано admin в Сб, 05/08/2010 - 21:04
Наиболее универсальный объект PictureBox предназначен для построения геометрических фигур и размещения растровых изображений, хранящихся в одном из графических форматов bmp, cur, dib, emf, gif, ico, jpg, rle и wmf. По умолчанию объектам PictureBox присваиваются системные имена Picture1, Picture2, ... . Точки, линии, прямоугольники, окружности, эллипсы и их дуги воспроизводятся на канве объекта Picture1 с помощью методов Picture1.PSet, Picture1.Line и Picture1.Circle. На поведение объекта PictureBox наибольшее влияние оказывают свойства AutoSize, AutoRedraw, Picture и Image.
Когда объект виден на экране, его канву представляет соответствующий участок видеопамяти, который можно ассоциировать со свойством Picture. Все, что мы рисуем с помощью графических методов, временно запоминается в этой памяти, но полученное изображение хранится до тех пор, пока канва видна полностью. Стоит заменить форму пиктограммой или какому-либо окну перекрыть часть объекта, как прежний участок видеопамяти захватит другой элемент, и часть нашей картинки или все ее изображение будет потеряно. Восстановление границ канвы объекта в прежних размерах не всегда приводит к автоматическому восстановлению графического изображения. Здесь возможны два варианта.
Во-первых, содержимое свойства Picture может автоматически дублироваться после выполнения каждого графического оператора в некотором участке оперативной памяти, где размещается свойство Image. Тогда после восстановления границ объекта содержимое свойства Image автоматически копируется в свойство Picture и изображение восстанавливается без нашего участия. Но свойство Image не создается при объекте PictureBox автоматически. Для его возникновения необходимо выполнение одного из двух условий. Если в какой-то момент времени установлено значение свойства AutoRedraw=True, то объекту PictureBox система выделяет дополнительную оперативную память для размещения свойства Image. С этого момента все, что записывается в свойство Picture, тут же дублируется и в свойстве Image. И только эта часть рисунка будет автоматически восстановлена после частичной или полной утраты изображения. Область Image, принадлежащая объекту Picture1, автоматически приписывается объекту Picture2 после выполнения следующей операции присваивания:
Picture2.Picture = Picture1.Image
При этом область Image, ранее выделенная объекту Picture1, второй раз не дублируется. Просто между памятью Image объекта Picture1 и объектом Picture2 фиксируется связь. Впечатление такое, как будто у Picture2 появилась своя собственная копия изображения, и не зависимо от установки значения свойства Picture2.AutoRedraw изображение объекта Picture2 будет восстанавливаться автоматически по содержимому Picture1.Image.
Приложение 8_11 (VB).
Приводимое ниже приложение демонстрирует эти возможности. На форме находится два объекта Picture1 и Picture2 одинакового размера. В момент запуска приложения устанавливается в истину свойство Picture1.AutoRedraw, что автоматически снабжает первый объект свойством для дублирования изображения. После щелчка по поверхности Picture1 на этом объекте возникает очередная залитая окружность. Все, что нарисовано в результате последовательных щелчков по Picture1, будет автоматически восстановлено. После первого щелчка по Picture2 содержимое первого объекта копируется на канву второго объекта, который с этого момента совместно с первым объектом использует область Picture1.Image. После переписи изображения сбрасывается значение свойства Picture1.AutoRedraw. Теперь щелчки по первому объекту добавляют на нем новые окружности, но в Image они уже не дублируются. Поэтому восстановлению подлежит только та часть изображения, которая была накоплена в период истинности свойства AutoRedraw. Если бы в программе переноса изображения из Picture1 в Picture2 мы включили свойство Picture2.AutoRedraw, то содержимое Picture2 было бы скопировано в общий Image. И тогда восстановление обоих изображений было бы более полным. Поэкспериментируйте с этим приложением, меняя порядок и сочетание замен свойств AutoRedraw. Внешний вид его формы показан на рис.8.9.
Private Sub Form_Load()
'Picture2.AutoRedraw = True
Picture1.AutoRedraw = True
End Sub
Private Sub Picture1_Click()
Dim PW, PH
Picture1.FillStyle = vbFSSolid
Picture1.FillColor = QBColor(Int(Rnd * 15))
PW = Picture1.ScaleWidth
PH = Picture1.ScaleHeight
Picture1.Circle (Int(Rnd * PW), Int(Rnd * PH)), 250
End Sub
Private Sub Picture2_Click()
Picture1.AutoRedraw = False
Picture2.Picture = Picture1.Image
Caption = " Picture2.AutoRedraw = " & Picture2.AutoRedraw
' Caption = " Picture1.AutoRedraw = " & Picture1.AutoRedraw
End Sub

Рис. 8.9. Дублирование и восстановление изображений
Если объект PictureBox лишен копии в оперативной памяти, то после восстановления первоначальных размеров изображения система генерирует событие Paint. И в этом случае ничего не остается другого кроме как повторить формирование изображения заново программным путем.
Логическое свойство AutoSize управляет размерами окна PictureBox в момент загрузки изображения на канву из графического файла:
Picture1.Picture = LoadPicture("qq.bmp")
При AutoSize=True размер объекта старается подстроиться под размер загружаемого изображения. Однако результат такой загрузки не всегда может оказаться удовлетворительным. Окно PictureBox не может выйти за границы формы, его левый верхний угол остается на прежнем месте, линейки прокрутки большого графического изображения в VB не предусмотрены. Поэтому желательно проделать загрузку предполагаемых рисунков на стадии проектирования, чтобы заранее произвести подгонку размеров и положения соответствующих окон.
Для стирания ранее загруженного изображения можно воспользоваться методом LoadPicture без аргумента:
Picture1.Picture=LoadPicture()
При AutoSize=False изображение прижимается к левому верхнему углу объекта, размер окна не изменяется, и мы рискуем увидеть либо часть изображения, обрезанную по границам окна, либо незаполненную часть окна.
Изображение, загруженное из файла, автоматически восстанавливается после любых нарушений видимости рисунка.
Форма тоже обладает графическими свойствами — Picture, Image и Icon. Первое свойство позволяет рисовать на форме, используя методы PSet, Line или Circle, а также размещать растровые изображения, загружая их из файла или копируя из других графических объектов:
Form1.Picture = LoadPicture("qq.bmp")
Свойство Icon, как правило, используется для загрузки пиктограммы, заменяющей изображение свернутой формы:
Form1.Icon= LoadPicture("qq.ico")
Для запоминания в дисковом файле изображения, построенного на форме, можно прибегнуть к оператору SavePicture:
SavePicture Form1.Image, "abc.bmp"
Обратите внимание на то, что при загрузке содержимого графического файла в качестве адресата выступало свойство Form1.Picture. Формат оператора запоминания изображения использует свойство Form1.Image.
Еще один графический объект Image обладает гораздо меньшими возможностями, нежели PictureBox. На поверхность этого объекта можно загрузить содержимое графического файла или скопировать растровую картинку из другого объекта:
Set Image1.Picture = LoadPicture("qq.bmp")
Image2.Picture = Image1.Picture
Приложение 8_12 (VB).
Установка логического свойства Stretch=True заставляет окно Image увеличиться или уменьшиться до размера загружаемого или копируемого рисунка. Однако выход за пределы формы по-прежнему запрещен, и линейками прокрутки большого изображения объект Image не располагает. На рис.8.10 демонстрируется процесс копирования пиктограмм в окна Picture1 и Image2, загруженных на стадии проектирования в объекты Picture1 и Image1. При начальной загрузке пиктограмм размер Picture1 сохранился, тогда как объект Image1 принял размеры рисунка. Такое же сжатие произошло и после копирования рисунка в объект Image2.
Private Sub Form_Click()
Picture2.Picture = Picture1.Picture
Image2.Picture = Image1.Picture
End Sub

Рис. 8.10. Копирование свойств Picture из объектов Picture1 и Image1
К графическим объектам системы Visual Basic относятся компоненты Line и Shape. Их использование имеет ограниченный характер. Дело в том, что их можно применять на стадии проектирования для создания на поверхности тех или иных объектов изображений прямых и простейших геометрических фигур — квадратов и прямоугольников с прямыми или закругленными углами, овалов и окружностей. Примерно так же как и в соответствующих графических методах, применяемых во время работы приложения, здесь можно управлять такими свойствами как толщина, цвет и стиль линий, цвет и способ заливки геометрических фигур.
Главные свойства объекта Line — X1, Y1, X2, Y2, — определяют координаты начала и конца отрезка в системе координат контейнера. На способ воспроизведения линии влияют установки свойств BorderStyle и BorderWidth. Отрезки прямых, созданные на стадии проектирования на формах, рисунках и рамках, восстанавливаются автоматически независимо от значения свойства AutoRedraw.
Форма геометрической фигуры, создаваемой с помощью объекта Shape, задается значением свойства с одноименным названием Shape. Последнее может принимать одно из шести целочисленных значений, приведенных в табл. 8.7.
Таблица 8.7
| Число | Константа | Создаваемая фигура |
| 0 | vbShapeRectangle | Прямоугольник |
| 1 | vbShapeSquare | Квадрат |
| 2 | vbShapeOvale | Овал |
| 3 | vbShapeCircle | Окружность |
| 4 | vbShapeRoundedRectangle | Прямоугольник с закругленными углами |
| 5 | vbShapeRoundedSquare | Квадрат с закругленными углами |
Фигура, создаваемая с помощью объекта Shape, должна вписываться в прямоугольник, определяемый шириной (Width) и высотой (Height) объекта Shape. Для ее заливки используются свойства FillStyle и FillColor. Фигуры, включенные в приложение на стадии проектирования, восстанавливаются автоматически после любых нарушений зон видимости.
