|
|
|
Coocky |
|
|||
GUI гуру Профиль Группа: Участник Клуба Сообщений: 2879 Регистрация: 16.2.2004 Где: Украина. Запорожь е Репутация: 25 Всего: 62 |
Вот столкнулся с проблемой..Нужно ,что б рисовалась синусоида постоянно ,нк в таймере,и изменялась в зависимости от данных.Типа осцилографа
Только как мне засунуть обработчик WM_TIMER в обработчик WM_PAINT,для корректной работы -------------------- Верю в смерть после жизни, в любовь после секса ,в крем после бритья |
|||
|
||||
alien_by |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 82 Регистрация: 29.11.2004 Где: Belarus/Gomel Репутация: 5 Всего: 8 |
Ты просто в WM_PAINT отрисовывай то состояние графика, которое было в момент прихода WM_PAINT. Т.к. если таймер у тебя будет тикать достаточно часто, то WM_PAINT тебе нужно обрабатывать, только для того, чтобы небыло никаких артефактов при перетаскивании.
Т.е. простой примерчик, пусть график зависит только от времени...
|
|||
|
||||
Adil' |
|
|||
Опытный Профиль Группа: Участник Сообщений: 311 Регистрация: 26.8.2004 Где: Питер Репутация: 3 Всего: 15 |
alien_by все верно, только за одним исключением вся отрисовка должна быть в OnPaint, а в OnTimer лучше лиший раз не рисовать, а просто посылать окну WM_PAINT c прямоугольником отрисовки, соответствующим прямоугольнику графика. Можно для этого вызывать InvalidateRect.
-------------------- Удачи |
|||
|
||||
Coocky |
|
|||
GUI гуру Профиль Группа: Участник Клуба Сообщений: 2879 Регистрация: 16.2.2004 Где: Украина. Запорожь е Репутация: 25 Всего: 62 |
alien_by
Я немного не пойму.А где обновление графика? Добавлено @ 13:40 Adil Я б давно реализовал эту идею ,если б не мерцание экрана -------------------- Верю в смерть после жизни, в любовь после секса ,в крем после бритья |
|||
|
||||
Coocky |
|
|||
GUI гуру Профиль Группа: Участник Клуба Сообщений: 2879 Регистрация: 16.2.2004 Где: Украина. Запорожь е Репутация: 25 Всего: 62 |
Але!Спецы!
-------------------- Верю в смерть после жизни, в любовь после секса ,в крем после бритья |
|||
|
||||
Adil' |
|
||||
Опытный Профиль Группа: Участник Сообщений: 311 Регистрация: 26.8.2004 Где: Питер Репутация: 3 Всего: 15 |
-------------------- Удачи |
||||
|
|||||
alien_by |
|
||||
Шустрый Профиль Группа: Участник Сообщений: 82 Регистрация: 29.11.2004 Где: Belarus/Gomel Репутация: 5 Всего: 8 |
Согласен.
Мерцание, можно убрать следующими способами. 1. Если работа по отрисовке слишком громоздкая, то можно уменьшить частоту тиков таймера. 2. Вызывать функцию InvalidateRect или InvalidateRgn не с параметром NULL (который указывает, что нужно перерисовать всё), а с конкретным ректом или регионом (лучше всё таки ректом ) который нужно перерисовать. 3. Сделать функцию отрисовки более "интеллектуальной", в см. не тупо перерисовывающей график при каждом вызове, а анализирующей было ли изменение данных, повлекшее измененние представления. 4. И самый эффективный способ на мой взгляд - не выводить информацию прямо в контекст устройства, а создавать новый compatible контекст в памяти, рисовать всё что надо в него, а затем с помощью функции bitBlt переносить весь рисунок в свой основной контекст как битмап!!! |
||||
|
|||||
Nastya |
|
|||
Эксперт Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 27.3.2002 Где: Мариуполь Репутация: 1 Всего: 44 |
Все ресуешь в Paint, а в таймере вызывашь InvalidateRect - он вызывает перерисовку, а следовательно и WM_PAINT для того прямоугольника. который ты передал.
Но тут может появится мерцание, если появится напиши, объясню как боротся. а лучше кусочек кода дай. Параметры для перересовке, соответственно объялеешь как методы класса а не как локальные в фунциях. ну это думаю ясно -------------------- Что бы понять рекурсию, надо понять рекурсию "Профессионал - это человек сделавший все возможные ошибки в очень узкой области". Н.Бор |
|||
|
||||
Coocky |
|
|||
GUI гуру Профиль Группа: Участник Клуба Сообщений: 2879 Регистрация: 16.2.2004 Где: Украина. Запорожь е Репутация: 25 Всего: 62 |
И что не будет мерцания? -------------------- Верю в смерть после жизни, в любовь после секса ,в крем после бритья |
|||
|
||||
S.A.P. |
|
|||
Эксперт Профиль Группа: Участник Клуба Сообщений: 2664 Регистрация: 11.6.2004 Репутация: 2 Всего: 71 |
Coocky мерцание будет по любому. Особенно если частота обновления высока. Мерцание возникает в том случае, если картинка не успевает до конца прорисоваться, до следующей прорисовки или прорисока настолько редка, что заметна человеческим глазом. Я как то делал подобное на QT. Могу сказать, что графика там достаточно оптимизированна. Можно еще попробовать DirectX...
Как оптимизировать GDI... Тут хорошо бы показать код, которым ты выводишь картинку. Могу предположить, что перед перерисовкой картинка стирается и заново рисуется, причем вся, а надо только стирать саму синусоиду. Как стереть только синусоиду? Тут я пока остановлюсь...... Это сообщение отредактировал(а) Perchilla - 1.2.2005, 09:42 |
|||
|
||||
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |