![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| Limonadni Joe |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 311 Регистрация: 1.11.2002 Где: Москва Репутация: нет Всего: 2 |
Посмотрим на код обработчика события WM_PAINT в классе TWinControl:
На сколько я смог отследить, именно за счёт этого inherited рисуется фон компонента. А загадка в том, что обработчика события WM_PAINT у класса TControl нет, хотя именно на него ссылается inherited. Как такое может быть? Может я что-то путаю? Или кривыми руками искал событие? Помогите разобраться откуда берётся серый фон у TWinControl. У компонента-брата TGraphicControl этого фона нет, хотя он тоже наследует от TControl. |
|||
|
||||
| Yanis |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2937 Регистрация: 9.2.2004 Где: Москва Репутация: 72 Всего: 111 |
Inherited говорит, что сначала вступает в работу переопределённый метод родителя.
|
|||
|
||||
| p0s0l |
|
|||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: 58 Всего: 112 |
В случае с обработчиками сообщений (message-методы), если в предках не находится обаботчика нужного сообщения (в данном случае WM_PAINT нет у предков TControl..TObject), то вызывается виртуальный метод DefaultHandler...
А идейное отличие TControl от TWinControl заключается в том, что TWinControl имеет своё окно, свой DC, может содержать дочерние контролы. Тогда как TGraphicControl рисует не на своём окне (которого у него нет вообще), а на окне родителя (Parent). -------------------- С уважением, г-н Посол. |
|||
|
||||
| Limonadni Joe |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 311 Регистрация: 1.11.2002 Где: Москва Репутация: нет Всего: 2 |
Спасибо, не знал. Но вот что получается. Это код метода DefaultHandler для TControl:
и в нём, как видим, нет упоминания о WM_PAINT. Где же этот WM_PAINT тогда обрабатывается? |
||||
|
|||||
| p0s0l |
|
|||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: 58 Всего: 112 |
DefaultHandler - метод виртуальный
Ищи не в TControl, а например, в TWinControl или TGraphicControl, смотря какой у тебя созданный объект Но не стоит надеятся найти что-то интересное, т.к. оба этих класса лишь основа для создания более сложных классов. TGraphicControl в обработчике WM_PAINT вызывает виртуальный метод Paint, который у самого TGraphicControl абсолютно ничего не делает, а в наследниках, например, в TImage выводит картинку. TWinControl в обработчике WM_PAINT вызывает стандартную оконную процедуру, которая обрабатывает это сообщение (заливая фоном)... -------------------- С уважением, г-н Посол. |
|||
|
||||
| Rennigth |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1708 Регистрация: 21.6.2004 Где: Moscow Репутация: 49 Всего: 76 |
а он не помоему не серый, он по умолчанию ничего не рисует на себе, прозрачный он. -------------------- (* Honesta mors turpi vita potior *) |
|||
|
||||
| Limonadni Joe |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 311 Регистрация: 1.11.2002 Где: Москва Репутация: нет Всего: 2 |
p0s0l, посмотрел DefaultHandler у TWinControl, проследил цепочку кода, но так и не нашёл места где ловится WM_PAINT
Rennigth, ан-нет, я специально проверил: создал чистый компонент на основе TWinControl, кинул на форму и положил под него TextBox, и на TextBox'е покорно отобразилась часть серого фона от моего контрола. Хотя поначалу я тоже думал, что он прозрачный, пока не сделал ему Bring to Front |
|||
|
||||
| p0s0l |
|
|||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: 58 Всего: 112 |
Зайди в Project-Options->Complier, поставь Use Debug DCUs
Теперь, сделай так:
-------------------- С уважением, г-н Посол. |
|||
|
||||
| Limonadni Joe |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 311 Регистрация: 1.11.2002 Где: Москва Репутация: нет Всего: 2 |
Дошёл до вызова функции CallWindowProc:
Что же получается - серый фон рисует винда? Хотя, это вполне вероятно. Ведь у некоторых контролов (табов, например) градиентный фон, не будет же Delphi заниматься его прорисовкой. Мои догадки верны? |
|||
|
||||
| Girder |
|
|||
![]() Лентяй 2 ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1993 Регистрация: 12.5.2004 Репутация: 31 Всего: 155 |
-------------------- Как слышим, так и пишим. Истина где-то там... |
|||
|
||||
| Limonadni Joe |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 311 Регистрация: 1.11.2002 Где: Москва Репутация: нет Всего: 2 |
Girder, это ты к чему написал? Я вроде и сам видел этот код.
|
|||
|
||||
| Rrader |
|
|||
|
Inspired =) ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1535 Регистрация: 7.5.2005 Репутация: 70 Всего: 191 |
Что касается табов, то они полностью отрисовываются Windows, в Delphi даже событий перерисовки у них нет. Думаю, что твои догадки насчёт TWinControl'а верны. |
|||
|
||||
| p0s0l |
|
||||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: 58 Всего: 112 |
-------------------- С уважением, г-н Посол. |
||||
|
|||||
| Limonadni Joe |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 311 Регистрация: 1.11.2002 Где: Москва Репутация: нет Всего: 2 |
p0s0l, да, спасибо. Просто я тогда не имел богатого представления о том, что такое стандартная оконная процедура и что (как я понял?) принадлежит она целиком и полностью винде.
|
|||
|
||||
| Girder |
|
||||||
![]() Лентяй 2 ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1993 Регистрация: 12.5.2004 Репутация: 31 Всего: 155 |
По сабжу: Глянул исходники Controls... т.в. там регистрируется класс окна с _WNDCLASSEX.hbrBackground равным 0... а енто значит:
Т.е. вот оно (FillRect):
-------------------- Как слышим, так и пишим. Истина где-то там... |
||||||
|
|||||||
![]()
|
| Правила форума "Delphi: Общие вопросы" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |