Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.06.04;
Скачать: [xml.tar.bz2];

Вниз

Сделать обводку текста   Найти похожие ветки 

 
Ray ©   (2006-05-15 16:06) [0]

Вывожу строку через TextOut.
Как сделать обводку этого текста линией указанного цвета и толщины?


 
Gydvin ©   (2006-05-15 16:16) [1]

pen


 
KilkennyCat ©   (2006-05-15 17:25) [2]

Вывести четыре раза дополнительно, со смещением координат.


 
Джо ©   (2006-05-15 17:27) [3]

> Ray ©   (15.05.06 16:06)
> Вывожу строку через TextOut.
> Как сделать обводку этого текста линией указанного цвета
> и толщины?

Используй Path functions. Очень рекоммендую.


 
Джо ©   (2006-05-15 17:39) [4]

Вот небольшой пример с TImage:

procedure TForm1.Button1Click(Sender: TObject);
begin
 with Image1.Canvas do
 begin
   BeginPath(Handle);
   try
     Brush.Style := bsClear;
     Font.Name := "Arial";
     Font.Size := 24;
     TextOut(10,10,"Test string");
     Pen.Color := clBlack;
     Pen.Width := 1;
   finally
     EndPath(Handle)
   end;

   Brush.Style := bsSolid;
   Brush.Color := clYellow;

   StrokeAndFillPath(Handle);
 end;
end;


 
Desdechado ©   (2006-05-15 18:25) [5]

DrawText
подходит и для вывода текста, а также для вычисления прямоугольника, в который он будет вписан (как раз для обводки)
параметр DT_CALCRECT


 
Джо ©   (2006-05-15 18:27) [6]

Хм. Я почему-то подумал, что "обводка" — это обведение контура букв. Потому и предложил [3], [4].
Если просто описаный прямоугольник сделать, то достаточно [5].


 
Ray ©   (2006-05-15 21:42) [7]

Именно обводка букв нужна. Спасибо.


 
Ray ©   (2006-05-15 22:07) [8]

>Вот небольшой пример с TImage:

То, что нужно :)
Но если толщина обводки указана=0, все равно рисуется
обводка толщиной в один пиксель. Можно, конечно проверку поставить
на толщину, но может, есть более простой способ?


 
Джо ©   (2006-05-15 22:11) [9]

> [8] Ray ©   (15.05.06 22:07)

Наверное, самое простое — это именно "проверочка" :)


 
Джо ©   (2006-05-15 22:13) [10]

Тем более, что
If Width is set to a value less than 1, the pen is given a Width of 1.
(с) Delphi Help по TPen.Width.


 
Ray ©   (2006-05-15 23:00) [11]

еще 2 траблы :)
1.обводка рисуется в обе стороны, убивая при этом надпись.
Т.е., видимо, надо надпись без обводки вывести еще раз поверх этого
дела.  Вопрос: как это делается?

2.вывожу текст я на canvas от PaintBox. Их у меня несколько. Можно ли сделать вывод одной процедурой, в которую бы передавалось имя? (или что?) этого PaintBox"а ?


 
Ray ©   (2006-05-15 23:31) [12]

Первый вопрос снят :)


 
Джо ©   (2006-05-15 23:34) [13]

> .вывожу текст я на canvas от PaintBox.

Не нужно выводить на канву PaintBox. Принцип такой. Заводишь промежуточный TBitmap, рисуешь, когда нужно, на его канве. В обработчике OnPaint TPaintBox"а копируешь изображение промежуточного TBitmap на канву PaintBox"а.


 
Джо ©   (2006-05-15 23:36) [14]

> Можно ли сделать вывод одной процедурой, в которую бы передавалось
> имя? (или что?) этого PaintBox"а ?

Сделай универсальную процедуру, в которую передается Сanvas. Тогда одной процедурой можно рисовать на чьей угодно канве, хоть формы, хоть TImage"а, хоть принтера.


 
Zeqfreed ©   (2006-05-15 23:36) [15]

2. Можно. Как раз таки передавать параметром необходимый пэйнт-бокс.
Примерно так:
function Sample(DrawTo : TPaintBox);
begin
 with DrawTo do begin
  . . .
 end;
end;


 
Джо ©   (2006-05-15 23:38) [16]

> [15] Zeqfreed ©  

Не есть хорошо. В процедуру передается больше сведений, чем ей положено иметь.


 
Ray ©   (2006-05-15 23:49) [17]

>Сделай универсальную процедуру, в которую передается Сanvas. Тогда >одной процедурой можно рисовать на чьей угодно канве, хоть формы, хоть >TImage"а, хоть принтера.

Можно пример? Что-то я трудно врубаюсь :(

Мне надо выводить текст на что-то, что потом можно будет (вместе с этой надписью) таскать по экрану. PaintBox на мой взгляд хорошо подходит для этой цели.


 
KilkennyCat ©   (2006-05-15 23:55) [18]


> выводить текст на что-то, что потом можно будет (вместе
> с этой надписью) таскать по экрану. PaintBox


Просто выводить его. Координаты вывода менять от координат курсора.
Для более плавного, выводить на TBitMap, а его уже biblt на паинтбокс.


 
Джо ©   (2006-05-15 23:56) [19]

> [17] Ray ©   (15.05.06 23:49)
> >Сделай универсальную процедуру, в которую передается Сanvas.
> Тогда >одной процедурой можно рисовать на чьей угодно канве,
> хоть формы, хоть >TImage"а, хоть принтера.
>
> Можно пример? Что-то я трудно врубаюсь :(


procedure DrawOutlinedText (ACanvas: TCanvas; ...);
begin
 with ACanvas do
 begin
   ...
 end;
end;


 
Ray ©   (2006-05-16 10:25) [20]

>Заводишь промежуточный TBitmap

Где находится этот компонент? Что-то не могу найти :(

>В обработчике OnPaint TPaintBox"а копируешь изображение промежуточного >TBitmap на канву PaintBox"а.

Как это делается?

>procedure DrawOutlinedText (ACanvas: TCanvas; ...);

а как вызывает ее?
Так? DrawOutlinedText (Bitmap1.Canvas, ...);


 
Ray ©   (2006-05-16 12:40) [21]

>В обработчике OnPaint TPaintBox"а копируешь изображение промежуточного >TBitmap на канву PaintBox"а.
>Как это делается?

При этом фон изображения TBitmap тоже скопируется?
Мне этого не надо, т.к. текст надо накладывать на картинку.


 
Ray ©   (2006-05-17 14:48) [22]

Еще бага: нарисованный вышеприведенной процедурой текст стирается, если провести по нему посторонинм окном. Как это победить?


 
KilkennyCat ©   (2006-05-17 14:55) [23]


> При этом фон изображения TBitmap тоже скопируется?


если непрозрачный.


> нарисованный вышеприведенной процедурой текст стирается,
> если провести по нему посторонинм окном. Как это победить?


нарисовать еще раз. И в этом случае [18] становится еще более удобней.


 
Джо ©   (2006-05-17 15:08) [24]

> [22] Ray ©   (17.05.06 14:48)
> Еще бага: нарисованный вышеприведенной процедурой текст
> стирается, если провести по нему посторонинм окном. Как
> это победить?


См. [13].


 
Ray ©   (2006-05-17 15:39) [25]

>> При этом фон изображения TBitmap тоже скопируется?
>если непрозрачный.

Как задать прозрачный?


 
Ray ©   (2006-05-17 15:41) [26]

Джо, ответь, плз на  [20]


 
Джо ©   (2006-05-17 15:54) [27]

> [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-18 12:12) [28]

Спасибище!


 
Ray ©   (2006-05-18 22:35) [29]

Еще грабля:

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 22:42) [30]

Причем это не работает только на одной конкретной форме.
Если этим кодом рисовать на другую -- все рисуется как надо.
Ниччче не понимаю :(


 
Ray ©   (2006-05-19 00:01) [31]

Странно, но если выкинуть Pen.Mode:=pmBlack;
то начинает работать.


 
Ray ©   (2006-05-19 00:07) [32]

Самая важная задача:
надо вывести одновременно:
1.фоновую картинку
2.текст с обводкой (несколько независимых строк, которые надо будет
по этому фону таскать)
3.рамку из пунктирной линии поверх всего этого

Я пытался сделать это через Image, но обломался, т.к. при попытке что-либо на нем нарисовать, он моментально становится непрозрачным :(

Как быть?


 
Ray ©   (2006-05-19 21:22) [33]

Джо, я верю, что ты знаешь, как это сделать! :)


 
Джо ©   (2006-05-19 21:32) [34]

Я, конечно, очень польщен, но не нужно так откровенно превращать ветку в личную переписку. Зарежут ветку.

Формировать картинку нужно тогда не на канве Bitmap"а, и уж тем более не на каком TImage"е. Рисуй картинку на TMetafileCanvas, создай TMetafile, а затем уже, когда будешь выводить итоговую картинку, копируй на него метафайл.

Сорри, сейчас нет времени написать пример. Посмотре примеры в Справке по TMetafile, TMetafileCanvas.


 
Джо ©   (2006-05-19 21:41) [35]

Или, может я не совсем разобрался с тем, что нужно получить.

В общем, вот быстрый пример, показывающий принцип работы с канвой метафайла, может, пригодится.
В 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;



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2006.06.04;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.54 MB
Время: 0.052 c
15-1147090760
Alexis
2006-05-08 16:19
2006.06.04
Трансляция хоккейного матча Россия-Беларусь


15-1147356788
Петр
2006-05-11 18:13
2006.06.04
Delphi


3-1144513827
VadimSpb
2006-04-08 20:30
2006.06.04
Экспорт в Excel


11-1128018077
Zoom
2005-09-29 22:21
2006.06.04
Как убрать приложение с таскбара...


2-1147861060
manevil
2006-05-17 14:17
2006.06.04
xml





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский