Поиск:

Ответ в темуСоздание новой темы Создание опроса
> График через таймер, Как правильно... 
:(
    Опции темы
Coocky
Дата 30.1.2005, 10:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

Репутация: 25
Всего: 62



Вот столкнулся с проблемой..Нужно ,что б рисовалась синусоида постоянно ,нк в таймере,и изменялась в зависимости от данных.Типа осцилографа smile
Только как мне засунуть обработчик WM_TIMER в обработчик WM_PAINT,для корректной работы smile


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
alien_by
Дата 31.1.2005, 12:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 82
Регистрация: 29.11.2004
Где: Belarus/Gomel

Репутация: 5
Всего: 8



Ты просто в WM_PAINT отрисовывай то состояние графика, которое было в момент прихода WM_PAINT. Т.к. если таймер у тебя будет тикать достаточно часто, то WM_PAINT тебе нужно обрабатывать, только для того, чтобы небыло никаких артефактов при перетаскивании.

Т.е. простой примерчик, пусть график зависит только от времени...

Код

....
// Переменная времени
double m_dfTime;
....

void MyWnd::OnPaint()
{
    .....
    drawSinusoid(m_dfTime, ...);
}

void MyWnd::OnTimer()
{
    .....
    drawSinusoid(++m_dfTime, ...);
}

PM MAIL ICQ   Вверх
Adil'
Дата 31.1.2005, 13:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 311
Регистрация: 26.8.2004
Где: Питер

Репутация: 3
Всего: 15



alien_by все верно, только за одним исключением smile вся отрисовка должна быть в OnPaint, а в OnTimer лучше лиший раз не рисовать, а просто посылать окну WM_PAINT c прямоугольником отрисовки, соответствующим прямоугольнику графика. Можно для этого вызывать InvalidateRect.


--------------------
Удачи
PM MAIL WWW   Вверх
Coocky
Дата 31.1.2005, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

Репутация: 25
Всего: 62



alien_by
Я немного не пойму.А где обновление графика?


Добавлено @ 13:40
Adil
Я б давно реализовал эту идею ,если б не мерцание экрана smile


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
Coocky
Дата 31.1.2005, 14:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

Репутация: 25
Всего: 62



Але!Спецы!


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
Adil'
Дата 31.1.2005, 15:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 311
Регистрация: 26.8.2004
Где: Питер

Репутация: 3
Всего: 15



Цитата(Coocky @ 31.1.2005, 13:39)
Я немного не пойму.А где обновление графика?
Насколько я понял - в drawSinusoid(m_dfTime, ...);


Цитата(Coocky @ 31.1.2005, 13:39)
Я б давно реализовал эту идею ,если б не мерцание экрана
А причем здесь эта идея и мерцание экрана? Экран мерцать будет и в способе alien_by - тут главное как реализована сама отрисовка.


--------------------
Удачи
PM MAIL WWW   Вверх
alien_by
Дата 31.1.2005, 17:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 82
Регистрация: 29.11.2004
Где: Belarus/Gomel

Репутация: 5
Всего: 8



Цитата
ien_by все верно, только за одним исключением smile вся отрисовка должна быть в OnPaint

Согласен. smile

Цитата
Я б давно реализовал эту идею ,если б не мерцание экрана


Мерцание, можно убрать следующими способами.
1. Если работа по отрисовке слишком громоздкая, то можно уменьшить частоту тиков таймера.
2. Вызывать функцию InvalidateRect или InvalidateRgn не с параметром NULL (который указывает, что нужно перерисовать всё), а с конкретным ректом или регионом (лучше всё таки ректом smile ) который нужно перерисовать.
3. Сделать функцию отрисовки более "интеллектуальной", в см. не тупо перерисовывающей график при каждом вызове, а анализирующей было ли изменение данных, повлекшее измененние представления.
4. И самый эффективный способ на мой взгляд - не выводить информацию прямо в контекст устройства, а создавать новый compatible контекст в памяти, рисовать всё что надо в него, а затем с помощью функции bitBlt переносить весь рисунок в свой основной контекст как битмап!!!
PM MAIL ICQ   Вверх
Nastya
Дата 31.1.2005, 22:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 27.3.2002
Где: Мариуполь

Репутация: 1
Всего: 44



Все ресуешь в Paint, а в таймере вызывашь InvalidateRect - он вызывает перерисовку, а следовательно и WM_PAINT для того прямоугольника. который ты передал.
Но тут может появится мерцание, если появится напиши, объясню как боротся. а лучше кусочек кода дай.
Параметры для перересовке, соответственно объялеешь как методы класса а не как локальные в фунциях. ну это думаю ясно smile


--------------------
Что бы понять рекурсию, надо понять рекурсию

"Профессионал - это человек сделавший все возможные ошибки в очень узкой области". Н.Бор
PM MAIL   Вверх
Coocky
Дата 1.2.2005, 09:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

Репутация: 25
Всего: 62



Цитата
И самый эффективный способ на мой взгляд - не выводить информацию прямо в контекст устройства, а создавать новый compatible контекст в памяти, рисовать всё что надо в него, а затем с помощью функции bitBlt переносить весь рисунок в свой основной контекст как битмап!!!

И что не будет мерцания?


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
S.A.P.
Дата 1.2.2005, 09:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2664
Регистрация: 11.6.2004

Репутация: 2
Всего: 71



Coocky мерцание будет по любому. Особенно если частота обновления высока. Мерцание возникает в том случае, если картинка не успевает до конца прорисоваться, до следующей прорисовки или прорисока настолько редка, что заметна человеческим глазом. Я как то делал подобное на QT. Могу сказать, что графика там достаточно оптимизированна. Можно еще попробовать DirectX...

Как оптимизировать GDI... Тут хорошо бы показать код, которым ты выводишь картинку. Могу предположить, что перед перерисовкой картинка стирается и заново рисуется, причем вся, а надо только стирать саму синусоиду.

Как стереть только синусоиду? Тут я пока остановлюсь...... smile

Это сообщение отредактировал(а) Perchilla - 1.2.2005, 09:42
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.1425 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.