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

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

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

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

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.11.2022, 15:07   #21
apofioz
Форумчанин
 
Регистрация: 22.01.2014
Сообщений: 313
По умолчанию

Цитата:
Сообщение от macomics Посмотреть сообщение
Задавайте какие хотите. Где у вас на форме должна отображаться эта анимация такие координаты и задавайте.
Т.е. если я вывожу условно "один" "два" "три" "четыре", то в textPos[0] я указываю начальную координату для "один", а textPos[1] начальную координату для "два" ..., получается так?


Цитата:
Сообщение от macomics Посмотреть сообщение
Когда нужно запустить нужную анимацию, тогда записываете сюда значение GetTickCount и она стартует. Если ее надо прервать, тогда обнуляете.
Т.е. для запуска анимации строки "три" мне нужно записать в startTime[2] = GetTickCount();, а для остановки туда же нуль, так? Если сразу все запустить, тогда сразу все заполнить, так? В моём случае мне нужно запускать все сразу.

Цитата:
Сообщение от macomics Посмотреть сообщение
А в массивы заполнить сразу строки.
Может вы имеете виду что-то такое:
Код:
struct TextAnimation
{
	POINT textPos;
	DWORD startTime;
	TCHAR chString[128];
};
Тогда можно задать данные для n-строк, TextAnimation StringsAnimation[5];, нет, всё же массивы нужны?

Последний раз редактировалось apofioz; 26.11.2022 в 15:13.
apofioz вне форума Ответить с цитированием
Старый 26.11.2022, 15:09   #22
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Я в предыдущем посте добавил картинку с пояснениями.
macomics вне форума Ответить с цитированием
Старый 26.11.2022, 15:12   #23
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Цитата:
Сообщение от apofioz Посмотреть сообщение
Т.е. если я вывожу условно "один" "два" "три" "четыре", то в textPos[0] я указываю начальную координату для "один", а textPos[1] начальную координату для "два" ..., получается так?
Да

Цитата:
Сообщение от apofioz Посмотреть сообщение
Т.е. для запуска анимации строки "три" мне нужно записать в startTime[2] = GetTickCount();, а для остановки туда же нуль, так?
Да

Цитата:
Сообщение от apofioz Посмотреть сообщение
Может вы имеете виду что-то такое:
Код:

struct TextAnimation
{
POINT textPos;
DWORD startTime;
TCHAR chString[128];
};

Тогда можно задать данные для n-строк, TextAnimation StringsAnimation[5];, нет, всё же массивы нужны?
Можно и структурой. Мне не хотелось еще и ее описывать. Я просто описал массив структур с 3 полями как 3 отдельных массива.
macomics вне форума Ответить с цитированием
Старый 26.11.2022, 15:23   #24
apofioz
Форумчанин
 
Регистрация: 22.01.2014
Сообщений: 313
По умолчанию

Цитата:
Сообщение от macomics Посмотреть сообщение
Можно и структурой.
Я, думаю, что так точно яснее будет, а с массивами не однозначно получается, хотя, если вы говорите про анимацию каждой буквы, то тут нужны массивы. Пока что всё ясно, надеюсь, что больше вопросов по этой теме не возникнет!
apofioz вне форума Ответить с цитированием
Старый 26.11.2022, 15:30   #25
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Цитата:
Сообщение от apofioz Посмотреть сообщение
Если сразу все запустить, тогда сразу все заполнить, так? В моём случае мне нужно запускать все сразу.
Да. Надо весь массив заполнить одним и тем же значением полученным от GetTickCount. Лучше при заполнении обойтись одним вызовом этой функции и заполнить массив значением сохраненным во временной переменной. Тогда не будет рассинхронизации при запуске всех анимаций.
macomics вне форума Ответить с цитированием
Старый 26.11.2022, 15:33   #26
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Цитата:
Сообщение от apofioz Посмотреть сообщение
Я, думаю, что так точно яснее будет, а с массивами не однозначно получается, хотя, если вы говорите про анимацию каждой буквы, то тут нужны массивы. Пока что всё ясно, надеюсь, что больше вопросов по этой теме не возникнет!
Анимацию каждой буквы можно сделать отдельно задавая функцию условной задержки (которая будет получать координаты предыдущей буквы и отрисовывать следующую букву чуть ниже на bitmap). Это можно сделать внутри функции вызываемой в цикле из WM_PAINT. Т.е. цикл, который я описал запускает отдельные анимированные строки текста на форме, а вот вид анимации строки задается уже при перерисовке bitmap внутри функции drawAnimatedText(...)
macomics вне форума Ответить с цитированием
Старый 26.11.2022, 15:45   #27
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Если в структуре добавить еще одно поле, в котором будет записан делитель у pos при расчете координат текста на bitmap, тогда все анимации текста будет идти с разными скоростями. Сейчас они могут идти асинхронно, но с одинаковой скоростью.

