![]() |
|
Модераторы: Snowy, Alexeis, MetalFan |
![]()
|
|
| Zmiy |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 39 Регистрация: 3.3.2007 Репутация: нет Всего: 2 |
Скажите, пожалуйста, чем функция BeginPaint отличается от GetDC? Почему её нужно вызывать при обработке сообщения WM_PAINT, но нельзя в других случаях?
|
|||
|
||||
| Alexeis |
|
||||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 55 Всего: 459 |
Потому что графические дескрипторы не вечные, их дают во временное пользование, на период перерисовки. В другое время их достоверность не гарантируется. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
||||
|
|||||
| Zmiy |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 39 Регистрация: 3.3.2007 Репутация: нет Всего: 2 |
Это всё различие? Допустим, я перерисовываю окно по нажатию клавиши. Если я не вызываю BeginPaint, Windows шлёт мне WM_PAINT постоянно. Почему? |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 55 Всего: 459 |
Суть вопроса я не понял. По нажатию кнопки не нужно рисовать, а лишь вызывать Invalidate у того кого нужно перерисовать. Invalidate - скажет винде, что есть область которая нуждается в перерисовке, затем винда пошлет сообщение WM_PAINT - контролу, после чего срабатывает событие OnPaint и начинается перерисовка. Последовательность действий имеет значение.
-------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| Zmiy |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 39 Регистрация: 3.3.2007 Репутация: нет Всего: 2 |
Я понимаю. Я имел ввиду, что по нажатию клавиши (wm_keydown) я вызываю InvalidateRect. Затем я обрабатываю wm_paint и рисую средствами gdi. Dc у окна собственный, поэтому получать мне его каждый раз не нужно. НО если я не вызываю BeginPaint, то Windows шлёт мне wm_paint постоянно, даже когда окно никто не трогает. |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 55 Всего: 459 |
Это что-то новенькое. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| Alexeis |
|
||||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 55 Всего: 459 |
Думаю за такой эффект ответственный кто-то другой. См. пример.
-------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
||||
|
|||||
| bems |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 1 Всего: 88 |
из хелпа:
это документированое поведение -------------------- Обижено школьников: 8 |
||||
|
|||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 55 Всего: 459 |
Но ведь при использовании BeginPaint / EndPaint валидация провдиться, а сообщение шлется. Но однако в моем примере этого нет, WM_PAINT - вызывается всего 1 раз. Потому я думаю в этих вызовах виновен кто-то другой. Нужно больше кода.
-------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 1 Всего: 88 |
он его не вызывает.
не понял тебя -------------------- Обижено школьников: 8 |
|||
|
||||
| bems |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 1 Всего: 88 |
а как же это?
-------------------- Обижено школьников: 8 |
||||||
|
|||||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 55 Всего: 459 |
А прости, я невнимательно прочитал его пост, мне показалось, что он вызывает BeginPaint, но сообщения продолжают идти. Кстати наверняка при вызове GetDC валидация тоже производиться автоматом.
-------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 1 Всего: 88 |
Zmiy, если не вызываешь BeginPaint / EndPaint то попробуй после рисования сделать ValidateRect. Должно помочь
Добавлено через 2 минуты и 12 секунд
-------------------- Обижено школьников: 8 |
|||
|
||||
| Zmiy |
|
||||||
|
Новичок Профиль Группа: Участник Сообщений: 39 Регистрация: 3.3.2007 Репутация: нет Всего: 2 |
Если WindowClass.style указать как CS_OWNDC, то окно будет иметь постоянный dc, и BeginPaint (или getdc) каждый раз будет возвращать тебе одно и то же число. Да, но если написть так
то будет мой случай. После каждого вывода надо обнулять прямоугольник региона обновления, чем BeginPaint и занимается. Также это можно сделать с помощью ValidateRect и DefWindowProc. Стрёмно, что они это не написали для Beginpaint. Выходит, чтобы понять, как действует одна функция, надо читать всю справку Да, это как раз то что нужно, спасибо! Теперь всё понятно, но есть ещё один дурацкий вопрос: есть ли разница между выводом графики средствами OpenGL по сообщеню wm_paint и по таймеру? То есть
|
||||||
|
|||||||
![]()
|
| Правила форума "Delphi: Звук, графика и видео" | |
|
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делится вскрытыми компонентами
FAQ раздела лежит здесь! Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Girder, Snowy. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Звук, графика и видео | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |