Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме 85 тыс рублей в месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.11.2022, 15:19   #41
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,215
По умолчанию

Цитата:
Сообщение от apofioz Посмотреть сообщение
Эффект заключается в том, что текст медленно "всплывает" слева направо.
Мне показалось, что: "всплывает" - это из под нижней границы, а слева направо - это посимвольно с левого к правому, а не строка целиком. Если надо просто бегущую строку, тогда надо изменять координату x, а не y как у меня в примере.
macomics вне форума Ответить с цитированием
Старый 29.11.2022, 06:16   #42
apofioz
Форумчанин
 
Регистрация: 22.01.2014
Сообщений: 208
По умолчанию

Цитата:
Сообщение от macomics Посмотреть сообщение
А что вычисляется функцией GetTextExtentPoint32. Какие значения?
GetTextExtentPoint32 вычисляет ширину и высоту заданной строки текста.
lpSize
[out] Указатель на структуру SIZE, которая принимает размеры строки, в логических единицах измерения.


Цитата:
Сообщение от macomics Посмотреть сообщение
- тогда значения будут отрицательные
В смысле отрицательные?! Имеете ввиду приращение или что, если нет, а имеется ввиду значения в переменной SIZE, то нет, они положительные.


Цитата:
Сообщение от macomics Посмотреть сообщение
А зачем вам собственный bitmap для каждой анимации?
Текст может бы разной длины исходя из этого я подумал, что так будет более универсально. Может быть какие-нибудь свойства...
apofioz вне форума Ответить с цитированием
Старый 29.11.2022, 06:18   #43
apofioz
Форумчанин
 
Регистрация: 22.01.2014
Сообщений: 208
По умолчанию

Цитата:
Сообщение от macomics Посмотреть сообщение
а слева направо - это посимвольно с левого к правому, а не строка целиком. Если надо просто бегущую строку, тогда надо изменять координату x, а не y как у меня в примере.
Посимвольно, да, но текст так же должен выплывать слева направо, не снизу вверх, но смысл тот же. Координату 'x' изменяю.

Последний раз редактировалось apofioz; 29.11.2022 в 07:46.
apofioz вне форума Ответить с цитированием
Старый 29.11.2022, 07:59   #44
apofioz
Форумчанин
 
Регистрация: 22.01.2014
Сообщений: 208
По умолчанию

Цитата:
Сообщение от macomics Посмотреть сообщение
BitBlt(hdc, iXStart, iYStart + sz.cy, sz.cx, -sz.cy, memDC, 0, 0, SRCCOPY);
Цитата:
Сообщение от macomics Посмотреть сообщение
void DrawPopUpText(HDC hdc, HDC memDC, int iXStart, int iYStart, DWORD &StartTime, LPCTSTR lpString, UINT uiLenStr, bool bCycle)
{
GetTextExtentPoint32(memDC, lpString, uiLenStr, &sz);

SetRect(&rcUpdata, 0, 0, sz.cx, 3 * sz.cy + 5);

FillRect(memDC, &rcUpdata, (HBRUSH)GetStockObject(WHITE_BRUSH) );

int pos = 5 + 2 * sz.cy - (GetTickCount() - StartTime) / 60;

TextOut(memDC, 0, min(pos, 0), lpString, uiLenStr);

BitBlt(hdc, iXStart, iYStart, sz.cx, sz.cy, memDC, 0, sz.cy, SRCCOPY);

if (pos < 0 && bCycle) StartTime = GetTickCount();
}
Ничего! От слова совсем т.е. белое окно и всё, никаких признаков жизни(
apofioz вне форума Ответить с цитированием
Старый 29.11.2022, 08:13   #45
apofioz
Форумчанин
 
Регистрация: 22.01.2014
Сообщений: 208
По умолчанию

Если BitBlt() вызывать так:
BitBlt(hdc, iXStart, iYStart+pos, sz.cx, sz.cy, memDC, 0, 0, SRCCOPY);
То на выходе получается, так:
Animationtext.zip

Такое ощущение, что выводится один текст, не две разные строки, а одна, это очень плохой результат. К тому же текст, как не трудно увидеть не выползает из-за границы, а сразу появляется на границе и не уползает за верхнюю граница, а просто, начинает цикл заново т.е. вывод на этом заканчивается.

Последний раз редактировалось apofioz; 29.11.2022 в 08:16.
apofioz вне форума Ответить с цитированием
Старый 29.11.2022, 09:38   #46
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,215
По умолчанию

Цитата:
Сообщение от apofioz Посмотреть сообщение
GetTextExtentPoint32 вычисляет ширину и высоту заданной строки текста.
lpSize
[out] Указатель на структуру SIZE, которая принимает размеры строки, в логических единицах измерения.
Описание этой функции я читал. Только уточняю по фактическим значениям.
Цитата:
Сообщение от apofioz Посмотреть сообщение
то нет, они положительные.
Вот об этом и спрашивал.
Цитата:
Сообщение от apofioz Посмотреть сообщение
Текст может бы разной длины исходя из этого я подумал, что так будет более универсально. Может быть какие-нибудь свойства...
Только я bitmap предложил использовать как back-буфер. Достаточно одного буфера на все анимации на всю программу. От bitmap вообще можно избавиться и рисовать сразу на окне, если включить двойную буферизацию.

Цитата:
Сообщение от apofioz Посмотреть сообщение
Код:
BitBlt(hdc, iXStart, iYStart+pos, sz.cx, sz.cy, memDC, 0, 0, SRCCOPY);
Только iXStart и iYStart это координаты на hdc (в окне), а pos это координаты на bitmap. Вы ничего не добьетесь этим.
macomics вне форума Ответить с цитированием
Старый 29.11.2022, 10:11   #47
apofioz
Форумчанин
 
Регистрация: 22.01.2014
Сообщений: 208
По умолчанию

Цитата:
Сообщение от macomics Посмотреть сообщение
Только уточняю по фактическим значениям.
Когда я их проверял были положительными.


Цитата:
Сообщение от macomics Посмотреть сообщение
Только iXStart и iYStart это координаты на hdc (в окне), а pos это координаты на bitmap. Вы ничего не добьетесь этим.
Я показал, чего я добился этим, а то что вы предложили вообще не работает, как я писал выше пустое окно. Как быть? Я что, против, предложите другое решение, которое сработает лучше, чтобы добить эту задачу в конце концов. Это я про ваш вариант т.е. текст выплывает снизу вверх. Какие основные особенности вычисления координат для следующей позиции, может быть , вы слишком усложняете их вычисление?

p.s.
Может быть при вычислениях pos большинство значений положительны и исходя из этого строка записывается в контекст памяти всегда в одно и тоже место. Я посмотрел результаты вычислений этой переменной и, так и есть, а судя по условию min(pos, 0) получается постоянно нуль. Я имею ввиду этот код: int pos = 5 + 2 * sz.cy - (GetTickCount() - StartTime) / 20;
36, 36, 36, 35, 35, 34, 34, 34, 34 ... 2, 2, 2, 1, 1, 0, 0, -1, -1, 36... - Вы так и хотели или всё же нет?

Последний раз редактировалось apofioz; 29.11.2022 в 13:03.
apofioz вне форума Ответить с цитированием
Старый 29.11.2022, 13:11   #48
apofioz
Форумчанин
 
Регистрация: 22.01.2014
Сообщений: 208
По умолчанию

И так, как я и полагал дело в вычислении переменной pos чуть подправил код и вот что получилось на данный момент:
AnimationText.zip
Осталось сделать это более качественно т.е. что бы каждая строка была отдельно т.е. чтобы при взгляде было очевидно, что это строки для разных обозначений, а не одна строка текста. Ну и нужно усовершенствовать вычисление pos;

Код:
void DrawPopUpText(HDC hdc, HDC memDC, int iXStart, int iYStart, DWORD& StartTime, LPCTSTR lpString, UINT uiLenStr, BOOL isRestart = TRUE)
{
	GetTextExtentPoint32(memDC, lpString, uiLenStr, &sz);

	SetRect(&rcUpdata, 0, 0, sz.cx, 3 * sz.cy + 5);

	FillRect(memDC, &rcUpdata, (HBRUSH)GetStockObject(WHITE_BRUSH));

	//int pos = 5 + 2 * sz.cy - (GetTickCount() - StartTime) / 20;
	//cnt - задержка, что бы выводилось медленее, 
	//pos1 - это половина высоты Bitmap-а   
	static int pos1 = 18, cnt = 10;
	
	TextOut(memDC, 0, pos1/*min(pos, 0)*/, lpString, uiLenStr);
	if (cnt-- == 0)
	{
		--pos1;
		cnt = 10;
	}
	BitBlt(hdc, iXStart, iYStart, sz.cx, sz.cy, memDC, 0, 0, SRCCOPY);
	if (pos1 < -18 && isRestart)
	{
		pos1 = 18;
		//StartTime = GetTickCount();
	}
}
Хотя код, конечно, визуально ухудшился, не красивый стал(
apofioz вне форума Ответить с цитированием
Старый 29.11.2022, 14:12   #49
apofioz
Форумчанин
 
Регистрация: 22.01.2014
Сообщений: 208
По умолчанию

Вот *.exe.
Ex3_25.rar
apofioz вне форума Ответить с цитированием