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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вопросы по использованию WM_PAINT 
:(
    Опции темы
yngwie19
Дата 30.12.2008, 15:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 15.6.2008
Где: Новгород

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



Здравствуйте. У меня возникли некоторые вопросы при изучении Сообщения WM_PAINT. Ответьте на них пожалуйста.
1) Правильно ли Я понимаю, что винда посылает сообщение WM_PAINT в оконную процедуру только в случае:
- При первом запуске окна прилодения (ShowWindow).
- Если пользователь поменял размеры окна (в случае если wc.style = CS_HREDDRAW | CS_VREDDRAW)
- Если пользователь развернул программу, ранее свернутую в трей.
- Если одно окно частично или полностью перекрывало другое окно, после чего его вывели на первый план.
2) Я не очень понял, вот какой момент. В книгах пишут, что в некоторых случаях винда перерисовывает не все окно, а часть, которая была "поврежлена" (закрыта другим). Например раскрытием какой-либо опции линейки меню. Также пишут, что самостоятельно такой алгоритм частичной перерисовки программисту не реализовть. Скажите пожалуйста когда посылается сообщени WM_PAINT. то у нас окно перересовывается полностью или частично и в каких случаях?  
PM MAIL   Вверх
Earnest
Дата 30.12.2008, 17:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Сообщение WM_PAINT посылается в том случае, если у окна есть регион, помеченный как инвалидный, т.е. нуждающийся в перерисовке. При этом, в очереди не должно быть других сообщений, за исключением, возможно WM_TIMER (не помню, у кого меньше приоритет). Иначе WM_PAINT откладывается до освобождения очереди.
Можно принудительно и синхронно послать WM_PAINT, вызвав UpdateWindow, но и при этом должен быть непустой невалидный регион. Этот регион устанавлиается как отсечение для операции отрисовки.

Все остальное, что ты написал - это различные способы сделать регион  окна невалидным. Того же эффекта можно достичь, если вызвать InvalidateRect - рано или поздно придет WM_PAINT.
Цитата(yngwie19 @  30.12.2008,  16:53 Найти цитируемый пост)
Также пишут, что самостоятельно такой алгоритм частичной перерисовки программисту не реализовть. 

С чего бы вдруг? Можно подумать, код Виндоус был нашептан Моисею на горе Синай...


--------------------
...
PM   Вверх
yngwie19
Дата 30.12.2008, 17:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 15.6.2008
Где: Новгород

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



Earnest, т.е по простому, при обработке сообщения WM_PAINT мы переримовываем все окно?

Скажи пожалуйста для чего используется контекст устройства? Я так понял, что это некая структура данных закрепленная за рабочей областью окна(можно сказать это участок памяти). Т.е при обращении например к дисплею для того чтобы нарисовать в окне что-нибудь, мы не имеем прямого доступа к этому устройству, а через драйвер работаем с контекстом этого устройста. Правильно Я понял?
Если все так, то где можно посмотреть из чего эта структура(контекст устройсва) состоит? 
PM MAIL   Вверх
MenSem
Дата 30.12.2008, 20:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



del

Это сообщение отредактировал(а) MenSem - 22.12.2010, 00:37
--------------------
PM MAIL   Вверх
yngwie19
Дата 30.12.2008, 20:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 15.6.2008
Где: Новгород

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



MenSem, т.е когда мы выводим на передний план окно, которое ранее было частично невалидным, то винда перерисовывает только эти скрытые части (заполняя структуру RECT), а не все окно?
PM MAIL   Вверх
MenSem
Дата 30.12.2008, 20:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



del

Это сообщение отредактировал(а) MenSem - 22.12.2010, 00:37
--------------------
PM MAIL   Вверх
Earnest
Дата 6.1.2009, 18:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Система просто ставит отсечение по невалидной части окна. Если ты ничего специально не сделаешь, то так оно и будет. Но это можно и изменить (т.е. уменьшить или увеличить область рисования).
Цитата(yngwie19 @  30.12.2008,  18:33 Найти цитируемый пост)
Я так понял, что это некая структура данных закрепленная за рабочей областью окна(можно сказать это участок памяти).  Т.е при обращении например к дисплею для того чтобы нарисовать в окне что-нибудь, мы не имеем прямого доступа к этому устройству, а через драйвер работаем с контекстом этого устройста. 

Нет, не за участком экрана. Это просто некая структура данных, хранящая установленные перья, режимы, etc. И оттуда до драйвера устройства еще как до китайской границы.



--------------------
...
PM   Вверх
GIK
Дата 10.1.2009, 00:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Добрый человек
**


Профиль
Группа: Участник
Сообщений: 985
Регистрация: 3.6.2005
Где: я только не небыв ал

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



Цитата

Цитата(yngwie19 @  30.12.2008,  16:53 ) 
Также пишут, что самостоятельно такой алгоритм частичной перерисовки программисту не реализовть.  

С чего бы вдруг? Можно подумать, код Виндоус был нашептан Моисею на горе Синай... 


А как можно частично отрисовать окно? Например окно обычного блокнота?
К примеру я нашел блокнот через FindWindow, и я хочу частично отрисовать его, это можно реализовать?


--------------------
Математика=>пиво=> програмирование, три вещи последовательны и совместимы !!!
Программирование - это не деятельнось! Программирование - это состояние души!
Бог - самый крутой программист.
PM MAIL ICQ   Вверх
Earnest
Дата 10.1.2009, 14:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Поставь отсечение на любую часть окна и будет тебе частично. Сама процедура отрисовки при этом никак не изменится.


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

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


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

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


 




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


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

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