Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> очень часто вызывается wm_paint 
V
    Опции темы
evilsoul
Дата 4.5.2011, 20:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

Репутация: нет
Всего: 0



Здравствуйте все.
Помогите разобраться с wm_paint, я как понимаю wm_paint вызывается при перерисовке окна, например изменении размеров, перемещении или вызове InvalidateRect.

Пишу следующий код в WM_PAINT
Код

        static int count = 0;
        .....
        case WM_PAINT:
            count++;
            char buffer[100];
            RECT rect;
            GetClientRect(hwnd, &rect);
            itoa(count, buffer, 10);
            TextOut(dc, 10, 10, buffer, strlen(buffer));
            break;


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

Помогите разобраться, так должно быть и я чего то не понимаю.
Мне кажется что  WM_PAINT не должен вызываться так часто.
PM MAIL   Вверх
evilsoul
Дата 4.5.2011, 21:23 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

Репутация: нет
Всего: 0



Все всем спасибо, разобрался сам.
Надо добавить BeginPaint и EndPaint
Примерно так
Код

        case WM_PAINT: 
            hdc = BeginPaint(hwnd, &ps); 
            .....
            EndPaint(hwnd, &ps); 
            break;



Это сообщение отредактировал(а) evilsoul - 4.5.2011, 21:24
PM MAIL   Вверх
VictorTsaregorodtsev
Дата 4.5.2011, 21:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



BeginPaint+EndPaint? Или 0 вместо 1 возвращается Вашей функцией обработки сообщений?
PM MAIL WWW   Вверх
evilsoul
Дата 4.5.2011, 21:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

Репутация: нет
Всего: 0



Маленько не понял суть вопроса, так что объясню всю ситуацию.

Была проблема что я нарисовал в wm_paint рисунок через gdi , но он мерцал при отображении, тогда я поставил счетчик вызовов и увидел что событие wm_paint вызывается постоянно.

сейчас я поставил beginPaint и endPaint и все работает нормально.

Оконная процедура возвращает 0.

Если я что то делаю не правильно, буду не против объяснения, ибо не силен в данной теме

Добавлено через 3 минуты и 21 секунду
Я как понимаю beginPaint и EndPaint нужны что в ручную не отслеживать что конкретно надо перерисовывать, а выделяют только нужный прямоугольник и его перерисовывают, отрисовка, которая происходит вне этого прямоугольника игнорируется.
PM MAIL   Вверх
Earnest
Дата 5.5.2011, 05:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 33
Всего: 183



BeginPaint\EndPaint, кроме прочего, помечают невалидный регион окна как валидный, и WM_PAINT перестает посылаться (до следующей инвалидации). А если этого не сделать, система будет считать, что регион по прежнему невалидный (т.е. нуждается в перерисовке), и слать WM_PAINT до посинения. И неважно, рисуешь ты при этом в окне или нет... Что у тебя и происходило. 
Ну и насчет отсечения ты прав.


--------------------
...
PM   Вверх
evilsoul
Дата 5.5.2011, 06:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

Репутация: нет
Всего: 0



Спасибо за пояснение, теперь понятно почему так происходило.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




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


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

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