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

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

Вывод текста на канве [D7, WinXP]


Страницы:   1 2

gtr86 ©   (2007-09-19 14:58:00) 

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


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

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

а где Bitmap. ?


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

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

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

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

Не работает


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


> 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);


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


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

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


DiamondShark   (2007-09-20 12:57:00) [25]


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

SetBkMode


Инс   (2007-09-20 10:38:00) [26]


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

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


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

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


{RASkov}   (2007-09-20 02:40:00) [28]

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

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


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

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


Инс   (2007-09-19 23:53:00) [30]


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

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


homm   (2007-09-19 23:47:00) [31]

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

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


Инс   (2007-09-19 23:30:00) [32]

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


Инс   (2007-09-19 23:23:00) [33]


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

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


homm   (2007-09-19 23:20:00) [34]

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

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

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


Инс   (2007-09-19 23:19:00) [35]


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

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


homm   (2007-09-19 23:13:00) [36]

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

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


Инс   (2007-09-19 23:11:00) [37]

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


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

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


antonn   (2007-09-19 23:04:00) [38]

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


{RASkov}   (2007-09-19 21:59:00) [39]

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

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


DiamondShark   (2007-09-19 19:01:00) [40]

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


Страницы:   1 2

Наверх

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