Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.02.22;
Скачать: CL | DM;

Вниз

Вывод текста на канве   Найти похожие ветки 

 
gtr86   (2007-09-19 14:58) [0]

Здравствуйте уважаемые мастера, столкнулся с следующей проблемой: нужно реализовать небольшую прогу типа MSPaint, так вот, как добавить текст на канву как в паинте, т.е. сначала выделяется область для вводимого текста, после чего вводится сам текст.


 
DiamondShark ©   (2007-09-19 19:01) [1]

создаёшь TEdit, с размерами и положением подогнанными под выделенную область, размещаешь его поверх контрола, на канве которого рисуется, вводишь текст. потом TEdit разрушаешь, а в нужном месте канвы рисуешь введённый текст.


 
{RASkov} ©   (2007-09-19 21:59) [2]

> [1] DiamondShark ©   (19.09.07 19:01)

> gtr86
При перемещении эдит будет "затирать" канву "под собой"....
здесь либо
1) обновлять после(или лучше в момент) перемещения эдита рисунок на канве, если он конечно автоматом не обновляется (TImage например)
2) Два битмапа. 1й - фон, 2й - текст. На 3й битмап(т.е. Канву вывода) выводим фон, затем текст.... при смене позиции текста перерисовываем с новыми координатами "слоя" с текстом. По завершению "слой "текст"" объеденить со "слоем "фон"".
PS Ну и понятно, что у "слоя - текст" - транспарент выставлен... ну и копировать на фон BitBlt(..., SRCAND).


 
antonn ©   (2007-09-19 23:04) [3]

а вот не надо пользоваться канвой как "хранилищем информации" (блин слово забыл, ниче умнее не придумалось:)), использовать Битмап, на котором фон, выводить фон, выводить Едит, и ничего затираться не будет


 
Инс ©   (2007-09-19 23:11) [4]

Я поддерживаю DiamondShark, правда с некторыми оговорками, в прочем, я автору вопроса все уже по этому поводу сказал, правда не здесь :)


> При перемещении эдит будет "затирать" канву "под собой"....

Ничего он не будет затирать, рисовать нужно просто не где попало, а где нужно, а именно - в ответ на сообщение WM_PAINT. Например, если автор использует TPaintBox - то в событии OnPaint, если автор написал свой контрол от TGraphicControl или TCustomControl - то перекрыть метод Paint. И не нужно никогда рисовать на TImage, он не для этого предназначен. Вот вам статья, читайте, разбирайтесь:
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=93


 
homm ©   (2007-09-19 23:13) [5]

> [4] Инс ©   (19.09.07 23:11)
> не где попало, а где нужно, а именно…

… на компоненте TImage. Тогда никуда отвечать не нужно.


 
Инс ©   (2007-09-19 23:19) [6]


> [5] homm ©   (19.09.07 23:13)

Извините, но ваш совет - бред. Из пушки по воробьям. Лень свой контрол от TGraphicControl вывести? Или TPaintBox-ом пользоваться не умеем? Нет, нужно тащить за собой кучу ненужного функционала. Удачи, ребята...


 
homm ©   (2007-09-19 23:20) [7]

> [6] Инс ©   (19.09.07 23:19)

Как это «Из пушки по воробьям» ???

> [0] gtr86   (19.09.07 14:58)
> нужно реализовать небольшую прогу типа MSPaint


 
Инс ©   (2007-09-19 23:23) [8]


> [7] homm ©   (19.09.07 23:20)

А нахрена табе в этом поле для рисования все свойтва и методы класса TImage?


 
Инс ©   (2007-09-19 23:30) [9]

Любители забивать гвозди телевизором, блин...


 
homm ©   (2007-09-19 23:47) [10]

> [8] Инс ©   (19.09.07 23:23)
> А нахрена табе в этом поле для рисования все свойтва и методы
> класса TImage?

Сам не понимаю, зачем. Мне лишь то свойство, что он бимэп автоматически создает и через канву к нему обращатся, кажется полезным, а для новичка совсем уж ценным.


 
Инс ©   (2007-09-19 23:53) [11]


>  [10] homm ©   (19.09.07 23:47)

Любой из предложенных мной вариантов дает то же самое, что тебе кажется ценным, плюс, лишен этих недостатков. И битмап никакой не создается, что позволяет конкретно экономить память, особенно, если этот битмап большой.


 
antonn ©   (2007-09-20 00:08) [12]

а я бы советовал битмар создавать, потому как потом можно прикрутить не только попиксельную обработку (не canvas.pixels, нее, а сканлайн минимум, хотя бы для качественного преобразовния палитры, либо блендинга другого битмапа с альфаканалом(либо вообще настраиваемой прозрачностью)), но и такие вещи, как рисование линий с антиалиасингом. + откат можно реализовать.


 
{RASkov} ©   (2007-09-20 02:40) [13]

> [4] Инс ©   (19.09.07 23:11)
> Ничего он не будет затирать, рисовать нужно просто не где
> попало, а где нужно

Хм... точно :) Я что-то и забыл про это (
>
Я тут на днях нечто подобное, что и автор затеял, делал.... только мне нужно было менять позицию текста в любой момент времени...
Вот я и сделал отрисовку "слоями".... ну и посоветовал так же....
Т.е. имеем картинку и например 5 текстовых(независимых) полей, в которых можно изменять как сам текст, так и их положение на общей картине...
Да.... у меня общая картина небольших размеров (ну максимум 300х300) и при большом кол-ве "псевдослоев" притормаживает немного при перерисовки
Для моих целей мне за глаза хватило этого, а вот автору может и не подойти..... Впрочем там наверняка можно оптимизировать прорисовку, но я пока забросил это дело :(
А с Эдитом можно только лишь правда как в МСПаинте - написал и зафиксировал :)


 
Дельфин   (2007-09-20 10:35) [14]

Вопрос в тему:
Пишу на канве текст. При этом под ним затирается прямоугольник фоновой картинки, выведенной на канву перед ним. Как сделать так, чтобы выводился только сам текст, а остальная область не затиралась?


 
Инс ©   (2007-09-20 10:38) [15]


> Дельфин   (20.09.07 10:35) [14]

Canvas.Brush.Style:=bsClear; ? Или я что-то не так понял?


 
DiamondShark ©   (2007-09-20 12:57) [16]


> Дельфин   (20.09.07 10:35) [14]

SetBkMode


 
gtr86   (2007-09-20 21:29) [17]

Всем спасибо за активное участие. Дела обстоят следующим образом:
я воспользовался компонентом RichView, в котором можно использовать рисунок в качестве фона. Полдела сделано: текст вводится нормально не влияя на канву с рисунком. Теперь остается только объединить изображение канвы с введенным текстом в RichView"e. Какие есть предложения?


 
Дельфин   (2007-09-20 22:21) [18]


> DiamondShark ©   (20.09.07 12:57) [16]
>
> > Дельфин   (20.09.07 10:35) [14]
>
> SetBkMode


Не пашет...

Указываю параметры шрифта:


Bitmap.Canvas.Font.Name:="Courier New";
Bitmap.Canvas.Font.Size:=16;
Bitmap.Canvas.Font.Color:=clGreen;
Bitmap.Canvas.Font.Style:=[];


Далее вывожу текст:


SetBkMode(Bitmap.Canvas.Handle,TRANSPARENT);
Bitmap.Canvas.TextOut(110,204,Player.Name);


В итоге текст выводится поверх черного прямоугольника, перекрывающего фон... Я не так что-то указал?


 
Дельфин   (2007-09-20 22:22) [19]

Инс ©   (20.09.07 10:38) [15]

> Дельфин   (20.09.07 10:35) [14]

Canvas.Brush.Style:=bsClear; ? Или я что-то не так понял?

Не работает


 
homm ©   (2007-09-20 22:23) [20]

> [19] Дельфин   (20.09.07 22:22)
> Canvas.Brush.Style:=bsClear;

а где Bitmap. ?


 
Дельфин   (2007-09-20 22:57) [21]


> homm ©   (20.09.07 22:23) [20]
> > [19] Дельфин   (20.09.07 22:22)> Canvas.Brush.Style:=bsClear;
> а где Bitmap. ?

Ну конечно же Bitmap!


Bitmap.Canvas.Brus.Style:=bsClear;
Bitmap.Canvas.TextOut(110,204,Player.Name);


Тот же результат - фон - черный прямоугольник - текст


 
Fenik ©   (2007-09-21 09:30) [22]

TImage - зло


 
gtr86   (2007-09-22 15:56) [23]

Проблема с выводом текста на канву решен. Воспользовался компонентом CoolForm, в составе которого есть TransparentMemo. После выделения области для текста появляется TransparentMemo в который ввожу текст. По завершению ввода текста передаю лайны (TransparentMemo.lines.strings[]) TextRect"у. Скрываю TransparentMemo. Усе. Всем удачи.


 
Дельфин   (2007-09-22 17:52) [24]

А без компонентов, тем паче сторонних что никак невозможно вывести текст на канву без прямоугольника, в который он вписан? Что-то слабо верится...


> Fenik ©   (21.09.07 09:30) [22]
> TImage - зло

Это было в чей адрес? Я и не думал им пользоваться!


 
Дельфин   (2007-09-22 17:57) [25]

По поводу текста без ненужного фона... А как делают шрифт в играх? Типа я встречал файл *.bmp, в котором написан весь алфавит. И в игре он выводится нормально... В каких программах можно сделать такой файл содержаший весь алфавит?


 
antonn ©   (2007-09-22 19:43) [26]

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


 
Denis_ ©   (2007-09-23 12:43) [27]


> > TImage - зло
>
> Это было в чей адрес? Я и не думал им пользоваться

Это было в адрес TImage"а.
паинт - тоже зло.


 
{RASkov} ©   (2007-09-23 13:50) [28]

> [27] Denis_ ©   (23.09.07 12:43)
> паинт - тоже зло

Паинт - TPaintBox?
А что же не зло-то тогда? :)
И почему паинт - зло?
:)


 
Дельфин   (2007-09-23 15:58) [29]


> antonn ©   (22.09.07 19:43) [26]
> в пайнте.шрифты эти делают по простой причине - они не зависят
> от шрифтов системы, на них можно делать эффекты и они быстро
> рисуются.можно такое сделать и в дельфи, не сложно ведь

То есть потом со шрифтом работают как со спрайтом? типа спрайт со множеством кадров анимации? Каждая анимация - отдельная буква, я правильно понимаю?


 
antonn ©   (2007-09-23 22:14) [30]

mspaint как раз не зло, очень удобный, а главное очень быстрый и позволяет увеличивать в 10 раз и точно не промахиваясь работать с пикселями.


>
> То есть потом со шрифтом работают как со спрайтом? типа
> спрайт со множеством кадров анимации? Каждая анимация -
> отдельная буква, я правильно понимаю?

ээ, ну да, наверное:) просто берется позиция букквы в алфавите, умножается на ширину одной буквы в битмапе и координата Х готова (ну эт для моношириных шрифтов), а потом просто копируется куда нужно


 
Дельфин   (2007-09-25 11:05) [31]

Кстати, а где достать программу для создания таких шрифтов. Весь яндекс облазил - находил только версии, которые делают английскую раскладку шрифта, а мне нужна русская! Обычного Courier New.


 
antonn ©   (2007-09-25 12:31) [32]

можно и самому написать, примерно так:
procedure TForm1.Button1Click(Sender: TObject);
var i,w,h:integer; bt:tbitmap;
begin
bt:=tbitmap.Create;
try
 bt.Canvas.Font.Name:="Courier New";
 bt.canvas.Font.Size:=12;
 h:=0;
 w:=0;
for i:=32 to 255 do begin
 if(h<bt.Canvas.TextHeight(char(i))) then h:=bt.Canvas.TextHeight(char(i));
 w:=w+bt.Canvas.TextWidth(char(i));
end;
 bt.Width:=w;
 bt.Height:=h;
 w:=0;
for i:=32 to 255 do begin
 bt.Canvas.TextOut( w, h-bt.Canvas.TextHeight(char(i)), char(i));
 w:=w+bt.Canvas.TextWidth(char(i));
end;
 bt.SaveToFile("C:\111.bmp");
finally
 bt.Free;
end;
end;


 
homm ©   (2007-09-25 12:31) [33]

> [31] Дельфин   (25.09.07 11:05)

А что, использовать тот Courier New, что в системе установлен, религия не позволяет?


 
homm ©   (2007-09-25 12:32) [34]

> [32] antonn ©   (25.09.07 12:31)

Курьер могоширийный :)


 
antonn ©   (2007-09-25 12:34) [35]


> Курьер могоширийный :)
>

мне пофиг, я показал как выводить, а там уж можно и сделать как себе удобней :)


 
antonn ©   (2007-09-25 12:36) [36]


>
> А что, использовать тот Courier New, что в системе установлен,
>  религия не позволяет?

если испульзется 3Д то, как мне думается (я плохо знаю, но смею думать:)), было бы куда быстрее выводить буковки спрайтами, нагружая на этот процесс видеокарту, а не мучать "рендер" винды с процессором. К тому же на корейской винде не будет кракозябров со спрайтами %)


 
homm ©   (2007-09-25 12:41) [37]

> [36] antonn ©   (25.09.07 12:36)
> если испульзется 3Д

Ты сабж читал? :)


 
antonn ©   (2007-09-25 13:10) [38]

мы уже давно то сабжа отошли :)


 
Дельфин   (2007-09-26 10:00) [39]

Все, уже не нужно. Написал программу, создающую BMP шрифт - супер! Без проблем можно работать со шрифтами, у которых различаются ширина разных символов, так что вообще отлично. Плюс проще находить символы - они расписаны не рядами, а в строчку. В общем - здорово! Приятно, когда сам находишь выход из ситуации.


 
Дельфин   (2007-09-26 10:31) [40]


> antonn ©   (25.09.07 12:36) [36]
> если испульзется 3Д


Почти угадал, 2Д. Не хочу последовать за кучей начинающих в таких делах - понапридумывать себе мега 3Д, перед которой все попадают на колени, а затем забросить, потому что оказалось сильно сложно. Хочу сначала сделать 2Д в стиле Fallout или хотя бы что-то вроде этого, а потом видно будет.


> homm ©   (25.09.07 12:41) [37]
> > [36] antonn ©   (25.09.07 12:36)> если испульзется 3Д
> Ты сабж читал? :)

Сам автор сабжа уже давно распрощался с этой темой. Я продолжил сюда писать, просто чтобы не заводить по сути такую же заново.



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

Текущий архив: 2009.02.22;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.012 c
15-1229590972
cvg
2008-12-18 12:02
2009.02.22
Где найти dbexpmysql.dll для MySQL 4.1?


15-1229611134
Добежал
2008-12-18 17:38
2009.02.22
На что заменить критические секции в Vista?


4-1206045437
i
2008-03-20 23:37
2009.02.22
Novell netware login name...


3-1215423344
flaxe
2008-07-07 13:35
2009.02.22
DBF Сеть


2-1231835371
Кирил
2009-01-13 11:29
2009.02.22
Как узнать - сколько дней в месяце?