![]() |
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]() ![]() ![]() |
|
yngwie19 |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 15.6.2008 Где: Новгород Репутация: нет Всего: нет |
Здравствуйте. У меня возникли некоторые вопросы при изучении Сообщения WM_PAINT. Ответьте на них пожалуйста.
1) Правильно ли Я понимаю, что винда посылает сообщение WM_PAINT в оконную процедуру только в случае: - При первом запуске окна прилодения (ShowWindow). - Если пользователь поменял размеры окна (в случае если wc.style = CS_HREDDRAW | CS_VREDDRAW) - Если пользователь развернул программу, ранее свернутую в трей. - Если одно окно частично или полностью перекрывало другое окно, после чего его вывели на первый план. 2) Я не очень понял, вот какой момент. В книгах пишут, что в некоторых случаях винда перерисовывает не все окно, а часть, которая была "поврежлена" (закрыта другим). Например раскрытием какой-либо опции линейки меню. Также пишут, что самостоятельно такой алгоритм частичной перерисовки программисту не реализовть. Скажите пожалуйста когда посылается сообщени WM_PAINT. то у нас окно перересовывается полностью или частично и в каких случаях? |
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 33 Всего: 183 |
Сообщение WM_PAINT посылается в том случае, если у окна есть регион, помеченный как инвалидный, т.е. нуждающийся в перерисовке. При этом, в очереди не должно быть других сообщений, за исключением, возможно WM_TIMER (не помню, у кого меньше приоритет). Иначе WM_PAINT откладывается до освобождения очереди.
Можно принудительно и синхронно послать WM_PAINT, вызвав UpdateWindow, но и при этом должен быть непустой невалидный регион. Этот регион устанавлиается как отсечение для операции отрисовки. Все остальное, что ты написал - это различные способы сделать регион окна невалидным. Того же эффекта можно достичь, если вызвать InvalidateRect - рано или поздно придет WM_PAINT.
С чего бы вдруг? Можно подумать, код Виндоус был нашептан Моисею на горе Синай... -------------------- ... |
|||
|
||||
yngwie19 |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 15.6.2008 Где: Новгород Репутация: нет Всего: нет |
Earnest, т.е по простому, при обработке сообщения WM_PAINT мы переримовываем все окно?
Скажи пожалуйста для чего используется контекст устройства? Я так понял, что это некая структура данных закрепленная за рабочей областью окна(можно сказать это участок памяти). Т.е при обращении например к дисплею для того чтобы нарисовать в окне что-нибудь, мы не имеем прямого доступа к этому устройству, а через драйвер работаем с контекстом этого устройста. Правильно Я понял? Если все так, то где можно посмотреть из чего эта структура(контекст устройсва) состоит? |
|||
|
||||
MenSem |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 157 Регистрация: 10.7.2008 Репутация: нет Всего: нет |
del
Это сообщение отредактировал(а) MenSem - 22.12.2010, 00:37 --------------------
|
|||
|
||||
yngwie19 |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 15.6.2008 Где: Новгород Репутация: нет Всего: нет |
MenSem, т.е когда мы выводим на передний план окно, которое ранее было частично невалидным, то винда перерисовывает только эти скрытые части (заполняя структуру RECT), а не все окно?
|
|||
|
||||
MenSem |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 157 Регистрация: 10.7.2008 Репутация: нет Всего: нет |
del
Это сообщение отредактировал(а) MenSem - 22.12.2010, 00:37 --------------------
|
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 33 Всего: 183 |
Система просто ставит отсечение по невалидной части окна. Если ты ничего специально не сделаешь, то так оно и будет. Но это можно и изменить (т.е. уменьшить или увеличить область рисования).
Нет, не за участком экрана. Это просто некая структура данных, хранящая установленные перья, режимы, etc. И оттуда до драйвера устройства еще как до китайской границы. -------------------- ... |
|||
|
||||
GIK |
|
|||
![]() Добрый человек ![]() ![]() Профиль Группа: Участник Сообщений: 985 Регистрация: 3.6.2005 Где: я только не небыв ал Репутация: нет Всего: 14 |
А как можно частично отрисовать окно? Например окно обычного блокнота? К примеру я нашел блокнот через FindWindow, и я хочу частично отрисовать его, это можно реализовать? -------------------- Математика=>пиво=> програмирование, три вещи последовательны и совместимы !!! Программирование - это не деятельнось! Программирование - это состояние души! Бог - самый крутой программист. |
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 33 Всего: 183 |
Поставь отсечение на любую часть окна и будет тебе частично. Сама процедура отрисовки при этом никак не изменится.
-------------------- ... |
|||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Системное программирование и WinAPI" | |
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |