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

Вниз

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

 
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 вся ветка

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

Наверх





Память: 0.56 MB
Время: 0.006 c
10-1152847014
Rossiev
2006-07-14 07:16
2009.02.22
Как вставить построенный MSGraph в Excel?


4-1205732698
vi_RUS
2008-03-17 08:44
2009.02.22
Как вместо одного клика мыши генерить шесть?


3-1215403733
Spot
2008-07-07 08:08
2009.02.22
Экспорт из MySQL в Access


2-1231927823
smartleds
2009-01-14 13:10
2009.02.22
Уважаемый All, есть процедура FormCreate поясните как


6-1199304455
istok
2008-01-02 23:07
2009.02.22
Мониторинг трафика





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский