![]() |
|
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]()
|
|
| Hagrael |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 143 Регистрация: 26.6.2011 Репутация: нет Всего: нет |
Здравствуйте, товарищи программисты. Не могли бы вы мне сказать, что делает Windows, если на сообщение WM_PAINT откликаться строкой return 0? В книге написано, что Windows будет снова и снова посылать программе в очередь сообщение WM_PAINT, пока не будут вызваны функции BeginPaint и EndPaint. Однако почему-то даже без вызова этих функций окно закрашивается в свой должный фоновый цвет В книге также написано, что Windows может сохранить область окна, а может не сохранять. Однако я проверял, и Windows, как выяснилось, без передыха посылает сообщение WM_PAINT оконной процедуре. Но отчего же на ней остается фоновый цвет после того, как я свертываю программу, перемещаю по ней другим окном и т. д.? По идее окно вообще не должно было закрашиваться, т. к. вызова функции BeginPaint не было ни разу!
Добавлено через 12 минут и 11 секунд Когда я пишу:
то почему-то надпись отрисовывается только когда я закрою несколько диалоговых окон. А ведь по идее должно появиться одно диалоговое окно, я его закрою, все нарисуется (т. к. далее описывается весь процесс рисования), и после если уж покажется новое диалоговое окно, то уже все должно быть нарисовано. В чем причина этого странного поведения? Это сообщение отредактировал(а) Hagrael - 13.8.2011, 08:11 |
|||
|
||||
| Hagrael |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 143 Регистрация: 26.6.2011 Репутация: нет Всего: нет |
И опять же непонятки с фоном. При таком коде:
Фон все-равно остается черным, когда я по нему вожу окном. А ведь по идее должны остаться следы окна. |
|||
|
||||
| stdout |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 2 Регистрация: 29.7.2011 Репутация: нет Всего: нет |
Перед сообщением WM_PAINT оконной процедуре приходит сообщение WM_ERASEBKGND, которое чаще всего обрабатывается DefWindowProc (а эта функция просто закрашивает окно кистью hbrBackrground класса данного окна). Если обработать данное сообщение и вернуть 1, то Windows будет думать, что вы сами обработали это сообщение и стирать фон не нужно. Сообщение WM_PAINT отправляется окну, пока недействительная область остаётся. Как я понимаю, функция EndPaint делает действительной всю клиентскую область. Поэтому, если не вызывать BeginPaint - EndPaint, то окну будут постоянно отправляться сообщения WM_PAINT. |
|||
|
||||
| Hagrael |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 143 Регистрация: 26.6.2011 Репутация: нет Всего: нет |
stdout, а при перерисовке фона происходит отчистка окна от остальных объектов вроде кнопок, надписей и рисунков?
И что с MessageBox-ом? |
|||
|
||||
| stdout |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 2 Регистрация: 29.7.2011 Репутация: нет Всего: нет |
Ну окно просто закрашивается цветом фона. Чтобы закрашивание (и вроде бы любое рисование) не касалось дочерних элементов управления, нужно вроде бы задать стиль WS_CLIPCHILDREN при создании родительского окна. Хотя могу сильно ошибаться. Почитай об этом в MSDN. |
|||
|
||||
| Hagrael |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 143 Регистрация: 26.6.2011 Репутация: нет Всего: нет |
MessageBox - загадочная тайна...
|
|||
|
||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
несколько диалоговых окон появляться может по нескольким причинам:
1. WM_PAINT приходит вследствии смены размеров окна ( это нормально, поставь аналогичный диалог на WM_SIZE и проверь, это не сложно ) 2. в процессе отображения диалога, он заходит на рабочую область окна, которую и требуется отрисовать, т.е. в момент его закрытия генерируется "невалидная" область, требующая закраски, вследствии чего, генерируется очередной WM_PAINT и это дело может затянуться не стоит для диагностики WM_PAINT использовать визуальные маркеры типа MessageBox, это может и с толку сбить, и дать волю бесполезной философской жилке в такой ответственной работе -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 2 Всего: 88 |
поэтому не остаётся следов от старого изображения. -------------------- Обижено школьников: 8 |
|||
|
||||
![]()
|
| Правила форума "C/C++: Системное программирование и WinAPI" | |
|
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |