Может, это покажется странным, но все делается за 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 говорит, что все последующие операции будут производиться с компонентом (объектом) 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;
Теперь рассмотрим еще несколько подводных камней нашей программы. Конструкция Brush. Style: =TBrushStyle (Index) выбирает КИСТЬ В зависимости ОТ рисуемого в данный момент элемента. Всего существует восемь стилей кисти. Когда выдается сообщение onDrawrtem для первого элемента (об этом говорит параметр index, передаваемый в процедуру ListBoxiDrawitem), мы рисуем элемент с кистью первого стиля. Для второго элемента будет использоваться второй стиль кисти и т. д.
Карандаш будет прозрачным Pen.style: =psclear, это для того, чтобы не было никаких оборок. Попробуйте убрать эту строку и посмотреть на результат.
Функция Rectangle(x1,y2,х2,у2) рисует прямоугольник с соответствующими координатами. Дальше кисть делается прозрачной и задается цвет фона. После этого просто выводится текст строки с помощью функции TextOut (х, у/ текст).
Попробуйте сделать то же самое с компонентом тсошЬовох. Не забудьте про свойство style у этого компонента. А в остальном весь код будет таким же.
Еще один пример рисования в стандартных компонентах, который используется здесь с целью обучения работы с графикой- в строке состояния. Что имеется в виду под выражением "графические подсказки"? Все очень просто. Вы каждый день встречаете в программах строку состояния внизу экрана, в которой выскакивают подсказки. Сегодня мы посмотрим, как сделать текст в компоненте statusBar трехмерным.
На рис. показана форма, которая будет использоваться нами для вывода графической подсказки. Прежде чем приступить к программированию, надо вспомнить, как вообще выводятся подсказки. В листинге 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 на форме с небольшим смещением и разным цветом текста.