Перемещение текста (анимация?)

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
pronto
Постоялец
Постоялец
 
Сообщения: 597
Зарегистрирован: 04.12.2005 (Вс) 6:20
Откуда: Владивосток

Перемещение текста (анимация?)

Сообщение pronto » 04.05.2010 (Вт) 15:02

Доброго времени суток, форумчане!

Столкнулся с проблемой
Суть её в том, что я пытаюсь сделать подпись к рамке, размеры которой может менять пользователь.
Рамки и текст отрисовываю функциями API (Rectangle и TextOut). Для перерисовки использую
режим Picture1.DrawMode = 7 (Xor Pen). Рамка перерисовывается правильно, а текст оставляет шлейф :(
После некоторых поисков выяснилось, что на TextOut (да и DrawText) этот (и другие) режим не распространяется...

Возникло предположение, что, если отрисовать текст в растр, а потом его скопировать на Picture1
функцией BitBlt, то я получу нужный результат. На деле этот финт оказался сложнее, чем я его себе
представлял. Скорее всего не хватает понимания алгоритма по которому работают функции и их связка.

Прошу помочь разобраться, что здесь к чему :scratch:

Прилагаю экспериментальный проект в котором проблема оголена :)
Вложения
MoveShapeByMarkers.zip
(61.19 Кб) Скачиваний: 40
O, sancta simplicitas!

pronto
Постоялец
Постоялец
 
Сообщения: 597
Зарегистрирован: 04.12.2005 (Вс) 6:20
Откуда: Владивосток

Re: Перемещение текста (анимация?)

Сообщение pronto » 05.05.2010 (Ср) 17:04

Хорошо, перефразирую проблему :)

Используя BitBlt я применяю растровую операцию SRCINVERT (Приёмник = Источник XOR Приёмник).
Где Приёмник — это Фон, а Источник — это созданный растр с текстом.
Эффект движения получается, но наблюдается эффект инвертирования фона у текста, а сам текст приобретает цвет фона (становится как бы прозрачным). В таком случае, если у текста будет отсутствовать фон, то текст останется невидим. Хотелось бы, чтобы при движении оставались исходные цвета фона и текста. Основная проблема в этом, и как её преодолеть никак не могу понять
O, sancta simplicitas!

Debugger
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1667
Зарегистрирован: 17.06.2006 (Сб) 15:11

Re: Перемещение текста (анимация?)

Сообщение Debugger » 05.05.2010 (Ср) 17:17

В таком виде, в каком он есть у тебя сейчас, ты не сделаешь. Неплохо бы вынести перерисовку в отдельную функцию.
На форме:
pctResult - видимая картинка, на ней обрабатываются клики
pctBuffer - копия pctResult, невидима, Autoredraw=True.
При перерисовке:
1) Очищаем pctBuffer
2) Рисуем маркеры, тексты и что хочешь.
3) BitBlt из pctBuffer.hdc в pctResult.
4) pctResult.refresh
Код: Выделить всё
Picture1.DrawMode = 7 (Xor Pen)

Вот и корень зла. Вместо того, чтобы перерисовывать нормально, ты пытаешься вот так вывернуться. Ты же не миллион рамок рисушь, чтобы ТАК делать.

pronto
Постоялец
Постоялец
 
Сообщения: 597
Зарегистрирован: 04.12.2005 (Вс) 6:20
Откуда: Владивосток

Re: Перемещение текста (анимация?)

Сообщение pronto » 05.05.2010 (Ср) 18:18

Неплохо бы вынести перерисовку в отдельную функцию

Вынесу, когда всё образуется, а пока надо разобраться с алгоритмом.
При перерисовке:
1) Очищаем pctBuffer
2) Рисуем маркеры, тексты и что хочешь.
3) BitBlt из pctBuffer.hdc в pctResult.
4) pctResult.refresh

Понятнее не стало. Так как:
1) Что нужно очистить? Picture или Image? Как? Picture1.CLS?
2) На pctBuffer.hdc? В данном случае (т.к. AutoRedraw=True) это ссылка на совместимый контекст, принадлежащий этому элементу
3) Каким должен быть параметр dwRop?
4) в pctResult от Xor'а можно/нужно вообще отказаться?
O, sancta simplicitas!

VVitafresh
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1641
Зарегистрирован: 12.05.2005 (Чт) 14:44
Откуда: Херсон, UA

Re: Перемещение текста (анимация?)

Сообщение VVitafresh » 06.05.2010 (Чт) 8:51

Есть маленький пример бегущей строки. Может быть он тебе чем-то поможет...
Вложения
MovingText.zip
Бегущая строка текста
(2.76 Кб) Скачиваний: 63
Никакую проблему невозможно решить на том же уровне, на каком она возникла. Нужно стать выше этой проблемы, поднявшись на следующий уровень.

pronto
Постоялец
Постоялец
 
Сообщения: 597
Зарегистрирован: 04.12.2005 (Вс) 6:20
Откуда: Владивосток

Re: Перемещение текста (анимация?)

Сообщение pronto » 06.05.2010 (Чт) 9:56

Спасибо! Примерчик интересный.
Только фон мерцает и цвет текста не меняется... Выставил Picture1.AutoRedraw=True и применил SetTextColor

Я понял, что мне предлагал Debugger. Но я хотел такую перерисовку, которая бы не использовала буферный фон (расход памяти, лишняя операция копирования всего фона). Чувствую, что это сделать реально, но пока не знаю как... Буду ковырять дальше, если не доковыряюсь, то придётся остановится на предложенном варианте.
O, sancta simplicitas!


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 28

    TopList