Цитата:
Сообщение от macomics Посмотреть сообщение
int pos = 5 + copy_height - (GetTickCount + start) / 10;
Вот эту 10 задать в переменной у каждой анимации.
macomics вне форума Ответить с цитированием
Старый 27.11.2022, 11:33   #28
apofioz
Форумчанин
 
Регистрация: 22.01.2014
Сообщений: 313
По умолчанию

macomics
Не Знаю, как у вас, у меня вот что получается)
Окно.jpg
apofioz вне форума Ответить с цитированием
Старый 27.11.2022, 14:13   #29
apofioz
Форумчанин
 
Регистрация: 22.01.2014
Сообщений: 313
По умолчанию

Цитата:
Сообщение от macomics Посмотреть сообщение
int pos = 5 + copy_height - (GetTickCount + start) / 10;
(GetTickCount + start) - Здесь точно знак плюс?
GetTickCount - Это функция или переменная?


Код:
struct TextAnimation
{
	POINT textPos;
	DWORD startTime;
	TCHAR chString[128];
	UINT  uiLenString;
};

/*
hdc              - Контекст устрйства окна
memDC            - контекст памяти
iXStart, iYStart - координаты начала вывода в окно 
StartTime        - Значение плученное посредством 
                   функции GetTickCount() 
lpString         -  Сама строка для вывода
uiLenStr         - Длина строки  в символах.
*/
void DrawPopUpText(HDC hdc, HDC memDC, int iXStart, int iYStart, DWORD StartTime, LPCTSTR lpString, UINT uiLenStr)
{
	SIZE sz;
	GetTextExtentPoint32(memDC, lpString, uiLenStr, &sz);

	int pos = 5 + sz.cy - (GetTickCount() + StartTime) / 10;

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

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


LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
	static HDC hdc, memDC;
	static HBITMAP hBitmap;
	static TextAnimation Animation[1];
	//const int STRINGSIZE = lstrlen(lpString);
	PAINTSTRUCT ps;
	switch (msg)
	{
	case WM_CREATE:
	{
		Animation[0].textPos = { 120, 120 };
		Animation[0].startTime = GetTickCount();
		_tcscpy_s(Animation[0].chString, 128,
			TEXT("Hi! How are you?"));
		Animation[0].uiLenString = lstrlen(Animation[0].chString);

		SIZE sz;
		hdc = GetDC(hwnd);
		memDC = CreateCompatibleDC(hdc);
		GetTextExtentPoint32(hdc, Animation[0].chString, Animation[0].uiLenString, &sz);
		hBitmap = CreateCompatibleBitmap(memDC, sz.cx,
			2 * sz.cy + 5);
		SelectObject(memDC, hBitmap);

		ReleaseDC(hwnd, hdc);
		SetTimer(hwnd, ID_TIMER, 10, NULL);
		DeleteObject(hBitmap);

		return 0;
	}
	case WM_TIMER:
	{
		InvalidateRect(hwnd, NULL, FALSE);
		return 0;
	}
	case WM_PAINT:
	{
		hdc = BeginPaint(hwnd, &ps);
		for (unsigned int i = 0; i < Animation[0].uiLenString; ++i)
		{
			DrawPopUpText(hdc, memDC,
				Animation[0].textPos.x, Animation[0].textPos.y,
				Animation[0].startTime,
				Animation[0].chString,
				Animation[0].uiLenString);
		}

		//FillRect(memDC, &ps.rcPaint, (HBRUSH)GetStockObject(WHITE_BRUSH));
		EndPaint(hwnd, &ps);
		return 0;
	}
	case WM_DESTROY:
	{
		KillTimer(hwnd, ID_TIMER);
		DeleteDC(memDC);
		PostQuitMessage(0);
		return 0;
	}
	}
	return DefWindowProc(hwnd, msg, wParam, lParam);
}

Последний раз редактировалось apofioz; 27.11.2022 в 14:27.
apofioz вне форума Ответить с цитированием
Старый 27.11.2022, 19:29   #30
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

GetTickCount - функция, start переменная, + - опечатка и должен быть минус

В Функцию DrawPopUpText добавьте еще вначале вызов FillRect для очиски bitmap. Иначе новый текст будет нарисован поверх старого.
macomics вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Необходимо написать "таймер", который будет запускаться при нажатии кнопки "Start", приостанавливаться на "Pause", и сбрасываться на "Reset" billiejean78 JavaScript, Ajax 1 03.09.2021 08:58
Убрать папки "Pictures", "Music", "Видео", "Downloads" из "МОЙ КОМПЬЮТЕР" Бахтиёр1916 Windows 1 05.04.2017 12:53
Нужно пояснить/прокомментировать код программы, или коды функций "Добавить" "Удалить" "Обновить(редактировать" "Поиск" "Период") ZIRASS PHP 4 15.06.2016 14:23
Поиск компонента GroupBox с эффектом "спойлер" XerSon Компоненты Delphi 1 24.03.2011 09:59