160 / 159 / 13
Регистрация: 14.01.2010
Сообщений: 1,497
|
|
1 | |
Мерцание08.05.2010, 09:47. Показов 6904. Ответов 21
Метки нет (Все метки)
Необходимо перерисовывать картинку(изменяя размер). Во время перерисовки идет заметное моргание.
Как с этим справится?
0
|
08.05.2010, 09:47 | |
Ответы с готовыми решениями:
21
Мерцание ячеек СтрингГрид Временное мерцание RAD Studio XE 10.2 Мерцание изображения при табуляции Мерцание компонента Timage и перемещение Timage при нажатии |
35 / 34 / 17
Регистрация: 28.04.2009
Сообщений: 67
|
|
08.05.2010, 10:16 | 2 |
Создать 2-ой буфер, рисовать в нем, потом за один раз выводить из буфера в рабочую область.
0
|
160 / 159 / 13
Регистрация: 14.01.2010
Сообщений: 1,497
|
|
11.05.2010, 12:05 [ТС] | 3 |
Так и делаю но все равно мерцает
0
|
306 / 187 / 26
Регистрация: 14.02.2010
Сообщений: 544
|
|
11.05.2010, 17:36 | 4 |
Не перерисовывать дважды ни одной области, даже из нескольких точек
0
|
160 / 159 / 13
Регистрация: 14.01.2010
Сообщений: 1,497
|
|
12.05.2010, 11:53 [ТС] | 5 |
Перерисовка происходит при изменении размера формы(resize), там много надо перерисовывать и при этом менять размер изображения.
Отлавливал сообщение о прекращении изменения размера, но там не смог определить когда форма на максимум развернется. Хотя б про это скажите.
0
|
306 / 187 / 26
Регистрация: 14.02.2010
Сообщений: 544
|
||||||
12.05.2010, 12:27 | 6 | |||||
1
|
160 / 159 / 13
Регистрация: 14.01.2010
Сообщений: 1,497
|
||||||||||||||||
12.05.2010, 17:11 [ТС] | 7 | |||||||||||||||
А максимализацию формы как отловить, что бы только ее окончание? WM_WINDOWPOSCHANGED слишком много сообщений. Пытаюсь определить максимизацию
Добавлено через 1 час 8 минут Вроде сделал Потестите, можть что не так
0
|
306 / 187 / 26
Регистрация: 14.02.2010
Сообщений: 544
|
|
12.05.2010, 17:39 | 8 |
Держать флаг состояния нет необходимости, т.к. то, что произошло с формой, указано в wParam хотя бы WM_SIZE. Подробности почитайте в MSDN или справке Delphi, только выберите раздел "Windows SDK"
0
|
160 / 159 / 13
Регистрация: 14.01.2010
Сообщений: 1,497
|
|
14.05.2010, 17:52 [ТС] | 9 |
А можете сказать как сделать класс, чтоб он перехватывал изменение размера по этому методу(см выше).
А перехват того же для листвью как сделать?
0
|
306 / 187 / 26
Регистрация: 14.02.2010
Сообщений: 544
|
|
15.05.2010, 13:23 | 10 |
Так когда Вы сделали обычный проект в Delphi, то TForm1 = class(TForm) и есть класс. Обзовите его как-то по, хотя бы TMyForm - и будет отдельный класс со всем, что имеется на форме. Хотя, делать класс имеет смысел, когда у Вас все отлажено и все нормально работает. Ведь класс - грубо говоря - просто шаблон для создаваемого на его основе объекта.
Если под листвью понимается ListView, то зачем ловить сообщения о размере для отдельных дочерних элементов окна, если их размер все равно, как правило, меняется только при изменении размеров самой формы, ну или, при перемещении сплиттера, но опять же, не на элементе, а на его родителе. Если уж очень хочется, чтобы элемент сам себя менял, так проще послать ему хотя бы то же самое сообщение, а лучше определить какое-то свое особенное.
0
|
160 / 159 / 13
Регистрация: 14.01.2010
Сообщений: 1,497
|
|
15.05.2010, 14:49 [ТС] | 11 |
Я хочу сделать что то типа ActionList, кидаешь его на форму и он отлавливает изменения формы.
А для listview мне надо чтоб перерисовывать только тогда когда изменится размер формы. Хочу запихнуть в свой класс на основе listview.
0
|
306 / 187 / 26
Регистрация: 14.02.2010
Сообщений: 544
|
|
15.05.2010, 22:03 | 12 |
Вообще-то перерисовывать только при изменении размера при полностью OwnerDraw-отрисовке неверно. Получится, что, например, когда ваш View перекроется другим окном, то он после этого будет просто белым пятном. Перерисовка д.б. по WM_PAINT, как и для любого Windows-окошка.
Ну а по реализации - наследуйте свой класс от CustomListView и переопределяйте реакцию на нужные message. А у самого ListView есть событие OnResize. Добавлено через 3 минуты насколько знаю ActionList - вообще не визуальный компонент, поэтому строить свой визуальный компонент по его образцу будет, наверное, тяжеловато лучше гляньте реализацию в CustomListView.DrawWorkAreas
0
|
160 / 159 / 13
Регистрация: 14.01.2010
Сообщений: 1,497
|
||||||
15.05.2010, 22:37 [ТС] | 13 | |||||
Я не так выразился listview не перерисовывается а обновляются элементы при изменении размера (а то они они остаются на месте), как можно это обойти, может есть специальная настройка. Поверх listview есть панель и она перерисовывается (на ней пейнтбокс с событием онпейнт). Однако мерцание сильное.
Хочу чтобы форма сообщала когда применить обновление элементов. Пытался добавить в класс listview сообщение WM_EXITSIZEMOVE, но оно не пошло, а WM_SIZE пошло но оно мне не надо. Есть такой компонент ApplicationEvents (не визуальный), сделал клас на основе него, но сообщения о перемещении и размере он не ловит (см ниже), а сообщение WM_NCRBUTTONDOWN ловит В общем странно. Может не то событие надо брать.
0
|
306 / 187 / 26
Регистрация: 14.02.2010
Сообщений: 544
|
|
16.05.2010, 10:25 | 14 |
Не понял, как связаны ListView и панель поверх него. Панель отображает элементы списка?
Для своей отрисовки лучше бы применять OnCustomDraw, OnAdvancedCustomDraw, OnAdvancedCustomDrawItem/SubItem. Тогда никаких отслеживаний размера вообще не нужно-нужный Rect уже будет предоставлен. Из приведенного кода и описания абсолютно неясно что вы пытаетесь сделать. И вообще - попробуйте поискать в нете типа "отрисовка ListView", наверное на примерах будет более понятно, что и как делать.
0
|
160 / 159 / 13
Регистрация: 14.01.2010
Сообщений: 1,497
|
|
16.05.2010, 11:56 [ТС] | 15 |
Нету ни какой отрисовки на listview, просто когда меняется ее размер ее элементы остаются на месте и мне приходится их обновлять чтоб они приняли более красивый вид. Может есть сво для этого.
Я все таки хочу узнать как можно создать класс. Он мне нужен.
0
|
306 / 187 / 26
Регистрация: 14.02.2010
Сообщений: 544
|
|
16.05.2010, 16:45 | 16 |
Так это и есть эта самая "отрисовка"-то бишь визуальное отображение элемента в том или другом виде.
По поводу создания класса уже говорил. Если хотите конкретный пример - объясните популярно, что и как хотите отобразить. Лучше выложите то, что у Вас есть, но в самое ближайшее время не обещаю - эта неделя обещает быть загруженной, так что... Но может и выдастся часок.
0
|
160 / 159 / 13
Регистрация: 14.01.2010
Сообщений: 1,497
|
|
16.05.2010, 18:22 [ТС] | 17 |
На ресайзе формы (onresize) слишком много обращений и процесс перерисовки и обновления мигает.
пока обновится listview а затем надо нарисовать на пейнтбоксе картинку. Можно ли пейнтбоксу назначит doublebufer:=true? гдето в глубине оно должно быть. Внизу показана идея класса, вот ее я и хочу реализовать. Как перехватывать в классе сообщения о перемещении формы? давайте отойдем от listview и займемся классом, просто стало интересно, а если сделаем то и первая проблема наверно отпадет.
0
|
306 / 187 / 26
Регистрация: 14.02.2010
Сообщений: 544
|
|
18.05.2010, 12:38 | 18 |
Опять не показали ваш имеющийся мерцающий код.
Проблема у Вас в мерцании при отрисовке - а создание какого-то абстрактного класса, который будет реагировать на изменение своего размера, эту проблему совсем не решит. Используйте событие OnDrawItem или OnCustomDraw или их комбинацию - и никакого отслеживания размера абсолютно не потребуется - они будут происходить только тогда, когда необходимо обновить отображение элемента, в том числе и при изменении размера. Я тут попробовал на досуге, так никакого мерцания при изменении размера нет. Правда при прокрутке все равно мерцание в отдельные моменты есть. Но такое поведение проявляется практически у каждого многоэлементного контрола и победить его можно, насколько знаю, только снижением частоты отрисовки, вызванной прокруткой ScrollBar-ов. И еще раз - выложите свой мерцающий код - только тогда можно будет сказать что-то конкретное.
0
|
160 / 159 / 13
Регистрация: 14.01.2010
Сообщений: 1,497
|
||||||
18.05.2010, 19:58 [ТС] | 19 | |||||
Тут главное теория
вот часть кода, целый код занимает 9 страниц(только компанент)
если число элементов листвью (iImgCountForMas>0 (счетчик введен для массива) ) больше 0 то обновляем весь листвью A_ReDrawListView();, если ройдено условие(выбран элемент) то обновляет и изображение на панели(SetImgSize img(timage) пропорционально сжимает картинку (размер картинки не больше 800*600), которая находится на панели. Тем не менее мне интересен сам класс о котором писал выше, мне нужен класс родитель, способный предоставить событие перехватывающее сообщения о перемещении формы и зменении размера.
0
|
306 / 187 / 26
Регистрация: 14.02.2010
Сообщений: 544
|
||||||
20.05.2010, 09:29 | 20 | |||||
Первое: Такого в Pascal сделать невозможно, т.к., насколько помню, Pascal не поддерживает множественное наследование. Поэтому для получения какого-то дополнительного эффекта какого-то отдельного типа элемента нужно взять именно этот тип и добавить в него свой эффект, а получить новый тип из двух и более типов не получится. Обойти это можно (не переписывая всю VCL), насколько знаю, можно только через использование COM, но заморочки с регистрациями, интерфейсами и прочей лабудой явно не соответствуют полученному результату. И второе: об изменении размера/позиции родительского окна (формы) его дочерние окна не уведомляются, если только сам родитель об этом не позаботится. Ведь и позиция (по отношению к родительскому окну) и размер самого элемента при этом не меняется. И третье - код, пусть даже из 999 страниц можно упаковать и выложить.
Но если уж непременно надо пример класса, то я лично представляю примерно как
1
|
20.05.2010, 09:29 | |
20.05.2010, 09:29 | |
Помогаю со студенческими работами здесь
20
мерцание Мерцание Мерцание в ScrollBox`e Мерцание формы Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |