Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.84/92: Рейтинг темы: голосов - 92, средняя оценка - 4.84
 Аватар для batmanrider
21 / 22 / 2
Регистрация: 20.09.2011
Сообщений: 196
Записей в блоге: 1

Обводка для текста на канве

20.04.2012, 15:02. Показов 18133. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Я через TEdit ввожу текст и он выводится на TImage.Canvas
Можно ли сделать обводку у текста и как(1 px чёрный цвет).
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
20.04.2012, 15:02
Ответы с готовыми решениями:

обводка текста
Подскажите как реализовать обводку текста, то есть есть текст надо сделать так к примеру

Обводка текста в Label?
Здравствуйте. Как в FMX у Label задать обводку текста или подскажите аналог где это возможно сделать. А именно задать толщину и цвет...

Обводка текста в QLabel
Как сделать обводку текста в QLabel? Например сам шрифт белый, но что бы не сливаться с фоном, он обведен в черный. Добавлено через 5...

13
 Аватар для Alex_pac
1302 / 708 / 107
Регистрация: 25.05.2011
Сообщений: 2,158
Записей в блоге: 51
20.04.2012, 15:18
что такое обводка?

****************************

модуль теней для TLabel (версия 0.3)

Модуль позволяет устанавливать неограниченное количество теней для Надписей.
Также есть возможность выделить весь текст рамкой.

подключив модуль теней после модуля StdCtrls , класс TLabel изменит свои свойтва, и можно управлять его тенью, и рамкой вокруг текста. Все тени сохраняются в внутри компонента в внутри TList. Поэтому при запуске дексруктора все подчищается.

текст модуля

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
unit LabelShadowUnit;
 
interface
uses
   SysUtils, Classes, Controls, StdCtrls;
type
  TLabel = class(StdCtrls.TLabel)
    procedure AddShadow(x: integer = 3; y: integer = 1; colorr : integer = 0);
    procedure AddShadowText(widthh : byte = 1; colorr : integer = 0);
    procedure ClearShadow;
  end;
 
implementation
 
{ TLabel }
 
procedure TLabel.AddShadow(x: integer = 3; y: integer = 1; colorr : integer = 0);
begin
  with TLabel.Create(self) do begin
    parent:=self.Parent;
    font:=self.Font;
    Top:=self.Top+y;
    Left:=self.Left+x;
    Font.Color:=colorr;
    caption:=self.Caption;
    transparent:=true;
  end;
  self.Transparent:=true;
  self.BringToFront;
end;
 
procedure TLabel.AddShadowText(widthh: byte; colorr: integer);
begin
  ClearShadow;
  // прямоугольник
  self.AddShadow(widthh,0, colorr);
  self.AddShadow(-1*widthh,0, colorr);
  self.AddShadow(0,widthh, colorr);
  self.AddShadow(0,-1*widthh, colorr);
  // по бокам
  self.AddShadow(widthh,widthh, colorr);
  self.AddShadow(-1*widthh,-1*widthh, colorr);
  self.AddShadow(-1*widthh,widthh, colorr);
  self.AddShadow(widthh,-1*widthh, colorr);
end;
 
procedure TLabel.ClearShadow;
begin
  self.DestroyComponents;
end;
end.
Миниатюры
Обводка для текста на канве  
Вложения
Тип файла: rar DelphiLabelShadow.rar (189.4 Кб, 158 просмотров)
1
 Аватар для batmanrider
21 / 22 / 2
Регистрация: 20.09.2011
Сообщений: 196
Записей в блоге: 1
20.04.2012, 15:29  [ТС]
Допустим, и как же мне всунуть его в канву?
0
 Аватар для Alex_pac
1302 / 708 / 107
Регистрация: 25.05.2011
Сообщений: 2,158
Записей в блоге: 51
20.04.2012, 15:59
на канву таким же макаром можно.

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
procedure CanvasTextShadow(Canvas:TCanvas; text:string;x,y:integer; sh_color: TColor = 0; sh_x: integer = 2; sh_y: integer = 1);
var c:TColor; st:TBrushStyle;
begin
  with Canvas do begin
  c:=Font.Color;
  st:=Brush.Style;
  Font.Color:=sh_color;
  TextOut(x+sh_x,y+sh_y,text);
  Font.Color:=c;
  Brush.Style:=bsClear;
  TextOut(x,y,text);
  Brush.Style:=st;
  end;
end;
 
