Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: окно требует перерисовки ?  (Прочитано 8772 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« : 07-06-2008 04:22 » 

почти теоретический вопрос ))
К примеру, такая ситуация: идут длительные вычисления, окно не может принимать WM_PAINT , а его кто-нибудь потёр другим окном или же сама программа его Invalidate() .
И вопрос такой: как определить, требуется ли окну перерисовка ? (просто заставить окно перерисоваться по UpdateWindow - не нужно, хотелось бы определить, нужна ли сейчас перерисовка, пото му что UpdateWindow можно было бы тупо в цикле вычислений вызывать, но это - лишние перерисовки)
Записан

sss
Специалист

ru
Offline Offline

« Ответ #1 : 07-06-2008 04:37 » 

Алексей1153++, а почему в цикле не вынимать сообщения ? Тем более сообщения будут стоять в очереди. Когда цикл освободиться, они все изымуться и будут обработаны...
« Последнее редактирование: 07-06-2008 04:48 от sss » Записан

while (8==8)
zubr
Гость
« Ответ #2 : 07-06-2008 05:57 » 

Как вариант, в конце цикла делать что то типа:
Код:
while(PeekMessage(Msg, 0, 0, 0, PM_REMOVE))
{
     TranslateMessage(Msg);
      DispatchMessage(Msg);
}
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #3 : 07-06-2008 06:41 » 

zubr, наверное, оно самое )

только в таком виде тогда
Код:
while(PeekMessage(Msg, 0, WM_PAINT, WM_PAINT, PM_REMOVE))
{
     TranslateMessage(Msg);
      DispatchMessage(Msg);
}

или даже

Код:
while(PeekMessage(Msg, m_hWnd, WM_PAINT, WM_PAINT, PM_REMOVE))
{
  UpdateWindow();
}

хотя, надо пробовать
« Последнее редактирование: 07-06-2008 06:45 от Алексей1153++ » Записан

zubr
Гость
« Ответ #4 : 07-06-2008 06:55 » 

Алексей1153++, мой код более универсальный. То есть позволяет не только прорисовку обеспечить, но и получение сообщений контролами приложения, что позволяет длительный цикл размещать в главном потоке программы.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #5 : 07-06-2008 07:23 » 

zubr, это понятно, но мне реакция контролов сейча неважна, важна только отрисовка
Записан

sss
Специалист

ru
Offline Offline

« Ответ #6 : 07-06-2008 07:28 » 

Алексей1153++, делай как zubr говорит. Допустим, предусмотри некую кнопку "Останов",  которая устанавливает bool переменную, сигнализирующую что пользователь хочет прервать вычисления. Или ради специфичной обработки нажатия X кнопки окна.
Записан

while (8==8)
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #7 : 07-06-2008 08:17 » 

sss, нет, я уже понял, как мне сделать. Останов мне там не нужен, а если надо будет - это уже не проблем )
Записан

sss
Специалист

ru
Offline Offline

« Ответ #8 : 07-06-2008 08:26 » 

Хозяин барин  Улыбаюсь
Записан

while (8==8)
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines