![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Сделать обводку текста [D5]
Ray © (2006-05-15 16:06:00)Вывожу строку через TextOut.
Как сделать обводку этого текста линией указанного цвета и толщины?
Джо (2006-05-19 21:41:00) [1]Или, может я не совсем разобрался с тем, что нужно получить.
В общем, вот быстрый пример, показывающий принцип работы с канвой метафайла, может, пригодится.
В Image1 уже должен быть в design-time загружен битмап. Показываю, как наложить на него изображение, нарисованное на канфе метафайла.
procedure DrawStamp (ACanvas: TCanvas);
begin
with ACanvas do
begin
BeginPath(Handle);
try
Brush.Style := bsClear;
Font.Name := 'Arial';
Font.Size := 24;
TextOut(0,0,'Test string');
finally
EndPath(Handle)
end;
Pen.Color := clBlack;
Pen.Width := 1;
Brush.Style := bsSolid;
Brush.Color := clYellow;
StrokeAndFillPath(Handle);
end;
// ну тут еще рисуем все, что нужно "накладывать" на основную картинку
end;
procedure TForm23.Button1Click(Sender: TObject);
var
Mf: TMetafile;
Mfc: TMetafileCanvas;
begin
Mf := TMetafile.Create;
try
Mfc := TMetafileCanvas.Create(Mf,0);
try
DrawStamp(Mfc);
finally
Mfc.Free;
end;
Image1.Canvas.Draw(100,100,Mf);
finally
Mf.Free;
end;
end;
Джо (2006-05-19 21:32:00) [2]Я, конечно, очень польщен, но не нужно так откровенно превращать ветку в личную переписку. Зарежут ветку.
Формировать картинку нужно тогда не на канве Bitmap'а, и уж тем более не на каком TImage'е. Рисуй картинку на TMetafileCanvas, создай TMetafile, а затем уже, когда будешь выводить итоговую картинку, копируй на него метафайл.
Сорри, сейчас нет времени написать пример. Посмотре примеры в Справке по TMetafile, TMetafileCanvas.
Ray (2006-05-19 21:22:00) [3]Джо, я верю, что ты знаешь, как это сделать! :)
Ray (2006-05-19 00:07:00) [4]Самая важная задача:
надо вывести одновременно:
1.фоновую картинку
2.текст с обводкой (несколько независимых строк, которые надо будет
по этому фону таскать)
3.рамку из пунктирной линии поверх всего этого
Я пытался сделать это через Image, но обломался, т.к. при попытке что-либо на нем нарисовать, он моментально становится непрозрачным :(
Как быть?
Ray (2006-05-19 00:01:00) [5]Странно, но если выкинуть Pen.Mode:=pmBlack;
то начинает работать.
Ray (2006-05-18 22:42:00) [6]Причем это не работает только на одной конкретной форме.
Если этим кодом рисовать на другую -- все рисуется как надо.
Ниччче не понимаю :(
Ray (2006-05-18 22:35:00) [7]Еще грабля:
With Form1.Image1.Canvas do
begin
Pen.Style:=psDashDot;
Pen.Mode:=pmBlack;
Pen.Width:=1;
Pen.Color:=clBlack;
MoveTo(0,0);
LineTo(100,100);
end;
Какой бы стиль Pen'а не ставил, все равно всегда выводится СПЛОШНАЯ линия :(
Где глюк искать?
Ray (2006-05-18 12:12:00) [8]Спасибище!
Джо (2006-05-17 15:54:00) [9]> [26] Ray © (17.05.06 15:41)
> Джо, ответь, плз на [20]
type
TForm22 = class(TForm)
PaintBox1: TPaintBox;
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure PaintBox1Paint(Sender: TObject);
private
TempBitmap: TBitmap;
public
end;
var
Form22: TForm22;
implementation
{$R *.dfm}
// Процедура рисования
// рисует на временном битмапе
procedure TForm22.Button1Click(Sender: TObject);
begin
TempBitmap.Canvas.Rectangle(3,4,30,40);
PaintBox1.Refresh;
end;
// Создаем временный битмэп
// с размерами пэйнтбокса
procedure TForm22.FormCreate(Sender: TObject);
begin
TempBitmap := TBitmap.Create;
TempBitmap.Width := PaintBox1.Width;
TempBitmap.Height := PaintBox1.Height;
end;
// При уничтожении формы уничтожаем временный битмэп
procedure TForm22.FormDestroy(Sender: TObject);
begin
TempBitmap.Free;
end;
// Когда системе понадобится обновить изображение
// на PaintBox, будет вызван этот обработчик события
procedure TForm22.PaintBox1Paint(Sender: TObject);
begin
// просто копируем содержимое временного битмапа
// на наш пэйнтбокс
PaintBox1.Canvas.Draw(0,0,TempBitmap);
// ...а можно и так
BitBlt (PaintBox1.Canvas.Handle,0,0,PaintBox1.Width,PaintBox1.Height,
TempBitmap.Canvas.Handle,0,0,SRCCOPY);
end;
end.
Ray (2006-05-17 15:41:00) [10]Джо, ответь, плз на [20]
Ray (2006-05-17 15:39:00) [11]>> При этом фон изображения TBitmap тоже скопируется?
>если непрозрачный.
Как задать прозрачный?
Джо (2006-05-17 15:08:00) [12]> [22] Ray © (17.05.06 14:48)
> Еще бага: нарисованный вышеприведенной процедурой текст
> стирается, если провести по нему посторонинм окном. Как
> это победить?
См. [13].
KilkennyCat (2006-05-17 14:55:00) [13]
> При этом фон изображения TBitmap тоже скопируется?
если непрозрачный.
> нарисованный вышеприведенной процедурой текст стирается,
> если провести по нему посторонинм окном. Как это победить?
нарисовать еще раз. И в этом случае [18] становится еще более удобней.
Ray (2006-05-17 14:48:00) [14]Еще бага: нарисованный вышеприведенной процедурой текст стирается, если провести по нему посторонинм окном. Как это победить?
Ray (2006-05-16 12:40:00) [15]>В обработчике OnPaint TPaintBox'а копируешь изображение промежуточного >TBitmap на канву PaintBox'а.
>Как это делается?
При этом фон изображения TBitmap тоже скопируется?
Мне этого не надо, т.к. текст надо накладывать на картинку.
Ray (2006-05-16 10:25:00) [16]>Заводишь промежуточный TBitmap
Где находится этот компонент? Что-то не могу найти :(
>В обработчике OnPaint TPaintBox'а копируешь изображение промежуточного >TBitmap на канву PaintBox'а.
Как это делается?
>procedure DrawOutlinedText (ACanvas: TCanvas; ...);
а как вызывает ее?
Так? DrawOutlinedText (Bitmap1.Canvas, ...);
Джо (2006-05-15 23:56:00) [17]> [17] Ray © (15.05.06 23:49)
> >Сделай универсальную процедуру, в которую передается Сanvas.
> Тогда >одной процедурой можно рисовать на чьей угодно канве,
> хоть формы, хоть >TImage'а, хоть принтера.
>
> Можно пример? Что-то я трудно врубаюсь :(
procedure DrawOutlinedText (ACanvas: TCanvas; ...);
begin
with ACanvas do
begin
...
end;
end;
KilkennyCat (2006-05-15 23:55:00) [18]
> выводить текст на что-то, что потом можно будет (вместе
> с этой надписью) таскать по экрану. PaintBox
Просто выводить его. Координаты вывода менять от координат курсора.
Для более плавного, выводить на TBitMap, а его уже biblt на паинтбокс.
Ray (2006-05-15 23:49:00) [19]>Сделай универсальную процедуру, в которую передается Сanvas. Тогда >одной процедурой можно рисовать на чьей угодно канве, хоть формы, хоть >TImage'а, хоть принтера.
Можно пример? Что-то я трудно врубаюсь :(
Мне надо выводить текст на что-то, что потом можно будет (вместе с этой надписью) таскать по экрану. PaintBox на мой взгляд хорошо подходит для этой цели.
Джо (2006-05-15 23:38:00) [20]> [15] Zeqfreed ©
Не есть хорошо. В процедуру передается больше сведений, чем ей положено иметь.