procedure CanvasTextShadowBorder(Canvas:TCanvas; text:string;x,y:integer; sh_color: TColor = 0; width: integer = 1);
var c:TColor; st:TBrushStyle;
begin
  With Canvas do begin
    c:=Font.Color;
    st:=Brush.Style;
    Font.Color:=sh_color;
    TextOut(x+width,y+width,text);
    Brush.Style:=bsClear;
    TextOut(x-width,y-width,text);
    TextOut(x+width,y-width,text);
    TextOut(x-width,y+width,text);
    Canvas.Font.Color:=c;
    TextOut(x,y,text);
    Brush.Style:=st;
  end;
end;
Delphi
1
2
3
Image1.Canvas.Font.Size:=36;
  Image1.Canvas.Font.Color:=clWhite;
  CanvasTextShadowBorder(Image1.Canvas,Edit1.Text,10,10);
Миниатюры
Обводка для текста на канве  
4
0 / 0 / 0
Регистрация: 25.10.2011
Сообщений: 36
25.04.2012, 09:21
hi Alex_pac пытаюсь реализовать Ваш пример т.е. вывести на канву текст с обводкой.

добавляю процедуры в модуль, delphi рудается что не продеклорировал... хотя в разделе type процедуру объявляю...

Где ошибка м.б.?

Кусок Кода
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, Menus, Buttons;
 
