![]() |
|
|
![]()
|
|
| maq |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 173 Регистрация: 28.10.2005 Репутация: нет Всего: нет |
Ребята, у меня такой вопрос:
нужно чтобы при OnSize в CView не происходила перерисовка клиентской части окна или же его части. В MSDN-не покопался, но не помогло. Кто знает, как это сделать? |
|||
|
||||
| vvpC |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 68 Регистрация: 20.5.2006 Где: Москва Репутация: нет Всего: нет |
блокировать(игнорировать) WM_PAINT, када оно не нужно
|
|||
|
||||
| DeadSoul |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1217 Регистрация: 25.9.2005 Где: Москва Репутация: 2 Всего: 11 |
Ключевое слово - Erasebackground
-------------------- Если Вы получили ответ на Ваш вопрос, то нажмите на "Вопрос решен". Бьем спамеров их же оружием. Пусть весь спам сыпется им [email protected] |
|||
|
||||
| maq |
|
||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 173 Регистрация: 28.10.2005 Репутация: нет Всего: нет |
1. В чем разница между OnPaint и OnDraw? Так понимаю, что OnPaint вызывается при сообщении WM_PAINT, а для чего тогда OnDraw?
2.
В смысле использовать PreTranslateMessage? 3.
А можно с примерчиком? |
||||
|
|||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
OnPaint - это обработчик стандартного сообщения Windows WM_PAINT. OnDraw - в некоторых MFC-классах есть виртуальная ф-я OnDraw, которая вызывается из OnPaint.
Глупости. Кто это будет определять, когда нужно и когда не нужно. 1) Чтобы на OnSize не было лишних подергиваний, нужно убрать CS_HREDRAW ии CS_VREDRAW из стиля класса окна. Т.е. зарегистрировать свой класса, а не пользоваться стандартным. CS_VREDRAW и CS_HREDRAW нужны только тогда, когда при изменении размеров окна изменяется масштаб изображения, а когда просто окрываются невидимые части - лучше убрать. 2) Иногда имеет смысл регистрировать класс без кисти (чтобы не было зарисовки на ERASEBKGND) или, что почти то же самое, перехватывать WM_ERASEBKGND и ничего не делать. Но это возможно не всегда. 3) Поищи по форуму, вопрос неоднократно обсуждался. -------------------- ... |
|||
|
||||
| vvpC |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 68 Регистрация: 20.5.2006 Где: Москва Репутация: нет Всего: нет |
Неужели? Я бы не был столь котегоричен. Блокировка перерисовки вовремя ресайзинга имеет смысл только при изменении размеров окна мышью, поэтому начало ресайзинга и его завершение определяются элементарно. Вот рабочий пример:
|
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Ну ладно, хорошо, не глупости, а некорректное (в данном случае) решение.
Флаги, конечно, можно поставить. Но ведь того же эффекта (т.е. отказ от вывода содержимого окна в процессе растяжения) можно достичь просто отключив соответствующую опцию в Виндовс. И будет растягиваться только рамка. А уже по завершению процесса отрисуется окно. Причем так будут вести себя все приложения в системе. А уж если опция включена (показывать содержимое окна во время ресайза), то задача программы - обеспечить ее нормальную работу - т.е. без дерганий. Которые возникают в результате стирания той части окна, которая в перерисовке вовсе не нуждается. Чтобы с этим бороться, нужно иметь класс окна без CS_[V\H]REDRAW. В этом случае при ресайзе перерисоваются только новые части. -------------------- ... |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
vvpC, вдогонку:
Кстати, в твоем коде есть еще одна ошибка. Если ты уж ставишь свой обработчик WM_PAINT, то обязан поставить скобки BeginPaint()\EndPaint() (ну или создать объект CPaintDC). А ты, если стоит флаг, просто выходишь. Чем это может грозить? Ну, скажем, во время резайза таймер не будет срабатывать. В нормальном приложении возможны и другие проблемы, в этом маленьком примере не проявляющиеся. Конечно, можно поставить CDialog::OnPaint перед проверкой (все равно он практическио ничего не делает, кроме BeginPaint-EndPaint). Но в любом случае как-то неуклюже, согласись, дважды запрашивать контекст перерисовки... Это сообщение отредактировал(а) Earnest - 30.5.2006, 11:53 -------------------- ... |
|||
|
||||
| vvpC |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 68 Регистрация: 20.5.2006 Где: Москва Репутация: нет Всего: нет |
Объясни тогда почему я "обязан" - ведь я не захватываю какие-то ресурсы и забываю их освободить... EndPaint сразу за BeginPaint (или GetDC,ReleaseDC)и больше ничего - имхо бессмыслица... И как обработка WM_TIMER связана с обработкой WM_PAINT? |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Неправильное у тебя ИМХО... Система посылает окну WM_PAINT тогда и только тогда, когда есть инвалидный регион. И WM_PAINT будет посылаться до посинения, пока кто-нибудь не снимет признак инвалидности с региона. Если ты не ставишь свой обработчик, то это делает стандартный. А уж если ставишь, то обязан это сделать сам, т.е. вызвать BeginPaint-EndPaint (т.е. все чуть-чуть сложнее, но в MFC достаточно создать автоматический объект CPaintDC). А у таймера приоритет ниже. Пока есть сообщения WM_PAINT, сообщения от таймера не придут. Проверяется элементарно. Кстати, была не так давно на форуме (кажется WinAPI) тема, где парень так попал... -------------------- ... |
|||
|
||||
| vvpC |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 68 Регистрация: 20.5.2006 Где: Москва Репутация: нет Всего: нет |
Ну тааада лаадно. А если серьезно, то когда я данный вопрос спаем++ обследовал, у меня иногда какраз такое и случалось. Временами нормально, а временами спай как пулемет: WM_PAINT, WM_PAINT. Ну я по простоте душевной не придал этому большого значения |
|||
|
||||
| maq |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 173 Регистрация: 28.10.2005 Репутация: нет Всего: нет |
перефразирую вопрос:
в данный момент я работаю над созданием класса контрола, который позже станет ActiveX контролом (скажем, контрол А). Естественно, контрол А должен уметь менять размеры при изменении размера окна (скажем, окно B), в котором он будет находиться. Моя цель предотвратить перерисовку неизменяемой клиентской части контрола А при изменении его размера. А при изменении размера окна В происходит перерисовка (моргание) окна В, а следовательно и контрола А. Предполагается, что при Resizing-е окна В происходит Resizing контрола А. Моя задача - найти способ, при котором независимо от типа окна В при его Resizing-е не происходила перерисовка неизменяемой клиентской части контрола А. Заранее спасибо |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Про окно A уже все написано.
Попробуй поставить окну В стиль CLIPCHILDREN. -------------------- ... |
|||
|
||||
| maq |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 173 Регистрация: 28.10.2005 Репутация: нет Всего: нет |
Окну В стиль CLIPCHILDREN поставил, окно А уже не моргает (если не нем больше ничего нет).
У окна А убрал CS_VREDRAW и CS_HREDRAW и зарегистрировал. Неизменяемая клиентская часть окна А при ресайзинге окна А не перерисовывается. Но вот если происходит ресайзинг окна В, то независимо от того происходит ресайзинг окна А или нет, окно А перерисовывается! Почему? |
|||
|
||||
| maq |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 173 Регистрация: 28.10.2005 Репутация: нет Всего: нет |
При ресайзинге окна В оно посылает сообщения окну А WM_PAINT и WM_ERASEBKGND. Как из окна А перехватить эти сообщения исходящие именно из окна В?
|
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Visual C++/MFC/WTL | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |