[CM]Jaxson |
Дата: Суббота, 13.10.2012, 18:47 | Сообщение # 1
|
٩(̾●̮̮̃̾•̃̾)۶
Сообщений: 801
Статус: Offline
|
Работа с графикой в Delphi это не только линии и рисунки, но также и и печать текстовых документов. Поэтому в Delphi работе с графикой нужно уделить немного времени. Работа с графикой в Delphi предполагает обращение к канве - свойству Canvas компонентов. Canvas Delphi это холст, который позволяет программисту иметь доступ к каждой своей точке (пикселу), и словно художнику отображать то, что требуется. Конечно, рисовать попиксельно для работы с графикой в Delphi не приходится, система Delphi предоставляет для мощные средства работы с графикой, облегчающие задачу программиста.
В работе с графикой в Delphi в распоряжении программиста находятся канва (холст, полотно - свойство Canvas Delphi компонентов), карандаш (свойство Pen), кисть (свойство Brush) того компонента или объекта, на котором предполагается рисовать. У карандаша Pen и кисти Brush можно менять цвет (свойство Color) и стиль (свойство Style). Доступ к шрифтам предоставляет свойство канвы Font. Эти инструменты позволяют отображать как текст, так и достаточно сложные графики математического и инженерного содержания, а также рисунки. Кроме этого, работа с графикой позволяет использовать в Delphi такие ресурсы Windows как графические и видеофайлы.
Конечно, не все компоненты в Delphi имеют эти свойства. На вкладке Additional расположен специализированный компонент TImage, специально предназначенный для рисования, но также свойство Canvas имеют, например, такие компоненты как ListBox, ComboBox, StringGrid, а также и сама Форма, которая размещает наши компоненты! Кроме того, для печати документов Delphi обращается к свойству Canvas такого объекта как принтер.
Основное свойство такого объекта как Canvas Delphi - Pixels[i, j] типа TColor, то есть это двумерный массив точек (пикселов), задаваемых своим цветом. Рисование на канве происходит в момент присвоения какой-либо точке канвы заданного цвета. Каждому пикселу может быть присвоен любой доступный для Windows цвет. Например, выполнение оператора
Image1.Canvas.Pixels[100, 100]:=clRed;
приведёт к рисованию красной точки с координатами [100, 100]. Узнать цвет пиксела можно обратным присвоением:
Color:=Image1.Canvas.Pixels[100, 100];
Тип TColor определён как длинное целое (LongInt). Его четыре байта содержат информацию о долях синего (B), зелёного (G), и красного ® цветов. В 16-ричной системе это выглядит так: $00BBGGRR. Доля каждого цвета может меняться от 0 до 255. Поэтому чтобы отобразить максимально красную точку, ей нужно присвоить цвет $000000FF. Для стандартных цветов в Delphi определён набор текстовых констант. Увидеть его можно, открыв в Инспекторе Объектов свойство Color, например, той же Формы.
Следующая таблица содержит некоторые свойства и методы канвы:
Процедура TextOut(X, Y: Integer; const Text: WideString); Производит вывод строки Text начиная с (X, Y) - левого верхнего пиксела текста. Свойство TextWidth(var Text: String): Integer; Содержит длину строки Text в пикселах. Свойство TextHeight(var Text: String): Integer; Содержит высоту строки Text в пикселах. Процедура MoveTo(X, Y: Integer); Производит перемещение позиции к пикселу с адресом (X, Y). Процедура LineTo(X, Y: Integer); Производит рисование прямой линии из точки текущей позиции к пикселу с адресом (X, Y). Адрес (X, Y) становится точкой текущей позиции. Процедура FillRect(const Rect: TRect); Заполняет прямоугольник Rect на холсте, используя текущую кисть. Может использоваться, в том числе, для стирания части изображения на холсте.
Напишем, используя только эти методы канвы, приложение для изображения на канве компонента Image текста, который вводится в компонент Memo: http://www.delphi-manual.ru/MemoToImage.JPG Расположите на форме компоненты Memo, Image (находится на странице Additional), Edit, UpDown (находится на странице Win32). Свойство Associate компонента UpDown приравняйте в выпадающем списке нашему компоненту Edit. Этим компонентом мы будем изменять размер шрифта. Поскольку и Memo и Image находятся у нас на одном устройстве вывода - на нашем экране, размер пиксела у них одинаков, и поэтому размеры изображения будут равны.
ервое, что мы сделаем, это инициализацию переменных при старте программы. Необходимо определить размеры области рисования (создадим для этого глобальную переменную Rect типа TRect) и сделать цвет фона Image белым:
procedure TForm1.FormCreate(Sender: TObject); begin Rect.Left:=0; Rect.Top:=0; Rect.Right:=Image1.Width; Rect.Bottom:=Image1.Height; Image1.Canvas.Brush.Color:=clWhite; end;
Затем нарисуем рамку по сторонам Image:
procedure TForm1.page; begin with Image1.Canvas do begin MoveTo(0, 0); LineTo(Image1.Width-1, 0); LineTo(Image1.Width-1, Image1.Height-1); LineTo(0, Image1.Height-1); LineTo(0, 0); end; end;
Попробуем, что получилось. Всё работает, но рамка пока не выводится. Поэтому добавим процедуру page в в процедуру FormCreate. Теперь красиво. Далее напишем простую процедуру стирания, очищения Image. Её нужно будет вызывать перед любым обновлением изображения, иначе предыдущее и последующее изображения будут перекрываться.
procedure TForm1.clearing; begin Image1.Canvas.FillRect(Rect); //Прямоугольник Rect заполняется белым цветом, изображение стирается. end;
Теперь пришла очередь непосредственно процедуры вывода текста. Начнём выводить текст от точки (3, 3) - верхнего левого угла листа, с небольшим отступом в 3 пиксела. Каждую последующую строку будем смещать на высоту строки:
procedure TForm1.prn; var i: Integer; begin with Image1.Canvas do for i:=1 to Memo1.Lines.Count do TextOut(3, 3+(i-1)*TextHeight('A'), Memo1.Lines[i-1]); end;
Теперь всё готово для вывода текста. Делать это будем по событию OnChange:
procedure TForm1.Memo1Change(Sender: TObject); begin clearing; prn; page; end;
Ну и напоследок процедура изменения размера шрифта:
procedure TForm1.Edit1Change(Sender: TObject); begin Memo1.Font.Size:=UpDown1.Position; Image1.Canvas.Font.Size:=UpDown1.Position; Memo1Change(Sender); end;
Можно модифицировать эту программу для вывода текста на печать. Для работы с принтером нужно подключить модуль Printers:
unit Unit1;
Interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Printers;
При работе с принтером как с полотном для начала печати вызывается метод BeginDoc, затем производится вывод документа, завершается печать вызовом метода EndDoc:
Printer.BeginDoc; with Printer.Canvas do begin ... Печать документа ... end; Printer.EndDoc;
Ширина и высота полотна принтера доступны через свойства Printer.PageWidth и Printer.PageHeight. Закончить печать на одной странице и начать печатать на другой можно с помощью метода Printer.NewPage.
[ Skype ] [ Профиль ] [ Mods Pack ] [ VK ] [ Геймеры ] Помогаю новичкам, по всем вопросом комне в Skype/VK. VK ВЗЛОМАН, НЕ РАБОТАЙТЕ СОМНОЙ. МНЕ ВСЁ ВЗЛОМАЛИ СКАЙП И ВК. СКАЙП ВОССТОНОВИЛ.
|
|
|
|
Charlatan |
Дата: Вторник, 09.04.2013, 09:03 | Сообщение # 2
|
Боец
Сообщений: 134
Статус: Offline
|
Чуток не понятно: procedure TForm1.prn; var i: Integer; begin with Image1.Canvas do for i:=1 to Memo1.Lines.Count do TextOut(3, 3+(i-1)*TextHeight('A'), Memo1.Lines[i-1]); end;
|
|
|
|
[CM]Карондаш |
Дата: Суббота, 11.05.2013, 19:41 | Сообщение # 3
|
Новичок
Сообщений: 5
Статус: Offline
|
Мне не понять , но + поставлю, старался, вижу :3 Хоть и давняя тема
Братюни :3
Сообщение отредактировал [CM]Карондаш - Суббота, 11.05.2013, 19:43 |
|
|
|