Почему Windows посылает сообщение WM_PAINT?

Тема в разделе "WASM.BEGINNERS", создана пользователем amvoz, 4 янв 2009.

  1. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    ...Да, почему?
    Вот здесь
    Это туториал Анзелона номер 2

    Описан пример программы. И создана функция-обработчик собщений, которая рисует текст в клиентской области, если "Windows посылает сообщение WM_PAINT окну, чтобы уведомить его о том, что настало вpемя для пеpеpисовки клиентской области."
    Но в том-то и дело, что посылка такого сообщения происходит безусловно! Безо всяких "если"! Windows безусловно формирует такое сообщение и посылает его программе. Запустите программу- текст всегда будет прорисован в клиентской области!
    В общем, я такой вывод делаю: Windows (сама, безо всякого вмешательства) формирует либо сообщение WM_DESTROY, либо WM_PAINT и одно изи них посылается прогамме (почему-то второе, почему- не могу понять).

    Просто Windows так запрограммирована, ибо мы нигде в тексте программы не указываем явно или косвенно: сформировать сообщение WM_PAINT и послать его... самой себе...
    Прав я?

    В гугле не нашёл, там всем всё понятно. Спасибо заранее.
     
  2. K10

    K10 New Member

    Публикаций:
    0
    Регистрация:
    3 окт 2008
    Сообщения:
    1.590
    аццки жжошш...
    И этот человек еще наезжал на Делфи :)
     
  3. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    WM_PAINT посылается самой системой, ЕСЛИ система "видит", что клиентская область окна (или часть этой области) нуждается в перерисовке. Например, окно поменяло размер или другое окно закрывало области твоёго окно и затем перестало закрывать. Ты минимизировал твоё окно и затем возвратил обратно на экран. И т.д.

    Прямое сообщение WM_PAINT окну посылать нежелательно - могут быть трудно-фиксируемые ошибки.
    Зато программа может уведомить систему, что клиентская область (или её часть) нуждается в перерисовке.
    Это делается вызовом функции InvalidateRect().

    После вызова этой функции - Windows ставит сообщение WM_PAINT в очередь сообщений окна.
    Если надо прорисовывать окно немедленно (например, когда что-то "тащится" с помощью мыши), то
    после InvalidateRect() надо вызвать UpdateWindow().

    WM_DESTROY не связано никак с WM_PAINT.
    WM_DESTROY посылается окну перед тем как его HWND будет "выброшен" системой.
    Это делается чтобы дать окну шанс удалить ресурсы связанные с HWND-м.
     
  4. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Так ясен пень. При старте программы и создании окна было бы неплохо отрисовать клиентскую область. Поэтому и посылается. Если перетрешь область другим окном, а потом его уберешь - снова получишь это сообщение.
     
  5. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    Это понятно. А в моём примере мы не сообщаем Windows, что намерены окно изменить! Мы его не перетаскиваем, размеры не изменяем, ничего там не пишем, но Windows всё равно посылает WM_PAINT программе! ...Да, текст мы хотим нарисовать. Но прежде принимаем собщение WM_PAINT, а только потом программа приступает к отрисовке текста. Вот я и думаю поэтому- Windows при создании окна такого класса будет безусловно периодически генерировать WM_PAINT и слать его программе. Так? (Обработаем мы это сообщение или нет и, если обработаем, то как- это уже второй вопрос)
     
  6. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    ложь
     
  7. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    amvoz
    Что значит сама? Запускал, закрывал? Теперь в кусты, типо это не я?
     
  8. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    Сама это значит, что после нарисования окна "Мы его не перетаскиваем, размеры не изменяем, ничего там не пишем, но Windows всё равно посылает WM_PAINT программе!", я выше уже это писал.
     
  9. kero

    kero Модератор SOURCES & 2LZ Команда форума

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    Докажите
     
  10. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    Во-первых, текст прорисовываетсся.
    Во-вторых, и это главное. Я загружал программу в OllyDbg, ставил бряк на оконную функцию (адрес 0041119) и трассировал пошагово. Так вот, после отрисовки окна и непосредственно (!) перед прорисовыванием текста функция принимала такие параметры (смотреть в стеке. Вы это, конечно, знаете, но спросите, откуда я их взял)

    WndProc,72046E, Fh, 0, 0

    Второй параметр это uMsg. Теперь смотрим заголовочный файле windows.inc и видим там
    WM_PAINT equ 0Fh

    ...То есть по отрисовке окна функция-обработчик сообщений вторым параметром получает WM_PAINT (Fh). Без того, что (третий раз пишу) окно "не перетаскиваем, размеры не изменяем, ничего там не пишем". Просто прорисовали окно и всё, получили WM_PAINT
    Проверьте в OllyDbg, кто не верит.
     
  11. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Хакеры скоро все секреты раскопают.
    Ещё один копатель - http://www.wasm.ru/forum/viewtopic.php?id=30491
     
  12. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    Э, хорош языком зря молоть. Нечего сказать, так шли бы из моей темы.
     
  13. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    Я не могу не проржаться:) Без новичков форум, согласитесь, одним Улыбнитесь ;) не спасался бы!
    amvoz
    Окно создал? -Создал. Нарисовать его нужно? -Нужно. Какое сообщение нужно послать окну, чтобы оно отрисовало свою клиентскую область? -Емана, WM_PAINT! Какие вопросы?
     
  14. kero

    kero Модератор SOURCES & 2LZ Команда форума

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
  15. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    Вы что?
    Я чёрым по-белому писал... Я не вникаю сейчас, дабы не распыляться "Какое сообщение нужно послать окну, чтобы оно отрисовало свою клиентскую область"
    Я говорю, о сообщении, которое Windows посылает программе после отрисовки! Не до, а после. То есть запускаю программу в OllyDbg и наблюдаю последовательность (пишу второй раз)

    1) Прорисовывается клиентская область. То есть нарисовалось окно. Зелёная рамка и само белое окно. Текста пока нет, ибо пошагово программа выполняется, бряк стоит на адресе 0041119 (Какие до этого сообщения были посланы программе, я не знаю. Может, было среди них WM_PAINT, может, не было. Сейчас это не важно)

    2)Программе посылается сообщение WM_PAINT

    Я четвёртый раз пишу- я никоим образом не уведомляю Windows, что хочу клинтскую область изменить (в самом общем смысле). Но почему выполняется пункт 2)
    А вот после выполнения пункта 2 и следует изменение окна (прорисовка текста и так далее)

    ...Вот туториал Айзелона номер 4. Вот там пример. Прошу прощения.
    http://www.wasm.ru/article.php?article=1001004
     
  16. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    Не ты в данном случае определяешь, когда ты хочешь изменить клиентскую область, а система. Когда она говорит, что ты должен отобразить содержимое клиентской области, она буквально шлет твоему окну соответствующее сообщение (WM_PAINT). Рамка окна - неклиентская область. Вместо тебя ее рисует система. Если хочешь рисовать и ее, нужно код ее отрисовки поместить в обработчик сообщения WM_NCPAINT. Как объяснить проще я не знаю. Если вышеизложенное не осознаешь сейчас, поспи. Если потом тоже, то значит ты тупой.
     
  17. kero

    kero Модератор SOURCES & 2LZ Команда форума

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    Без всякого OllyDbg:
    добавьте в обработчик WM_PAINT счетчик с выводом результата на заголовок окна (inc count -> wsprintf -> SetWindowText)
    и понаблюдайте за оконцем, когда его ничто не беспокоит. Вы продолжаете утверждать, что винда
    ?

    Да, стоит еще и в текстовый буфер DrawText загнать все тот же count, наглядности для.
     
  18. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    В данном это в каком? Как данный случай характеризуется?
    Я, между прочим в первом сообщении предположил
    "В общем, я такой вывод делаю: Windows (сама, безо всякого вмешательства) формирует либо сообщение WM_DESTROY, либо WM_PAINT и одно изи них посылается прогамме (почему-то второе, почему- не могу понять)."

    ...Единственно, чего я не могу понять, что за случай такой данный-то? То ли она шлёт всем окнам без исключения сообщения WM_PAINT, то ли окнам определёных классов, то ли окну только этого класса, то ли в программе между строк нужно найти присвоение uMsg=WM_PAINT.

    ...Действительно, что ж я не могу понять-то что ж за случай такой данный-то. Данный и всё. А тупой я не понимаю, что словом "данный" исчерпываются все его характеристики...
     
  19. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    kero
    ...Зачем нам без всякого OllyDbg? Если в OllyDbg я вижу, что WM_PAINT посылается безусловно, то, используя другой инструмент, я другое увижу? Тогда один из инструментов лжёт. Справедливости ради: предложенным Вами методом я не пользовался, он слжен для меня а Вы моим? Мой проще и он для Вас проще, нежели Ваш для меня.

    Бряк ставить на 0041119 (по этому адресу находится первая команда функции-обработчика сообщений), стек в правом нижнем углу. Жмём на F9 24 раза. Ровно 24. После этого смотрим на стек и видим значение F (второй аргумент оконной функции). А уж безусловно оно там оказалось или как-то ещё не знаю, знаю только, что я не уведомлял Windows, что собираюсь рисовать текст, а она (сообщение) его послала программе.
    А в 25-ый раз когда Вы нажмёте на F9, появится текст.
    ...А, ну да. В "данном" случае она его посылает сама. Конечно-конечно.
     
  20. kero

    kero Модератор SOURCES & 2LZ Команда форума

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    Нет, вас не одолеть, я - пас...
    В прощальном аттаче - "сложный для вас метод".