GDI+ Как перерисовать часть окна, причем не в обработчике
От: Molot  
Дата: 03.12.10 07:48
Оценка:
C++ GDI+ Как перерисовать часть окна, причем не в обработчике WM_PAINT? Я так понял нужно использовать SetClip() – но не работает. InvalidateRect я так понял только для GDI который не плюс. Кто знает как делать? Мне нужно при нажатии мышью в область окна перерисовать эту область
Re: GDI+ Как перерисовать часть окна, причем не в обработчик
От: MTimur  
Дата: 03.12.10 20:05
Оценка:
Здравствуйте, Molot, Вы писали:

M>C++ GDI+ Как перерисовать часть окна, причем не в обработчике WM_PAINT? Я так понял нужно использовать SetClip() – но не работает. InvalidateRect я так понял только для GDI который не плюс. Кто знает как делать? Мне нужно при нажатии мышью в область окна перерисовать эту область


Не понятно что нужно.
1) Если просто обновить кусок окна, то InvalidateRect. Gdi+ — это обертка над gdi, да и какая разница как и чем это окно рисоваться будет? Ваша задача просто уведомить систему о том, что нужно перерисовать.
2) Если нужно нарисовать отсебятину, то только в WM_PAINT, иначе рисунок получится одноразовый, до следующей отрисовки окна. При необходимости рисуем во временный битмап в памяти, зовем InvalidateRect, а в обработчике WM_PAINT копируем битмап на окно. В зависимости от задачи можно вместо временного битмапа сохранять какой-то флаг/состояние и т.д., а в WM_PAINT по этому состоянию рисовать то, что нужно.
Re[2]: GDI+ Как перерисовать часть окна, причем не в обработ
От: Аноним  
Дата: 03.12.10 21:08
Оценка:
MT>1) Если просто обновить кусок окна, то InvalidateRect. Gdi+ — это обертка над gdi, да и какая разница как и чем это окно рисоваться будет? Ваша задача просто уведомить систему о том, что нужно перерисовать.
MT>2) Если нужно нарисовать отсебятину, то только в WM_PAINT, иначе рисунок получится одноразовый, до следующей отрисовки окна. При необходимости рисуем во временный битмап в памяти, зовем InvalidateRect, а в обработчике WM_PAINT копируем битмап на окно. В зависимости от задачи можно вместо временного битмапа сохранять какой-то флаг/состояние и т.д., а в WM_PAINT по этому состоянию рисовать то, что нужно.

я уже понял что нужно использовать InvalidateRect, просто я думал что этот метод GDI без плюса и в GDI+ он не работает. Но сейчас уже другая проблема, вызываю InvalidateRect, но после него в отладчике не попадаю в WM_PAINT, почему? :
RECT rect1={100,40,100,20};
InvalidateRect(hwnd, &rect1, TRUE);
UpdateWidow(hwnd);
Re[3]: GDI+ Как перерисовать часть окна, причем не в обработ
От: MTimur  
Дата: 03.12.10 21:31
Оценка:
Здравствуйте, Аноним, Вы писали:

А>я уже понял что нужно использовать InvalidateRect, просто я думал что этот метод GDI без плюса и в GDI+ он не работает. Но сейчас уже другая проблема, вызываю InvalidateRect, но после него в отладчике не попадаю в WM_PAINT, почему? :

А>RECT rect1={100,40,100,20};
А>InvalidateRect(hwnd, &rect1, TRUE);
А>UpdateWidow(hwnd);

потому что обновляешь прямоугольник шириной 0px
Re[4]: GDI+ Как перерисовать часть окна, причем не в обработ
От: MTimur  
Дата: 03.12.10 21:32
Оценка:
Здравствуйте, MTimur, Вы писали:

MT>Здравствуйте, Аноним, Вы писали:


А>>я уже понял что нужно использовать InvalidateRect, просто я думал что этот метод GDI без плюса и в GDI+ он не работает. Но сейчас уже другая проблема, вызываю InvalidateRect, но после него в отладчике не попадаю в WM_PAINT, почему? :

А>>RECT rect1={100,40,100,20};
А>>InvalidateRect(hwnd, &rect1, TRUE);
А>>UpdateWidow(hwnd);

MT>потому что обновляешь прямоугольник шириной 0px


и даже хуже -) сразу не посмотрел... bottom у тебя выше, чем top.
Re[4]: GDI+ Как перерисовать часть окна, причем не в обработ
От: Molot  
Дата: 03.12.10 22:18
Оценка:
Здравствуйте, MTimur, Вы писали:

MT>Здравствуйте, Аноним, Вы писали:


А>>я уже понял что нужно использовать InvalidateRect, просто я думал что этот метод GDI без плюса и в GDI+ он не работает. Но сейчас уже другая проблема, вызываю InvalidateRect, но после него в отладчике не попадаю в WM_PAINT, почему? :

А>>RECT rect1={100,40,100,20};
А>>InvalidateRect(hwnd, &rect1, TRUE);
А>>UpdateWidow(hwnd);

MT>потому что обновляешь прямоугольник шириной 0px

не врубился, а что RECT описывается не так как RectF
не понял параметры, первые два это не x и y а затем ширина и высота?
rect1={20, 20, 20,20}; тоже не работает.
Re[5]: GDI+ Как перерисовать часть окна, причем не в обработ
От: MTimur  
Дата: 03.12.10 22:22
Оценка:
Здравствуйте, Molot, Вы писали:

MT>>потому что обновляешь прямоугольник шириной 0px

M>не врубился, а что RECT описывается не так как RectF
M>не понял параметры, первые два это не x и y а затем ширина и высота?
M>rect1={20, 20, 20,20}; тоже не работает.

это прямоугольник размером 0х0 в точке 20, 20

ну мсдн же... гугл в конце концов

typedef struct _RECT {
  LONG left;
  LONG top;
  LONG right;
  LONG bottom;
} RECT, *PRECT;
Re[5]: GDI+ Как перерисовать часть окна, причем не в обработ
От: Molot  
Дата: 03.12.10 22:26
Оценка:
Здравствуйте, MTimur, Вы писали:

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


MT>>Здравствуйте, Аноним, Вы писали:


А>>>я уже понял что нужно использовать InvalidateRect, просто я думал что этот метод GDI без плюса и в GDI+ он не работает. Но сейчас уже другая проблема, вызываю InvalidateRect, но после него в отладчике не попадаю в WM_PAINT, почему? :

А>>>RECT rect1={100,40,100,20};
А>>>InvalidateRect(hwnd, &rect1, TRUE);
А>>>UpdateWidow(hwnd);

MT>>потому что обновляешь прямоугольник шириной 0px


MT>и даже хуже -) сразу не посмотрел... bottom у тебя выше, чем top.


Спасибо за помощь, MTimur. Действительно RECT неправильно задан. теперь понял что слева справа верх потом снизу x и y координаты нужно задавать. Вроде зашло в WM_PANT. буду дальше делать. может еще что спрошу
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.