Отрисовка ProgressBar

Тема в разделе "WASM.WIN32", создана пользователем Namelles_One, 25 ноя 2009.

  1. Namelles_One

    Namelles_One New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2007
    Сообщения:
    39
    Господа, проблема с тормозами при отрисовке ProgressBar, при его увеличении. Привожу код.


    Код (Text):
    1.     else if (message == WM_TIMER)
    2.     {
    3.         ::SendMessage(GetDlgItem(hWnd, IDC_PROGRESS1), PBM_STEPIT, 0, 0);
    4.         UINT result = ::SendMessage(GetDlgItem(hWnd, IDC_PROGRESS1), PBM_GETPOS, 0, 0);
    5.         ::wsprintf(wsPercent, L"%d%%", result*10);
    6.         ::SetWindowText(hEdit, wsPercent);
    7.     }
    То есть — увеличивается длина Bar-а и изменяется сообщение о его состоянии.

    Фишка в чем — в result кладется уже новое (то есть верное значение), текст в hEdit меняется мгновенно, а перерисовка — лишь спустя доли секунды. То есть, глазами это наблюдать неприятно. Можно ли добиться того, чтобы значение в поле и отрисовка Bar-а будет проходить одновременно?..
     
  2. Blackbeam

    Blackbeam New Member

    Публикаций:
    0
    Регистрация:
    28 дек 2008
    Сообщения:
    960
    можно
     
  3. Namelles_One

    Namelles_One New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2007
    Сообщения:
    39
    Воистину программистский ответ, окей.

    Итак, перефразирую вопрос - "как можно этого добиться"?)
     
  4. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    InvalidateRect() ?
     
  5. Namelles_One

    Namelles_One New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2007
    Сообщения:
    39
    Делал и это седня и UpdateWindow() - не помогает.
     
  6. Namelles_One

    Namelles_One New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2007
    Сообщения:
    39
    Хм, проблема решена.

    Итого, в Windows XP все работает как должно - синхронно, а в Vista и 7 - наблюдаем вышеупомянутое отставание, ни в каком MSDN не описанное.

    Прикольно.
     
  7. qqwe

    qqwe New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2009
    Сообщения:
    2.914
    Namelles_One
    и как?
    почему не описанное? там же говорится, что инвалидный регион ставится в очередь сообщений, а отрисовка не самое первоочередное, те перерисовываться будет только когда в очереди останется только перерисовка.
    кстати, перерисовка это не сообщение, а флаг. те если вы до самой отрисовки пошлете еще 10 сообщений о ней - отрисуется только раз. кроме того, надо учитывать регион перерисовки

    и последнее. чтобы перерисовывалось в гди без ожидания, надо пользовать функцию
    RedrawWindow
    поэкспериментируйте только с ее флагами