Рисование на канве
От: Tirion  
Дата: 21.01.06 01:38
Оценка:
Помогите победить.

Как организовать отрисовку (DrawText()) смещение текста по вертикали со стилем кисти bsClear
Re: Рисование на канве
От: ekamaloff Великобритания  
Дата: 23.01.06 04:42
Оценка:
Здравствуйте, Tirion, Вы писали:

T>Помогите победить.


T>Как организовать отрисовку (DrawText()) смещение текста по вертикали со стилем кисти bsClear


В чем собственно проблема?

// ...
with Canvas do begin
    Brush.Style := bsClear;
    TextOut(X, Y, S);
end;
// ...


It is always bad to give advices, but you will be never forgiven for a good one.
Oscar Wilde
Re[2]: Рисование на канве
От: Tirion  
Дата: 23.01.06 06:27
Оценка:
Здравствуйте, ekamaloff, Вы писали:

E>Здравствуйте, Tirion, Вы писали:


T>>Помогите победить.


T>>Как организовать отрисовку (DrawText()) смещение текста по вертикали со стилем кисти bsClear


E>В чем собственно проблема?


E>
E>// ...
E>with Canvas do begin
E>    Brush.Style := bsClear;
E>    TextOut(X, Y, S);
E>end;
E>// ...
E>


E>


Проблема в том, что при смещении текст "размазывается" т.е. все последующие отрисовки накладываются на предидущие...
Re[2]: Рисование на канве
От: Tirion  
Дата: 23.01.06 06:35
Оценка:
вот пример:

var i: integer;
R: TRect;
begin
for i:=100 downto 0 do
begin
sleep(10);
with Canvas do
begin
Brush.Style := bsClear;
R:=Rect(0,i,0,0);
DrawText(Canvas.Handle,'test',-1,R,DT_NOCLIP);
end;
end;
end;
Re[3]: Рисование на канве
От: ekamaloff Великобритания  
Дата: 23.01.06 06:42
Оценка:
Здравствуйте, Tirion, Вы писали:

T>var i: integer;
T>    R: TRect;
T>begin
T>  for i:=100 downto 0 do
T>    begin
T>      sleep(10);
T>      with Canvas do
T>        begin
T>          Brush.Style := bsClear;
T>          R:=Rect(0,i * Canvas.TextHeight('0'),0,0);
T>          DrawText(Canvas.Handle,'test',-1,R,DT_NOCLIP);
T>        end;
T>    end;
T>end;


Ну дык текст то у тебя небось не в один пиксел высотой... Что ж ты хотел...
It is always bad to give advices, but you will be never forgiven for a good one.
Oscar Wilde
Re[4]: Рисование на канве
От: Tirion  
Дата: 23.01.06 06:56
Оценка:
Здравствуйте, ekamaloff, Вы писали:

E>Здравствуйте, Tirion, Вы писали:


E>
T>>var i: integer;
T>>    R: TRect;
T>>begin
T>>  for i:=100 downto 0 do
T>>    begin
T>>      sleep(10);
T>>      with Canvas do
T>>        begin
T>>          Brush.Style := bsClear;
T>>          R:=Rect(0,i * Canvas.TextHeight('0'),0,0);
T>>          DrawText(Canvas.Handle,'test',-1,R,DT_NOCLIP);
T>>        end;
T>>    end;
T>>end;
E>


E>Ну дык текст то у тебя небось не в один пиксел высотой... Что ж ты хотел...


и как победить? .. я не совсем понял...
Re[5]: Рисование на канве
От: Tirion  
Дата: 23.01.06 07:01
Оценка:
i * Canvas.TextHeight('0')


Это не совсем выход, т.к. старая отрисовка при этом не "затирается"... к тому же слишком большой шаг получается.
Re[4]: Рисование на канве
От: Tirion  
Дата: 23.01.06 07:41
Оценка:
Как бы то ни было... Нужно полностью перерисовывать канву, отображая на ней текст с новыми координатами.
А R:=Rect(0,i * Canvas.TextHeight('0'),0,0); позволяет лишь растянуть смазываемый текст, а это уже не что требуется.
Re[5]: Рисование на канве
От: ekamaloff Великобритания  
Дата: 23.01.06 09:15
Оценка:
Здравствуйте, Tirion, Вы писали:

T>Как бы то ни было... Нужно полностью перерисовывать канву, отображая на ней текст с новыми координатами.

T>А R:=Rect(0,i * Canvas.TextHeight('0'),0,0); позволяет лишь растянуть смазываемый текст, а это уже не что требуется.

Ты определись что тебе нужно... DrawText (как и другие GDI-шные функции рисования) и не должна затирать предыдущий текст, это совершенно нормальное поведение.

И не обязательно перерисовывать всю канву. Достаточно перерисовать старый участок, в котором был выведен текст.
It is always bad to give advices, but you will be never forgiven for a good one.
Oscar Wilde
Re[6]: Рисование на канве
От: Tirion  
Дата: 23.01.06 09:55
Оценка:
Здравствуйте, ekamaloff, Вы писали:

E>Здравствуйте, Tirion, Вы писали:


T>>Как бы то ни было... Нужно полностью перерисовывать канву, отображая на ней текст с новыми координатами.

T>>А R:=Rect(0,i * Canvas.TextHeight('0'),0,0); позволяет лишь растянуть смазываемый текст, а это уже не что требуется.

E>Ты определись что тебе нужно... DrawText (как и другие GDI-шные функции рисования) и не должна затирать предыдущий текст, это совершенно нормальное поведение.


E>И не обязательно перерисовывать всю канву. Достаточно перерисовать старый участок, в котором был выведен текст.


Это-то меня и интересует. Как это сделать?
Re[7]: Рисование на канве
От: Arioch2  
Дата: 23.01.06 10:33
Оценка:
T>Это-то меня и интересует. Как это сделать?

А что ты вообще хочешь сделать? бегщую строку ? так для того и компоненты есть, используют TTimer с Win32: IvalidateRect
Re[8]: Рисование на канве
От: Tirion  
Дата: 23.01.06 10:46
Оценка:
Здравствуйте, Arioch2, Вы писали:

T>>Это-то меня и интересует. Как это сделать?


A>А что ты вообще хочешь сделать? бегщую строку ? так для того и компоненты есть, используют TTimer с Win32: IvalidateRect


А ты не пробовал сделать бегущую строку с прозрачным фоном
SetBkMode(HDC, Transparent)
???
Re[9]: Рисование на канве
От: Arioch2  
Дата: 23.01.06 10:50
Оценка:
T>А ты не пробовал сделать бегущую строку с прозрачным фоном
SetBkMode(HDC, Transparent)
???


Извр какой. А он над несколькими компонентами ?
Нельзя как фон взять в точности то, что под строкой лежит ?

Ибо таки вся рисовка должна проходить через OnPaint /. Invalidate*
Re[10]: Рисование на канве
От: Tirion  
Дата: 23.01.06 12:11
Оценка:
Здравствуйте, Arioch2, Вы писали:

T>>А ты не пробовал сделать бегущую строку с прозрачным фоном
SetBkMode(HDC, Transparent)
???


A>Извр какой. А он над несколькими компонентами ?

A>Нельзя как фон взять в точности то, что под строкой лежит ?

A>Ибо таки вся рисовка должна проходить через OnPaint /. Invalidate*


Ну хотя бы над TImage ...
Re[11]: Рисование на канве
От: Arioch2  
Дата: 23.01.06 13:51
Оценка:
T>>>А ты не пробовал сделать бегущую строку с прозрачным фоном
SetBkMode(HDC, Transparent)
???


A>>Извр какой. А он над несколькими компонентами ?

A>>Нельзя как фон взять в точности то, что под строкой лежит ?

A>>Ибо таки вся рисовка должна проходить через OnPaint /. Invalidate*


T>Ну хотя бы над TImage ...


???
Re: Рисование на канве
От: akasoft Россия  
Дата: 23.01.06 16:17
Оценка:
Здравствуйте, Tirion, Вы писали:

T>Как организовать отрисовку (DrawText()) смещение текста по вертикали со стилем кисти bsClear


Алгоритмов может быть легион.

Например, заводишь Bitmap нужного размера по ширине и высоте, такой, чтобы весь твой текст поместился, в несколько строк, вычисляешь его размер в зависимости от текста, рисуешь на битмапе всё шрифтами и красиво.

Затем рисуешь фрагмент битмапа в нужном месте, ждёшь по таймеру, смещаешь на заданное количество пикселей и опять рисуешь. Рисуешь простым копированием нужного участка битмапа. Ну и т.д. В какой-то книжке по Дельфи (как бы не Пачеко с Тейксейрой) видел реализацию этого алгоритма в виде компонента.
... << RSDN@Home 1.2.0 alpha rev. 634>>
Re[12]: Рисование на канве
От: Tirion  
Дата: 24.01.06 12:07
Оценка:
Здравствуйте, Arioch2, Вы писали:

T>>>>А ты не пробовал сделать бегущую строку с прозрачным фоном
SetBkMode(HDC, Transparent)
???


A>>>Извр какой. А он над несколькими компонентами ?

A>>>Нельзя как фон взять в точности то, что под строкой лежит ?

A>>>Ибо таки вся рисовка должна проходить через OnPaint /. Invalidate*


T>>Ну хотя бы над TImage ...


A>???


Разве это невозможно?
В TLMDTextScroll это реализовано. Я бы его использовал, если б не отсутствие выравнивания текста.
Re[13]: Рисование на канве
От: Arioch2  
Дата: 24.01.06 12:41
Оценка:
T>Разве это невозможно?

Без понятия, я не понял о чем ты говорил.

T>В TLMDTextScroll это реализовано. Я бы его использовал, если б не отсутствие выравнивания текста.

А доработать нельзя ?
Re[2]: Рисование на канве
От: Tirion  
Дата: 24.01.06 14:39
Оценка:
Здравствуйте, akasoft, Вы писали:

A>Здравствуйте, Tirion, Вы писали:


T>>Как организовать отрисовку (DrawText()) смещение текста по вертикали со стилем кисти bsClear


A>Алгоритмов может быть легион.


A>Например, заводишь Bitmap нужного размера по ширине и высоте, такой, чтобы весь твой текст поместился, в несколько строк, вычисляешь его размер в зависимости от текста, рисуешь на битмапе всё шрифтами и красиво.


A>Затем рисуешь фрагмент битмапа в нужном месте, ждёшь по таймеру, смещаешь на заданное количество пикселей и опять рисуешь. Рисуешь простым копированием нужного участка битмапа. Ну и т.д. В какой-то книжке по Дельфи (как бы не Пачеко с Тейксейрой) видел реализацию этого алгоритма в виде компонента.


Что-то стало проясняться. Попробую реализовать.
Re[2]: Рисование на канве
От: Tirion  
Дата: 25.01.06 05:53
Оценка:

Затем рисуешь фрагмент битмапа в нужном месте, ждёшь по таймеру, смещаешь на заданное количество пикселей и опять рисуешь


С рисованием понятно, а как сместить на заданное количество пикселей?
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.