type
  TForm1 = class(TForm)
    RadioGroup1: TRadioGroup;
    MainMenu1: TMainMenu;
    N1: TMenuItem;
    N2: TMenuItem;
    N3: TMenuItem;
    N4: TMenuItem;
    N5: TMenuItem;
    N6: TMenuItem;
    PopupMenu1: TPopupMenu;
    N7: TMenuItem;
    N8: TMenuItem;
    N9: TMenuItem;
    N10: TMenuItem;
    BitBtn1: TBitBtn;
    procedure N2Click(Sender: TObject);
    procedure N3Click(Sender: TObject);
    procedure N4Click(Sender: TObject);
    procedure N6Click(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure RadioGroup1Click(Sender: TObject);
    procedure BitBtn1Click(Sender: TObject);
    procedure N8Click(Sender: TObject);
    procedure N9Click(Sender: TObject);
    procedure N10Click(Sender: TObject);
    procedure FormActivate(Sender: TObject);
    procedure CanvasTextShadowBorder(Canvas:TCanvas; text:string;x,y:integer; sh_color: TColor = 0; width: integer = 1);
  private
    { Private declarations }
  public
    { Public declarations }
 
  end;
 
var
  Form1: TForm1;
  s: string;
  col:integer;
 
implementation
 
{$R *.dfm}
 
procedure CanvasTextShadowBorder(Canvas:TCanvas; text:string;x,y:integer; sh_color: TColor = 0; width: integer = 1);
var c:TColor; st:TBrushStyle;
begin
  With Canvas do begin
    c:=Font.Color;
    st:=Brush.Style;
    Font.Color:=sh_color;
    TextOut(x+width,y+width,text);
    Brush.Style:=bsClear;
    TextOut(x-width,y-width,text);
    TextOut(x+width,y-width,text);
    TextOut(x-width,y+width,text);
    Canvas.Font.Color:=c;
    TextOut(x,y,text);
    Brush.Style:=st;
  end;
end;
 
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
  Canvas.Font.Color:= col;
  Canvas.Font.Name:='Arial';
  Canvas.Font.Size:=40;
  //Canvas.Font.Style:=fsBold;
//  Canvas.TextOut(10, 10, 'НАТАША');
CanvasTextShadowBorder(Canvas,'НАТАША',10,10);
end;
0
Житель Земли
 Аватар для DenNik
3004 / 3026 / 390
Регистрация: 26.07.2011
Сообщений: 11,465
Записей в блоге: 1
25.04.2012, 09:45
Цитата Сообщение от Alex_pac Посмотреть сообщение
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
procedure TLabel.AddShadowText(widthh: byte; colorr: integer);
begin
 ClearShadow;
 // прямоугольник
 self.AddShadow(widthh,0, colorr);
 self.AddShadow(-1*widthh,0, colorr);
 self.AddShadow(0,widthh, colorr);
 self.AddShadow(0,-1*widthh, colorr);
 // по бокам
 self.AddShadow(widthh,widthh, colorr);
 self.AddShadow(-1*widthh,-1*widthh, colorr);
 self.AddShadow(-1*widthh,widthh, colorr);
 self.AddShadow(widthh,-1*widthh, colorr);
end;
создается восемь дополнительных меток. тебе не кажется, что это нерациональное использование памяти? Да и вообще коряво.
0
 Аватар для Alex_pac
1302 / 708 / 107
Регистрация: 25.05.2011
Сообщений: 2,158
Записей в блоге: 51
25.04.2012, 10:39
это нерациональное использование памяти? Да и вообще коряво
Картинка куда больше весить будет. А причем тут использование памяти? Вся память тут ссылается на Главный TLabel и в случае чего деструктор все прочистит.

За минимальное колво строчек пода получаем вполне себе результат. Разве это не главное?
0
 Аватар для Alex_pac
1302 / 708 / 107
Регистрация: 25.05.2011
Сообщений: 2,158
Записей в блоге: 51
25.04.2012, 10:47
Цитата Сообщение от casper200 Посмотреть сообщение
hi Alex_pac пытаюсь реализовать Ваш пример т.е. вывести на канву текст с обводкой.
Delphi
1
2
3
4
Canvas.Font.Color:= clWhite; // цвет надо указать
Canvas.Font.Name:='Arial';
Canvas.Font.Size:=40;
CanvasTextShadowBorder(Canvas,'НАТАША',10,10);
Вложения
Тип файла: zip 12122.zip (217.6 Кб, 32 просмотров)
1
 Аватар для Alex_pac
1302 / 708 / 107
Регистрация: 25.05.2011
Сообщений: 2,158
Записей в блоге: 51
25.04.2012, 22:43
дабы не возникало вопросов что не работает и тп. вот исходник-пример работы этих двух процедур.
Миниатюры
Обводка для текста на канве  
Вложения
Тип файла: rar тень canvas text.rar (189.0 Кб, 137 просмотров)
1
0 / 0 / 0
Регистрация: 25.10.2011
Сообщений: 36
27.04.2012, 08:45
hi Alex_pac
Реализовал как в твоем примере, только по заданию мне нужно, на конве формы выводить надпись...
в связи с этим 2 вопроса.
1. как вывести надпись на канву без кнопки, т.е. что при создании и показе формы надпись сразу присутствовала? пихал процедуру и в FormShow и в FormCreate надпись не появляется.
2. + когда меняю ее цвет (надписи) она появляется на белом прямоугольнике, как это обойти, пока фон формы не сменю, (он этот белый прямоугольник под надписью не исчезает).
Исходник

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, Menus, Buttons;

type
TForm1 = class(TForm)
RadioGroup1: TRadioGroup;
MainMenu1: TMainMenu;
N1: TMenuItem;
N2: TMenuItem;
N3: TMenuItem;
N4: TMenuItem;
N5: TMenuItem;
N6: TMenuItem;
PopupMenu1: TPopupMenu;
N7: TMenuItem;
N8: TMenuItem;
N9: TMenuItem;
N10: TMenuItem;
BitBtn1: TBitBtn;
procedure N2Click(Sender: TObject);
procedure N3Click(Sender: TObject);
procedure N4Click(Sender: TObject);
procedure N6Click(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure RadioGroup1Click(Sender: TObject);
procedure BitBtn1Click(Sender: TObject);
procedure N8Click(Sender: TObject);
procedure N9Click(Sender: TObject);
procedure N10Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
// procedure CanvasTextShadowBorder(Canvas:TCanvas; text:string;x,y:integer; sh_color: TColor = 0; width: integer = 1);
private
{ Private declarations }
public
{ Public declarations }

end;

var
Form1: TForm1;
s: string;
col:integer;

implementation

{$R *.dfm}


procedure CanvasTextShadowBorder(Canvas:TCanvas; text:string;x,y:integer; sh_color: TColor = 0; width: integer = 1);
var c:TColor; st:TBrushStyle;
begin
With Canvas do begin
c:=Font.Color;
st:=Brush.Style;
Font.Color:=sh_color;
TextOut(x+width,y+width,text);
Brush.Style:=bsClear;
TextOut(x-width,y-width,text);
TextOut(x+width,y-width,text);
TextOut(x-width,y+width,text);
Canvas.Font.Color:=c;
TextOut(x,y,text);
Brush.Style:=st;
end;
end;

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
Form1.RadioGroup1;
Canvas.Font.Color:= col;
Canvas.Font.Name:='Arial';
Canvas.Font.Size:=40;
//Canvas.Font.Style:=fsBold;
// Canvas.TextOut(10, 10, 'НАТАША');
CanvasTextShadowBorder(Canvas,'НАТАША',5 0,20);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin

end;

procedure TForm1.FormShow(Sender: TObject);
begin
col:=clWhite;
// s:='автор: Н.А.Страшевская';
//Form1.BitBtn1.Click;
end;

procedure TForm1.N2Click(Sender: TObject);
begin//красный (надпись)
Col:= clRed;
Form1.BitBtn1.Click;
end;

procedure TForm1.N3Click(Sender: TObject);
begin//голубой (надпись)
Col:= clSkyBlue;
end;

procedure TForm1.N4Click(Sender: TObject);
begin//зеленый (надпись)
Col:= clGreen;
end;

procedure TForm1.N6Click(Sender: TObject);
begin//об авторе
ShowMessage('автор: Н.А.Страшевская');
end;

procedure TForm1.N8Click(Sender: TObject);
begin//красный (форма)
Form1.Color := clRed;
end;

procedure TForm1.N9Click(Sender: TObject);
begin//синий (форма)
Form1.Color := clBlue;
end;

procedure TForm1.N10Click(Sender: TObject);
begin//голубой (форма)
Form1.Color := clSkyBlue;
end;
procedure TForm1.RadioGroup1Click(Sender: TObject);
begin
if Form1.RadioGroup1.ItemIndex=0
then Form1.Color := clRed;

if Form1.RadioGroup1.ItemIndex=1
then Form1.Color := clBlue;

if Form1.RadioGroup1.ItemIndex=2
then Form1.Color := clSkyBlue;
end;

end.

Задание
Пункт меню Действие
Цвет -При нажатии изменяет цвет формы на заданный, при этом нарисованная надпись должна быть видна на форме.
Вложения
Тип файла: rar Kur.rar (209.0 Кб, 41 просмотров)
0
Заблокирован
27.04.2012, 09:06
batmanrider,
Подруби GDI+ и не мучайся. Там это есть.
0
 Аватар для Alex_pac
1302 / 708 / 107
Регистрация: 25.05.2011
Сообщений: 2,158
Записей в блоге: 51
27.04.2012, 12:15
событие onpaint отвечает за отрисовку

Canvas.Brush.Color - за цвет фона отрисовки

Delphi
1
2
3
4
5
6
7
8
procedure TForm1.FormPaint(Sender: TObject);
begin
  Canvas.Font.Color:= col;
  Canvas.Font.Name:='Arial';
  Canvas.Font.Size:=40;
  Canvas.Brush.Color:=Color;
  CanvasTextShadowBorder(Canvas,'НАТАША',20,20);
end;
Вложения
Тип файла: zip Kur.zip (256.7 Кб, 88 просмотров)
1
0 / 0 / 0
Регистрация: 25.10.2011
Сообщений: 36
28.04.2012, 06:50
hi ВЕЛИКИЙ Alex_pac

Низкий поклон тебе...
Код изящно подправил, смотрится красиво, работает отлично...
0
0 / 0 / 1
Регистрация: 01.05.2013
Сообщений: 22
09.07.2015, 12:22
Я дико извиняюсь за некропостинг, но возникла схожая задача, только с возможностью использования флагов DT_WORDBREAK , DT_END_ELLIPSIS и иже с ними. Возможно ли сделать что-то похожее?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
09.07.2015, 12:22
Помогаю со студенческими работами здесь

обводка текста с выводом на изображение
Можете подсказать как с помощью функции imagettftext можно организовать обводку текста каким-либо цветом. Например, мне нужно вывести...

Рисование текста на канве
Помогите пожалуйста разобраться с проблемой: текст Label1 не отображается на Panel1 void __fastcall TForm1::Button1Click(TObject...

Вывод текста на Канве с выравниванием "по правому краю"
Привет! Такой вопрос, как удобно выводить текст на Канве, если надо выравнивать его по правому краю. Т.е. в функциях TextOut и ...

Программа для рисования графика функций на канве
помгите разработать программу с помощью которой на канве будет рисоваться график функций. Обеспечить возможность изменения размера формы

Ломаная линия на канве для построения блок-схем
Приветствую всех, кому будет небезразлична моя просьба о помощи. На данный момент я пишу дипломную работу, тема которой - построение...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Валидация и контроль данных табличной части документа перед записью
Maks 22.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в КА2. Задача: контроль и валидация данных табличной части документа перед записью с учетом регламента компании. . .
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определённом условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru