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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.11.2022, 11:47   #1
apofioz
Форумчанин
 
Регистрация: 22.01.2014
Сообщений: 208
По умолчанию Шрифт с "всплывающим" эффектом

Здравствуйте! Есть задача, описана она следующим образом:
Цитата:
Разработать функцию вывода текста в заданной позиции со специальным эффектом. Эффект заключается в том, что текст медленно "всплывает" слева направо. Используя эту функцию отобразить рейтинги участников некоторого события.
Я почему-то предполагал, что нужно изменять толщину букв(каждой буквы) и таким образом выводить по символу за раз. Но, как можно понять, ничего не получилось, и что если текст буде состоять не из слова или пары слов, а, скажем из предложения, а толщина изменяется на 100 единиц т.е. так можно, если бы это можно было сделать, вывести десять букв.... Думаю, что это не совсем то, что просят, может как-то иначе нужно делать, как вы думаете, как это можно реализовать?
apofioz вне форума Ответить с цитированием
Старый 21.11.2022, 12:07   #2
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,215
По умолчанию

Вычисляете размер области полностью напечатанного текста и создаете bitmap размером с 2 строки этого текста. Далее на bitmap рисуете текст постепенно уменьшая координату x у букв, а на экран копируете часть bitmap содержащую только верхнюю строку. Таким образом получится эффект будто буквы выползают наверх. Если добавить массив с координатами x для каждой отдельной буквы, тогда можно эту анимацию сделать отдельно для каждой буквы.

Или вам что-то другое надо?
macomics вне форума Ответить с цитированием
Старый 21.11.2022, 12:37   #3
Valick
Форумчанин
 
Регистрация: 27.04.2022
Сообщений: 262
По умолчанию

Цитата:
Сообщение от macomics Посмотреть сообщение
Или вам что-то другое надо?
Так там оно того
Цитата:
Сообщение от apofioz Посмотреть сообщение
Эффект заключается в том, что текст медленно "всплывает" слева направо
Valick вне форума Ответить с цитированием
Старый 21.11.2022, 12:40   #4
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,215
По умолчанию

Вот поэтому я и добавил описание про массив, но можно обойтись и простой функцией.
macomics вне форума Ответить с цитированием
Старый 21.11.2022, 13:25   #5
apofioz
Форумчанин
 
Регистрация: 22.01.2014
Сообщений: 208
По умолчанию

Это случайно не то что нужно?
Окно.png
apofioz вне форума Ответить с цитированием
Старый 21.11.2022, 13:34   #6
apofioz
Форумчанин
 
Регистрация: 22.01.2014
Сообщений: 208
По умолчанию

Цитата:
Сообщение от macomics Посмотреть сообщение
Вычисляете размер области полностью напечатанного текста и создаете bitmap размером с 2 строки этого текста.
Я такого не изучал, представления не имею о чём вы хотите сказать, читать читал, но мельком, а без этого инструмента никак нельзя обойтись?
Для начал хотелось бы понять, что имеется ввиду под эффектом "выплывания"...


Цитата:
Сообщение от macomics Посмотреть сообщение
Если добавить массив с координатами x для каждой отдельной буквы, тогда можно эту анимацию сделать отдельно для каждой буквы
Не знаю то это или нет, но, думаю, было бы интересно такое реализовать, точнее, попробовать реализовать.
Рассчитывать для символа стандартного размера или всё же для уже увеличенного размера?

Я правильно создаю bitmap?
Код:
TEXTMETRIC tm;
		GetTextMetrics(hdc, &tm);

		int cxChar, cyChar;

		cxChar = tm.tmAveCharWidth + 1;
		cyChar = tm.tmHeight + tm.tmExternalLeading;
		BYTE* aMap = (BYTE*)malloc(lstrlen(szString) * 2);
		HBITMAP hBitMap = CreateBitmap(cxChar * lstrlen(szString), (cyChar << 1), 1, 8, (BYTE*)aMap);

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

Лучше через CreateCompatibleBitmap
macomics вне форума Ответить с цитированием
Старый 21.11.2022, 18:53   #8
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,434
По умолчанию

А зачем нужен битмап?
Не проще будет рисовать текст и обрезать лишнее?
waleri вне форума Ответить с цитированием
Старый 21.11.2022, 19:01   #9
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,215
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
А зачем нужен битмап?
Не проще будет рисовать текст и обрезать лишнее?
Чтобы для всего окна не включать двойную буферизацию. Его можно будет установить как PatternBrush и просто заливать фон окна.
macomics вне форума Ответить с цитированием
Старый 22.11.2022, 05:04   #10
apofioz
Форумчанин
 
Регистрация: 22.01.2014
Сообщений: 208
По умолчанию

waleri, macomics
Я правильно понимаю, что то, что я спрашиваю в своих вопросах никого не волнует, вам, я так понимаю, интересно между собой поспорить, правильно?!


Цитата:
Сообщение от macomics Посмотреть сообщение
Лучше через CreateCompatibleBitmap
Цитата:
Сообщение от macomics Посмотреть сообщение
Чтобы для всего окна не включать двойную буферизацию.
Цитата:
Сообщение от macomics Посмотреть сообщение
PatternBrush


Так? Это, что вы имели ввиду под: "Вычисляете размер области полностью напечатанного текста и создаете bitmap размером с 2 строки этого текста. Далее на bitmap рисуете текст постепенно уменьшая координату x у букв, а на экран копируете часть bitmap содержащую только верхнюю строку."

Код:
void DrawPopUpText(HDC hdc, int x, int y, LPCTSTR lpString, UINT uiLenStr)
{
	SIZE szStr;
	GetTextExtentPoint32(hdc, lpString, uiLenString, &szStr);
	
	HDC memDC = CreateCompatibleDC(hdc);
	HBRUSH hBrush = CreateCompatibleBitmap(hdc, szStr.cx, 
	                                            szStr.cy << 1));
												
	HBRUSH hOldBitmap = (HBITMAP)SelectObject(memDC, hBitmap);
	
	
	
	int xx = x, yy = y;
	for(int i = 0; i < uiLenString; ++i)
	{
		TextOut(hBitmap, xx--, y, lpString[i], 1)
	}
	PatBlt(hdc, x, y, szStr.cx, szStr.cy, SRCCOPY);
	
	SelectObject(memDC, hOldBitmap);
	DeleteObject(hBrush);
	DeleteDC(memDC);
}

Последний раз редактировалось apofioz; 22.11.2022 в 08:47.
apofioz вне форума Ответить с цитированием