Мерцающий шарик и никакого удовольствия.
От: Par-zzz  
Дата: 04.12.02 21:01
Оценка:
Здравствуйте.

Пишу програмку — диалог, в контексте которого постоянно приходиться перерисовывать битмап, а он собака, ну так противно перерисовывается, аж смотреть на эти мерцания не хочется. Может кто подскажет как избавиться(или хоть как-то улучшить).
Схема действий такова:
-- получаем сообщение WM_TIMER
-- делаем InvalidateRect(...)
-- делаем BitBlt(...) в рамках указанного rect
-- получаем мерцающую картинку
Как все это выглядит можно узнать здесь — http://ccfit.nsu.ru/~eryshov/files/BallKick.rar, советы принимаются в любом количестве.

Спасибо.
/**
* у человека столько проблем, сколько он их себе создает
*/
Re: Мерцающий шарик и никакого удовольствия.
От: VaDuke Россия www.Lybex.Ru
Дата: 05.12.02 00:32
Оценка:
Хм...
Как помочь не знаю, но штучка клёвая
Re: Мерцающий шарик и никакого удовольствия.
От: Demiurg  
Дата: 05.12.02 01:02
Оценка:
Здравствуйте, Par-zzz, Вы писали:

PZ>Здравствуйте.


PZ>Пишу програмку — диалог, в контексте которого постоянно приходиться перерисовывать битмап, а он собака, ну так противно перерисовывается, аж смотреть на эти мерцания не хочется. Может кто подскажет как избавиться(или хоть как-то улучшить).

PZ>Схема действий такова:
PZ> -- получаем сообщение WM_TIMER
PZ> -- делаем InvalidateRect(...)
PZ> -- делаем BitBlt(...) в рамках указанного rect
PZ> -- получаем мерцающую картинку

Как реализована обработка WM_PAINT? Мячик рисуется на основном битмапе, а потом все это переносится в окно? Если так, то мерцания быть не должно (или наоборот все окно будет мерцать , но это зависит от стиля окна), но будет медленно. Ты расскажи подробнее.
Я бы использовал DirectDraw
Re: Мерцающий шарик и никакого удовольствия.
От: kiamor  
Дата: 05.12.02 06:08
Оценка:
Здравствуйте, Par-zzz,

Рисование в контекст памяти не пробовал?
Re: Мерцающий шарик и никакого удовольствия.
От: Андрей Россия  
Дата: 05.12.02 06:16
Оценка:
Здравствуйте, Par-zzz, Вы писали:

skip

А InvalidateRect ты как вызываешь? Попробуй последний параметр задать FALSE — тогда область стираться не будет, ты ведь все равно ее всю закроешь BitBlt.
А вообще-то нужно исходный код рисования посмотреть, чтобы более полезный совет дать
Re: Я обычно делаю так...
От: Pushkin Россия www.linkbit.com
Дата: 05.12.02 07:31
Оценка:
Здравствуйте, Par-zzz, Вы писали:

Она, гадина, стирать сама любит. А надо ей не давать. И рисовать через память.
Я обычно делаю так:

BOOL CTraceView::OnEraseBkgnd(CDC* pDC)
{
    return TRUE;
}

void CTraceView::OnPaint() 
{
    CPaintDC dc(this); 
    CRect rc;     GetClientRect(&rc);
    CDC memdc;    memdc.CreateCompatibleDC(&dc);
    CBitmap bmp;  bmp.CreateCompatibleBitmap(&dc, rc.Width(),rc.Height()); 
    CBitmap* old =memdc.SelectObject(&bmp);

    OnDraw(&memdc);

    dc.BitBlt(0,0,rc.Width(),rc.Height(),&memdc,0,0,SRCCOPY);
    memdc.SelectObject(old);
}


А в OnDraw уже рисую и ни о чём не думаю
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.