![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Форумчанин
Регистрация: 22.01.2014
Сообщений: 313
|
![]()
Здравствуйте! Как можно сделать так чтобы при добавлении строки в listbox, эту строку подсвечивать цветом, допустим красным, и ещё хотелось бы узнать, возможно ли сделать так, что бы при добавление строки она подсвечивалась, но не просто подсвечивалась, а, как бы, мигала что ли т.е. строка не просто подсвечена, но она несколько раз изменяет цвет.
![]() wm_ctlcolorlistbox? |
![]() |
![]() |
![]() |
#2 |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,363
|
![]()
WM_DRAWITEM
|
![]() |
![]() |
![]() |
#3 |
Форумчанин
Регистрация: 22.01.2014
Сообщений: 313
|
![]()
Что нужно сделать чтобы строка, последняя добавленная строка, выделялась цветом, а после того, как она стала предпоследней(была добавлена ещё строка(строки)), она становилась стандартного цвета. Как пример того чего я бы хотел добиться - это программы в которых при совпадении неких данных эти строки подсвечиваются что бы привлечь внимание. Может даже меняют цвет несколько раз эффект мигания.
Вот код wm_drawitem, не знаю насколько он верен. Код:
|
![]() |
![]() |
![]() |
#4 |
Участник клуба
Регистрация: 17.04.2022
Сообщений: 1,833
|
![]()
Вы при добавлении строки в ListBox через SendMessage в ответ получаете индекс добавленной строки. Сохраняйте его в переменной и перерисовывайте строку с совпадающим с этой переменной индексом другим цветом.
Код:
|
![]() |
![]() |
![]() |
#5 |
Форумчанин
Регистрация: 22.01.2014
Сообщений: 313
|
![]()
WM_DRAWITEM отправляется при каждом добавлении строки в список, я правильно понимаю?
Последний раз редактировалось apofioz; 09.03.2023 в 21:33. |
![]() |
![]() |
![]() |
#6 |
Участник клуба
Регистрация: 17.04.2022
Сообщений: 1,833
|
![]()
Нет. WM_DRAWITEM отправляется при каждой перерисовке окна ListBox. Это может быть не только добавление нового элемента, но и удаление элемента, разворачивание родительского окна из свернутого состояния или перетаскивание родительского окна. В общем много когда необходимо перерисовывать окно. WM_DRAWITEM это функция, которая знает как это делать и все.
|
![]() |
![]() |
![]() |
#7 |
Форумчанин
Регистрация: 22.01.2014
Сообщений: 313
|
![]()
Функция? Я полагал, что это сообщение, и тот, кто это сообщение ловит тот и задаёт правила обработки....
Но при добавлении оно всё же вызывается я про сообщение wm_drawirem... Да, так заработало, выделяется нужная строка, строки которые были добавлены ранее рисуются цветом по умолчанию. Но заметил одну деталь, после того как строки перерисованы их нельзя выделить кликом мыши, почему? Это не очень хорошо. И ещё по поводу бликов/мерцания/изменения цвета строки несколько раз для привлечения внимания, с этим как быть, через таймер? |
![]() |
![]() |
![]() |
#8 | |
Участник клуба
Регистрация: 17.04.2022
Сообщений: 1,833
|
![]() Цитата:
Точно также как и с анимацией. Таймер задает интервалы перерисовки, а при перерисовке изменяется состояние анимации (для мигания состояния может быть и два, а может быть больше при плавной смене цвета: переливание). |
|
![]() |
![]() |
![]() |
#9 |
Форумчанин
Регистрация: 22.01.2014
Сообщений: 313
|
![]()
Нужно в ветке wm_create создать таймер, а как саму анимацию, если так можно выразиться, осуществлять, после вставки сообщения в ветке wm_drawitem менять цвет текста, я правильно понимаю? В wm_timer отправить сообщение wm_drawitem, видимо, так... Или это коряво?
|
![]() |
![]() |
![]() |
#10 |
Участник клуба
Регистрация: 17.04.2022
Сообщений: 1,833
|
![]()
В WM_TIMER достаточно инициировать перерисовку окна (в данном случае это ListBox), а уже окно само знает какие сообщения надо сгенерировать для его перерисовки. А в таймере достаточно вызвать
Код:
1) Сразу после вызова newLineIndex = SendMessage(hListBox, LB_ADDSTRING, ...) фиксируем время начала анимации animStart = GetTickCount(); 2) При перерисовке проверяем время прошедшее от начала анимации: animCurrent = GetTickCount(); if (animCurrent - animStart < 15000) { if (((animCurrent - animStart) / 500) & 1 == 0) { Первый цвет анимации } else { Второй цвет анимации }; } else { Стандартный цвет без анимации } В пункте 2 описана анимация длительностью 15000 мс (15 сек) и меняющая цвет текста каждые 500 мс При этом таймер перерисовки не надо запускать с точностью до длительности анимации. Его надо запустить с точностью частоты кадров Код:
Последний раз редактировалось macomics; 10.03.2023 в 16:21. |
![]() |
![]() |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Добавление данных в столбцы 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 |