Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.05.2012, 21:10   #1
Jugger
Пользователь
 
Регистрация: 30.01.2008
Сообщений: 99
По умолчанию InvalidateRect не приводит к сообщениям WM_PAINT

Есть таймер, в обработке сообщений от него вызывается InvalidateRect
По брейкпойнтам видно что таймер успешно посылает сообщения и все что там прописано проходит, то есть каждая строчка выполняется
А WM_PAINT вызывается всего один раз в начале
Компилятор Visual Studio 11
В чем может быть проблема ?

Код:
...
RECT rect_for_painting[1];
...
int APIENTRY _tWinMain(...){
...
rect_for_painting[0].top=10;
rect_for_painting[0].left=10;
rect_for_painting[0].right=660;
rect_for_painting[0].bottom=510;
...
}
...
LRESULT CALLBACK WndProc(...){
...
case WM_PAINT:
...
case WM_TIMER:
        a.step();
        InvalidateRect(hWnd,rect_for_painting,1);
        break;
...
}
...
Jugger вне форума Ответить с цитированием
Старый 18.05.2012, 17:59   #2
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Либо сообщение посылается не тому окну, либо прямоугольник неправильный.
s-andriano вне форума Ответить с цитированием
Старый 18.05.2012, 19:01   #3
Jugger
Пользователь
 
Регистрация: 30.01.2008
Сообщений: 99
По умолчанию

Проверил, имя окон одно и то же, прямоугольник входит в это окно .. чего ему не нравится
написал в кэйсе WM_TIMER SendMessage(hWnd,WM_PAINT,wParam,lP aram);
Теперь WM_PAINT приходит .. но все равно не рисует то что надо

Ну это ладно

По ходу заинтересовало
Если в WM_PAINT не используются wParam и lParam откуда оно знает какой прямоугольник перерисовать .. где эти данные ?

Потому что используя SendMessage я не говорю координаты где перерисовать .. значит InvalidateRect тоже убирать не надо ? данные о невалидности прямоугольника может потом и используются в WM_PAINT
Jugger вне форума Ответить с цитированием
Старый 18.05.2012, 19:11   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
откуда оно знает какой прямоугольник перерисовать
А оно и не знает. Это знать должна сама программа отрисовки, которая сидит в обработчике этого сообщения. Если не ошибаюсь область можно получить через GetUpdateRect
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 21.05.2012, 18:07   #5
Jugger
Пользователь
 
Регистрация: 30.01.2008
Сообщений: 99
По умолчанию

Проблема решилась методом тыка
Но довольно странным образом, почему оно не хотело работать в предыдущем варианте я так и не понял
Я перенес инициализацию массива с координатами в функцию создания окна .. до этого она в точке входа происходила

Код:
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
  ...
  rect_for_painting[0].top=10;
rect_for_painting[0].left=10;
rect_for_painting[0].right=660;
rect_for_painting[0].bottom=510;
...
Jugger вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
InvalidateRect() и LPCRECT БалаШагаЛ Win Api 9 24.12.2013 12:29
спираль в WM_PAINT Ultor Win Api 3 30.03.2012 23:33
Баг стандартного ввода? Или как мой бесстыжий код приводит к синему экрану смерти _Bers Общие вопросы C/C++ 11 02.01.2012 16:34
Wm_paint и Wm_create ZverGB Общие вопросы C/C++ 1 24.05.2010 16:55
Окно с сообщениям newkobra Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 13 27.05.2009 22:19