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

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

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

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

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

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

Цитата:
Сообщение от macomics Посмотреть сообщение
В WM_TIMER достаточно инициировать перерисовку окна (в данном случае это ListBox)
А если данные в двух listbox-ах: в первом пусть будут 'имя пользователя', во втором 'пароль пользователя' в этом случае действовать так же или придётся корректировать действия по перерисовке?


Цитата:
Сообщение от macomics Посмотреть сообщение
SetTimer(hWnd, 1, 40, nullptr); // 25 кадров в секунду
Почему указано 40, а в комментарии говорится о 25-ти кадрах?


Цитата:
Сообщение от macomics Посмотреть сообщение
В пункте 2 описана анимация длительностью 15000 мс (15 сек)
Ам... это не долговато для привлечения внимания?)
Что ж попобую и напишу, что получилось.
apofioz вне форума Ответить с цитированием
Старый 10.03.2023, 17:04   #12
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Цитата:
Сообщение от apofioz Посмотреть сообщение
А если данные в двух listbox-ах: в первом пусть будут 'имя пользователя', во втором 'пароль пользователя' в этом случае действовать так же или придётся корректировать действия по перерисовке?
Да так же. Я вам говорил уже, что тот подход с анимацией универсален и вы можете запустить таких анимаций сколько угодно на одном таймере. Так же и тут. Только в фунцию обработки таймера надо будет добавить перерисовку всех ListBox через вызовы InvalidateRect

Цитата:
Сообщение от apofioz Посмотреть сообщение
Почему указано 40, а в комментарии говорится о 25-ти кадрах?
Потому что задержка для таймера указана в миллисекундах, а я вам написал комментарий про частоту кадров. И вот тут не хитрая математика:
1000 / 40 = 25 <- 25 раз в секунду сработает таймер и обеспечит 25 перерисовок (кадров).

Цитата:
Сообщение от apofioz Посмотреть сообщение
Ам... это не долговато для привлечения внимания?)
Так я вам для этого и написал что означают эти константы (цифры) в коде. Надеялся, что вы сами сможете их поправить, чтобы настроить вашу анимацию на нужную длительность и частоту мерцания.
macomics вне форума Ответить с цитированием
Старый 10.03.2023, 21:29   #13
apofioz
Форумчанин
 
Регистрация: 22.01.2014
Сообщений: 313
По умолчанию

Цитата:
Сообщение от macomics Посмотреть сообщение
Надеялся, что вы сами сможете их поправить, чтобы настроить вашу анимацию на нужную длительность и частоту мерцания.
Это понятно, не так выразился, я имел ввиду то, что вы задаёте такие константы полагая, что вы написали код, как будто бы вы что-то подобное закодировали.


Цитата:
Сообщение от macomics Посмотреть сообщение
1000 / 40 = 25 <- 25 раз в секунду сработает таймер и обеспечит 25 перерисовок (кадров).
Это случайно не тот самый пресловутый FPS о котором так часто говорят...
apofioz вне форума Ответить с цитированием
Старый 10.03.2023, 21:31   #14
apofioz
Форумчанин
 
Регистрация: 22.01.2014
Сообщений: 313
По умолчанию

Я правильно уловил вашу мысль?
Код:
case WM_DRAWITEM:
	{
		LPDRAWITEMSTRUCT lpdi = (LPDRAWITEMSTRUCT)lParam;
		if (lpdi->CtlType & ODT_LISTBOX)
		{
			if ((lpdi->CtlID & ID_LISTBOX_USERNAME) ||
				(lpdi->CtlID & ID_LISTBOX_PASSWORD))
			{
				if (lpdi->itemID == lastIndex)
				{
					int Index = lpdi->itemID;
					HDC hdc = lpdi->hDC;
					RECT rc = lpdi->rcItem;
					TCHAR szBuf[MAXUSERNAME];
					int OldColor, OldAlin, OldBk;
					*(LPWORD)szBuf = MAXUSERNAME-1;
					int len = SendMessage(lpdi->hwndItem, LB_GETTEXT, lastIndex, (LPARAM)szBuf);
					if (len == LB_ERR)
					{
						return 1;
					}
					szBuf[len] = '\0';
					OldAlign = SetTextAlign(hdc, TA_RIGHT);
					
					CurrentTime = GetTickCount();
					if((CurrentTime - StartTime) < 15000)
					{
						if((CurrentTime - StartTime) / 500) & 1)
						{
							OldColor = SetTextColor(hdc, RGB(255, 0, 0));
							OldBk    = SetBkColor(hdc, RGB(0, 0, 0));
							TextOut(hdc, rc.right - len - 1, rc.top, szBuf, _tcslen(szBuf));
							DrawFocusRect(hdc, &rcText);
						}
						else
						{
							OldColor = SetTextColor(hdc, RGB(255, 0, 0));
							OldBk    = SetBkColor(hdc, RGB(255, 255, 255));
							TextOut(hdc, rc.right - len - 1, rc.top, szBuf, _tcslen(szBuf));
							DrawFocusRect(hdc, &rcText);
						}
					}
					else
					{
						int len = SendMessage(lpdi->hwndItem, LB_GETTEXT,  lpdi->itemID, (LPARAM)szBuf);
						if(len == LB_ERR)
						{
							return 1;
						}
						szBuf[len] = '\0';
						TextOut(hdc, rc.right - len - 1, rc.top, szBuf, _tcslen(szBuf));
					}
					SetTextColor(hdc, OldColor);
					SetTextAlign(hdc, OldAlign); 
					SetBkColor(hdc, OldBk);
				}
			}
			return TRUE;
		}
		break;
	}
apofioz вне форума Ответить с цитированием
Старый 10.03.2023, 21:49   #15
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Цитата:
Сообщение от apofioz Посмотреть сообщение
Это случайно не тот самый пресловутый FPS о котором так часто говорят...
Он самый. Но вам не нужно в обычной программе много fps как в какой-нибудь игре. 25 будет более чем достаточно для плавной анимации текста


Цитата:
Сообщение от apofioz Посмотреть сообщение
Я правильно уловил вашу мысль?
Не правильно. WM_DRAWITEM надо написать так, чтобы с её помощью можно было нарисовать все строки в ListBox, а только нужную вам подсветить.
Код:
case WM_DRAWITEM:
	{
		LPDRAWITEMSTRUCT lpdi = (LPDRAWITEMSTRUCT)lParam;
		if (lpdi->CtlType & ODT_LISTBOX)
		{
			if ((lpdi->CtlID & ID_LISTBOX_USERNAME) ||
				(lpdi->CtlID & ID_LISTBOX_PASSWORD))
			{
// Это нужно выполнить для всех элементов списка
                int Index = lpdi->itemID;
				HDC hdc = lpdi->hDC;
				RECT rc = lpdi->rcItem;
				TCHAR szBuf[MAXUSERNAME];
				int OldColor, OldAlin, OldBk;
				*(LPWORD)szBuf = MAXUSERNAME-1;
				int len = SendMessage(lpdi->hwndItem, LB_GETTEXT, Index, (LPARAM)szBuf);
				if (len == LB_ERR)
				{
					return 1;
                }
				szBuf[len] = '\0';
				OldAlign = SetTextAlign(hdc, TA_RIGHT);
// А анимацию рисовать только в заданный промежеток времени и только у заданного элемента
				if (lpdi->itemID == lastIndex)
				{
					CurrentTime = GetTickCount();
					if((CurrentTime - StartTime) < 15000)
					{
						if((CurrentTime - StartTime) / 500) & 1)
						{
							OldColor = SetTextColor(hdc, RGB(255, 0, 0));
							OldBk    = SetBkColor(hdc, RGB(0, 0, 0));
							TextOut(hdc, rc.right - len - 1, rc.top, szBuf, len);
							DrawFocusRect(hdc, &rcText);
						}
						else
						{
							OldColor = SetTextColor(hdc, RGB(255, 0, 0));
							OldBk    = SetBkColor(hdc, RGB(255, 255, 255));
							TextOut(hdc, rc.right - len - 1, rc.top, szBuf, len);
							DrawFocusRect(hdc, &rcText);
						}
                        SetTextColor(hdc, OldColor);
                        SetTextAlign(hdc, OldAlign); 
                        SetBkColor(hdc, OldBk);
                        return TRUE;
					}
				}
				TextOut(hdc, rc.right - len - 1, rc.top, szBuf, len);
			}
			return TRUE;
		}
		break;
	}
macomics вне форума Ответить с цитированием
Старый 10.03.2023, 22:37   #16
apofioz
Форумчанин
 
Регистрация: 22.01.2014
Сообщений: 313
По умолчанию

Цитата:
Сообщение от macomics Посмотреть сообщение
Не правильно. WM_DRAWITEM надо написать так, чтобы с её помощью можно было нарисовать все строки в ListBox, а только нужную вам подсветить.
Понятно, слегка ошибся с веткой case для остальных элементов.


Цитата:
Сообщение от macomics Посмотреть сообщение
Но вам не нужно в обычной программе много fps как в какой-нибудь игре.
Я до конца понять не могу, что это за зверь такой, можете приоткрыть завесу тайны?

Данный вид анимации очень ресурсозатратен или он оптимален?
apofioz вне форума Ответить с цитированием
Старый 10.03.2023, 22:44   #17
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Цитата:
Сообщение от apofioz Посмотреть сообщение
Я до конца понять не могу, что это за зверь такой, можете приоткрыть завесу тайны?
FPS = Frames Per Second = Кадров В Секунду (дословно)
Это аббревиатура означает, что величина указывает количество кадров воспроизводимых в секунду.
Игры обычно воспроизводят (рендерят) больше 50 кадров в секунду. А на топовых игровых компьютерах это значение может держаться в среднем на уровне 100.

Для простой анимации в окне таких затрат не нужно и при 25 кадрах в секунду все будет достаточно плавно.

Цитата:
Сообщение от apofioz Посмотреть сообщение
Данный вид анимации очень ресурсозатратен или он оптимален?
Вполне оптимален для обычной программы.
macomics вне форума Ответить с цитированием
Старый 10.03.2023, 23:12   #18
apofioz
Форумчанин
 
Регистрация: 22.01.2014
Сообщений: 313
По умолчанию

Цитата:
Сообщение от macomics Посмотреть сообщение
FPS = Frames Per Second = Кадров В Секунду (дословно)
Может это тупой вопрос, но меня как раз и интересует, что означает "кадр в секунду", а не расшифровка аббревиатуры. Если взять киноплёнку, условно, то по идее в секунду будут проскакивать 25 кадров, плёнка будут смещаться каждый раз на 25 шагов(кадров), так ли?


Цитата:
Сообщение от macomics Посмотреть сообщение
Вполне оптимален для обычной программы.
Какие способы более оптимальные?
apofioz вне форума Ответить с цитированием
Старый 10.03.2023, 23:25   #19
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Цитата:
Сообщение от apofioz Посмотреть сообщение
Может это тупой вопрос, но меня как раз и интересует, что означает "кадр в секунду", а не расшифровка аббревиатуры. Если взять киноплёнку, условно, то по идее в секунду будут проскакивать 25 кадров, плёнка будут смещаться каждый раз на 25 шагов(кадров), так ли?
Я это расшифровал выше:
Цитата:
Сообщение от macomics Посмотреть сообщение
Потому что задержка для таймера указана в миллисекундах, а я вам написал комментарий про частоту кадров. И вот тут не хитрая математика:
1000 / 40 = 25 <- 25 раз в секунду сработает таймер и обеспечит 25 перерисовок (кадров).
Кадр это изображение в определенный момент времени, которое может быть одним из последовательности. Обычно между кадрами в последовательности равные промежутки времени, но могут быть и произвольные.

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

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

Цитата:
Сообщение от apofioz Посмотреть сообщение
Какие способы более оптимальные?
Тот что вы создаете у себя в программе.
macomics вне форума Ответить с цитированием
Старый 11.03.2023, 04:18   #20
apofioz
Форумчанин
 
Регистрация: 22.01.2014
Сообщений: 313
По умолчанию

Цитата:
Сообщение от macomics Посмотреть сообщение
Я это расшифровал выше:
Будем считать, что я понял о чём идёт речь.


Цитата:
Сообщение от macomics Посмотреть сообщение
Тот что вы создаете у себя в программе.
Т.е. иначе никак, так что ли?
apofioz вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Добавление данных в столбцы ListBox Igor 1 Microsoft Office Excel 2 07.03.2014 00:40
Добавление строк c listbox на listbox WinApi Alll_ Visual C++ 1 21.11.2013 03:34
[Delphi 7] Добавление в ListBox выделенного текста Oldcentre Помощь студентам 2 17.11.2010 22:40
Добавление пунктов в ListBox AdvanceQ Общие вопросы Delphi 3 08.01.2010 21:06
Построчное добавление в ListBox nikolai_P Microsoft Office Excel 0 18.08.2009 12:16