Рисование на стандартных Delphi компонентах

Может, это покажется странным, но все делается за 7 строк кода. Конечно же, в одну строку можно запи­сать и 20 операций, но этот случай не учитывается.

Секрет рисования заключается в том, что у компо­нента TListBoxl СВОЙСТВО style должно быть lbOwnerDrawFixed ИЛИ lbOwnerDrawVariable.

После этого создайте обработчик события onDrawitem для этого компонента и в нем напишите содержимое листинга:

 

procedure TForm1.ListBoxlDrawltem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState);

begin

with ListBoxi.Canvas do

begin

Brush.Color:=clRed; // Задаем красный цвет кисти.

Brush.Style:=TBrushStyle(Index); //Выбираем стиль кисти

Pen.Style:=psClear;

Rectangle(Rect.Left,Rect.Top,Rect.Left+100,Rect.Bottom);

Brush.Style:=bsClear;

Font.Color:=clBlue;

TextOut(Rect.Left+110,Rect.Top,IntToStr(index));

end;

end;

Вот и все. Программа готова, нажмите на запуск и наслаждайтесь. Только да­вайте посмотрим, что тут написано. Первая строка:

with ListBox1.Canvas do

Оператор with говорит, что все последующие операции будут производиться с компонентом (объектом) ListBoxl.canvas. Для того чтобы вы лучше понимали, код без этой строки показан в листинге:

 

procedure TForml.ListBoxlDrawItern(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState);

begin

ListBoxl.Canvas.Brush.Color:=clRed;

ListBoxl.Canvas.Brush.Style:=TBrushStyle(Index);

ListBoxl.Canvas.Pen.Style:=psClear;

ListBoxl.Canvas.Rectangle(Rect.Left,Rect.Top, Rect.Left+100,Rect.Bottom);

ListBoxl.Canvas.Brush.Style:=bsClear;

ListBoxl.Canvas.Font.Color:=clBlue;

ListBoxl.Canvas.TextOut(Rect.Left+110,Rect.Top,IntToStr(index));

end;

 

Как видите, в каждой строке появились подписи ListBoxl.canvas. Код стал очень некрасивым. Постоянно нужно говорить, что Brush или еще что-нибудь нуж­но взять у ListBox1.canvas. Поэтому и используется оператор With:

 

with ListBox1.Canvas do

begin

Brush.Color:=clRed;

Brush.Style:=TBrushStyle(Index);

Pen.Style:=psClear;

Rectangle(Rect.Left,Rect.Top, Rect.Left+100,Rect.Bottom);

end;

 

Рисование на стандартных Delphi компонентах

Теперь рассмотрим еще несколько подводных камней нашей программы. Кон­струкция Brush. Style: =TBrushStyle (Index) выбирает КИСТЬ В зависимости ОТ рисуемого в данный момент элемента. Всего существует восемь стилей кисти. Когда выдается сообщение onDrawrtem для первого элемента (об этом говорит параметр index, передаваемый в процедуру ListBoxiDrawitem), мы рисуем элемент с кистью первого стиля. Для второго элемента будет использоваться второй стиль кисти и т. д.

 

Карандаш будет прозрачным Pen.style: =psclear, это для того, чтобы не было никаких оборок. Попробуйте убрать эту строку и посмотреть на результат.

 

Функция Rectangle(x1,y2,х2,у2) рисует прямоугольник с соответствующими координатами. Дальше кисть делается прозрачной и задается цвет фона. После это­го просто выводится текст строки с помощью функции TextOut (х, у/ текст).

Попробуйте сделать то же самое с компонентом тсошЬовох. Не забудьте про свойство style у этого компонента. А в остальном весь код будет таким же.

 

Еще один пример рисования в стандартных компонентах, который используется здесь с целью обучения работы с графикой- в строке состояния. Что имеется в виду под выражением "графические подсказки"? Все очень просто. Вы каждый день встречаете в программах строку состояния внизу экрана, в которой выскакивают подсказки. Сегодня мы посмотрим, как сделать текст в компо­ненте statusBar трехмерным.

 

Рисование на стандартных Delphi компонентахНа рис. показана форма, которая будет использоваться нами для вывода графи­ческой подсказки. Прежде чем приступить к программированию, надо вспомнить, как вообще выводятся подсказки. В листинге 12.10 показан пример программы (точнее, часть про­граммы), которая выводит подсказки.

procedure TForm1.FormCreate(Sender: TObj ect); begin

Application.OnHint := ShowHint; end;

procedure TForm1.ShowHint(Sender: TObj ect); begin

StatusBarl.SimpleText:=Application.Hint; end;

Вспомним, что здесь происходит. В процедуре FormCreate (обработчик события onCreate для главной формы) мы устанавливаем в качестве обработчика события Application.onHint свою процедуру showHint. Теперь, когда будет происходить событие OnHint (т. е. когда нужно вывести подсказку), будет вызываться процедура showHint. В этой процедуре мы просто выводим подсказку в компонент StatusBar1.

 

Теперь можно переходить к графической подсказке. Полный исходный текст кода нового вида функции showHint вы можете увидеть в листинге:

 

procedure TForml.ShowHint(Sender: TObj ect);

var

1,t:Integer; begin StatusBarl.Repaint; with StatusBarl.Canvas do

begin

Brush.Style:=bsClear;

Font.Color:=clWhite;

1:=10;

t: =1;

TextOut(1, t,Application.Hint);

if RadioButtonl.Checked then begin inc(l); inc(t);

end

else begin dec (lb- dec (t) ;

end;

Font.Color:=clBlue;

TextOut(1,t,Application.Hint);

end;

end;

 

Здесь ничего сложного нет. Мы просто выводим два раза текст подсказки с раз­ным цветом и небольшим смещением. Это происходит точно так же, как и распо­ложение двух компонентов TLabei на форме с небольшим смещением и разным цветом текста.

Рисование на стандартных Delphi компонентах

 

dle

Помоги проекту! Расскажи друзьям об этом сайте: