Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Сделать обводку текста [D5]


Страницы:   1 2

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 ©  

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


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо