Перерисовка области окна
От: Phoenickx  
Дата: 25.09.04 19:47
Оценка:
Проблема такая,в рабочей области есть два прямоугольника,в одном из них при перерисовке отображается анимация (движение с помщью sleep()) нужно чтобы после анимации перерисовывалось второе окно,код такой:


//...
 case WM_COMMAND:
      switch (LOWORD(wParam))
        {
         case ID_BUTTON1:
              InvalidColumns(hwnd,&rect);         //недействителен один прямоугольник(с анимацией)
              InvalidateRect(hwnd,&rect,TRUE);    //недействителен второй прямоугольник
              break;  
             

//...

при таком коде второй прямоугольник пропадает на время движения в первом,а затем обновляется.
Нужно чтобы не пропадал второй прямоугольник,кто-нибудь может помочь?
Re: Перерисовка области окна
От: Dervish Россия http://www.dervish.ru
Дата: 25.09.04 20:05
Оценка:
Здравствуйте, Phoenickx, Вы писали:

P>при таком коде второй прямоугольник пропадает на время движения в первом,а затем обновляется.

P>Нужно чтобы не пропадал второй прямоугольник,кто-нибудь может помочь?

А вы думаете, что InvalidateRect перерисовывает окно? Ничего подобного! InvalidateRect просто помечает область окна как невалидную (требующую перерисовки) и тут же возвращается. И только тогда, когда ваша программа закончит текущую работу (чуть сложнее, конечно же, но я сознательно упростил), только тогда, если есть невалидные области у окна, Windows генерирует сообщение WM_PAINT.

А дальше происходит вот что:

Когда вы обрабатываете сообщение WM_PAINT, в вашем окне оба прямоугольника уже помечены как невалидные. А когда вы вызываете BeginPaint, автоматически генерируется сообщение WM_ERASEBKGND, при обработке которого успешно затираются оба прямоугольника.

Как решить проблему? Есть несколько вариантов:

  1. Самое простое — поставить после InvalidColumns вызов UpdateWindow.
  2. Не использовать InvalidateRect для первого прямоугольника, а просто получать контекст окна через GetDC и рисовать в нём.
  3. Создать ещё два окна. В первом разместить вашу анимацию, во втором — второй прямоугольник.

Это то, что сразу пришло в голову. Может быть есть ещё варианты.
... << RSDN@Home 1.1.4 beta 3 rev. 185>>
Re[2]: Перерисовка области окна
От: Phoenickx  
Дата: 25.09.04 20:18
Оценка:
Здравствуйте, Dervish, Вы писали:

D>Здравствуйте, Phoenickx, Вы писали:


P>>при таком коде второй прямоугольник пропадает на время движения в первом,а затем обновляется.

P>>Нужно чтобы не пропадал второй прямоугольник,кто-нибудь может помочь?

D>А вы думаете, что InvalidateRect перерисовывает окно? Ничего подобного! InvalidateRect просто помечает область окна как невалидную (требующую перерисовки) и тут же возвращается. И только тогда, когда ваша программа закончит текущую работу (чуть сложнее, конечно же, но я сознательно упростил), только тогда, если есть невалидные области у окна, Windows генерирует сообщение WM_PAINT.


D>А дальше происходит вот что:


D>Когда вы обрабатываете сообщение WM_PAINT, в вашем окне оба прямоугольника уже помечены как невалидные. А когда вы вызываете BeginPaint, автоматически генерируется сообщение WM_ERASEBKGND, при обработке которого успешно затираются оба прямоугольника.


D>Как решить проблему? Есть несколько вариантов:


D>

    D>
  1. Самое простое — поставить после InvalidColumns вызов UpdateWindow.
    D>
  2. Не использовать InvalidateRect для первого прямоугольника, а просто получать контекст окна через GetDC и рисовать в нём.
    D>
  3. Создать ещё два окна. В первом разместить вашу анимацию, во втором — второй прямоугольник.
    D>

Спасибо!мысль понял,но самое простое не работает: UpdateWindow вызывает зависание программы
Идея с двумя окнами мне понравилась,надо попробывать
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.