Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Сообщение WM_PAINT  (Прочитано 33321 раз)
0 Пользователей и 1 Гость смотрят эту тему.
FallenSoul
Опытный

ru
Offline Offline
Пол: Мужской

« : 20-05-2008 15:59 » 

Всем огромный привет,- я к вам с вопросом(теоритическим) Здесь была моя ладья... Собственно был вопрос,- расскажи как работает твоя программа? (Структура работы программы на API) ?

Ответ: В функции WinMain регистрируется класс главного окна, в одном из полей которого указывается имя оконной процедуры(главной). Затем если класс был зарегистрирован, то вызывается функция CreateWindow для создания окна(класс которого зарегили) и присваиваем свободному хендлу возвращаемое значение. Окно отображается на экране функцией ShowWindow, причем посылается сообщение WM_CREATE, а затем WM_PAINT. Далее организуется цикл обработки сообщений( рассказал про 2 очереди сообщений(системную и програмную), про то как они функционируют и определены в оконной процедуре).

Всё хорошо, но следующий вопрос завёл меня в тупик,- "Один раз сообщение WM_PAINT посылается функцией ShowWindow, а ещё какими функциями оно посылается?". Отвечал что оно генерируется автоматически при изменении размеров, сворачивании, и прочих операциях с окном, и выполняется следующий отрывок перерисовки:
Код:
		case WM_PAINT:
hDC=BeginPaint(hWnd,&ps);
GetClientRect(hWnd,&rect);
EndPaint(hWnd,&ps);

    break;
. На что мне из раза в раз повторяли вопрос, какие всё таки функции посылают это сообщение WM_PAINT? Преподователь говорил что этот вызов происходит неявно и в моей программе как минимум 1 такая функция, а то и больше(хотя программу преподователь даже не смотрел). Я в замешательстве =\  Здесь была моя ладья... Не понял
Записан
Tuborg
Команда клуба

ee
Offline Offline

« Ответ #1 : 20-05-2008 16:25 » 

Invalidate + UpdateWindow
Записан
FallenSoul
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 20-05-2008 16:28 » 

У меня таких функций нет в программе :/
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #3 : 20-05-2008 20:10 » 

WM_PAINT генерируется:

0) ShowWindow посылает окну WM_PAINT , если окно должно показаться на экране или изменить размер , не скрываясь с экрана
1) всякий раз, когда окноменяло размер через SetWindowPlacement (с некоторыми параметрами в showCmd структуры WINDOWPLACEMENT) или MoveWindow (с bRepaint = TRUE ) , то есть, когда окно видимо и поменяло размер
2) всякий раз, когда была открыта скрытая до этого часть окна (например, другим окном)
3) Invalidate(...) помечает всё окно или его часть "невалидной" (требующей перерисовки), а также кладёт (через PostMessage) в очередь сообщений сообщение WM_PAINT для окна. Невалидная часть отрисуется, когда дойдёт очередь до сообщения.
4) пометив часть окна или всё окно "невалидным", можно немедленно заставить перерисоваться - UpdateWindow непосредственно и немедленно посылает WM_PAINT (через SendMessage) окну, минуя очередь
5) любой ппроцесс (включая и наш) в любое время может послать окну сообщение WM_PAINT через PostMessage или SendMessage. Также может передвинуть окно - см. пункт 1

примерно так ) Может ещё что то забыл и не перечислил
Записан

FallenSoul
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 20-05-2008 20:47 » 

Так в том то и дело, что преподователь ничего об этом слышать не хочет. Говорит, вот чёткий вопрос "Где у тебя после первого пейнта вызывается перерисовка? Да, она вызывается не явно- где? Как минимум в одной функции кроме ShowWindow." -разговор про стандартную API структуру программы. На попытку объяснить про сворачивание и прочее ничего слышать не хочет
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #5 : 20-05-2008 20:57 » 

Код:
Где у тебя после первого пейнта вызывается перерисовка?
это как ? Я не понимаю вопроса...
Записан

FallenSoul
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #6 : 20-05-2008 21:02 » 

Код:
Где у тебя после первого пейнта вызывается перерисовка?
это как ? Я не понимаю вопроса...

Я тоже. Первый пейнт вызывается ф-цией ShowWindow, а потом опять он гдето неявно вызывается
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #7 : 20-05-2008 21:08 » 

а ты сделай хитро - в дебаге отлови первый приход WM_PAINT, жми альт+7 и в стеке вызовов проследи, кто что делал
Записан

sss
Специалист

ru
Offline Offline

« Ответ #8 : 21-05-2008 03:47 » 

Гм.. FallenSoul ты либо не до конца все рассказал, либо я не знаю... Вот тебе цитата из книги "Программирование графики для Windows" стр. 337. Кратко - в ней строится программа за наблюдением за WM_PAINT, WM_NCPAINT и т.д..

Цитата: Фень Юань
Теперь запустите программу и поэкспериментируйте с ней. Вы поймете как генерируется сообщения WM_PAINT и какую область они занимают.

...

Первое сообщение WM_PAINT перерисовывает окно стандартных размеров. Затем мы уменьшаем размер окна; при этом генерируется второе сообщение WM_PAINT....

Или твой учитель говорит про WM_NCPAINT Не понял
Записан

while (8==8)
FallenSoul
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #9 : 21-05-2008 06:16 » 

Еду на защиту повторную,- как приеду, отпишусь что всё таки имелось ввиду
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #10 : 21-05-2008 06:37 » 

удачи! Улыбаюсь
Записан

FallenSoul
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #11 : 24-05-2008 11:10 » 

Спасибо Улыбаюсь
в общем ... Разговор пошёл о каких-то абстрактных функциях, которыми я добавляю записи в дерево и в список, о которых преподаватель говорил весьма не уверенно.
"Вот какой функцией ты добавляешь запись в дерево?"
"TreeView_InsertItem"
"У тебя есть её описание сейчас ?"
"Нет"
"Вот возможно она вызывает WM_PAINT, и тем самым перерисовывает твоё окно с добавленной информацией"
"..."

в общем как бы то не было, спс всем за помосчь! отлично Улыбаюсь
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #12 : 24-05-2008 12:47 » 

FallenSoul, сомневаюсь, что эта функция это делает, при том, что это макрос, а не функция :

Код:
#define TreeView_InsertItem(hwnd, lpis) \
    (HTREEITEM)SNDMSG((hwnd), TVM_INSERTITEM, 0, (LPARAM)(LPTV_INSERTSTRUCT)(lpis))

#define SNDMSG ::SendMessage
Записан

Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #13 : 24-05-2008 13:49 » new

На самом деле, в данном случае, совсем неправильно говорить "она вызывает WM_PAINT" - раз препод предложил такой вариант, то... передавай привет, а если отделался от него, то поздравляю.
WM_ уже указывает на то, что это сообщение винды, а не контрола. Пользователь, контрол, окно и тд могут только попросить их (себя) актуаллизировать UpdateWindow, Invalidate, InvalidateRect и тп (хотя наверное все, ща уже точно не помню). В ответ на эту ф-ю винда посылает окну (когда до него дойдёт очередь) WM_PAINT.
Те в данном случае было правильно сказать, что ф-я или макрос, по окончании своего действия, сообщаяют винде, что окно надо актуаллизировать с помощью одной из приведённых выше ф-ций. В ответ на это винда посылает сообщение WM_PAINT.

А вобще, FallenSoul, есть очень хорошая книжка по этому делу - автор Чарлз Петцольд,  в своё время читал по 95ой винде, потом были кажется поновей. Но это не важно. Можешь взять любую. какую найдёшь. Там вся кухня винды очень хорошо разжёвана.

http://www.softtime.ru/cpp_info/petzold.php
« Последнее редактирование: 24-05-2008 13:54 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
FallenSoul
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #14 : 24-05-2008 18:17 » 

Джон, привет передам,-вот только зачёт осталось сдать ему Улыбаюсь
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines