| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Общие вопросы > Такая вот загадка... |
| Автор: Limonadni Joe 19.6.2005, 22:39 | ||
Посмотрим на код обработчика события WM_PAINT в классе TWinControl:
На сколько я смог отследить, именно за счёт этого inherited рисуется фон компонента. А загадка в том, что обработчика события WM_PAINT у класса TControl нет, хотя именно на него ссылается inherited. Как такое может быть? Может я что-то путаю? Или кривыми руками искал событие? Помогите разобраться откуда берётся серый фон у TWinControl. У компонента-брата TGraphicControl этого фона нет, хотя он тоже наследует от TControl. |
| Автор: Yanis 19.6.2005, 23:11 |
| Inherited говорит, что сначала вступает в работу переопределённый метод родителя. |
| Автор: p0s0l 20.6.2005, 01:19 |
| В случае с обработчиками сообщений (message-методы), если в предках не находится обаботчика нужного сообщения (в данном случае WM_PAINT нет у предков TControl..TObject), то вызывается виртуальный метод DefaultHandler... А идейное отличие TControl от TWinControl заключается в том, что TWinControl имеет своё окно, свой DC, может содержать дочерние контролы. Тогда как TGraphicControl рисует не на своём окне (которого у него нет вообще), а на окне родителя (Parent). |
| Автор: Limonadni Joe 20.6.2005, 14:37 | ||||
Спасибо, не знал. Но вот что получается. Это код метода DefaultHandler для TControl:
и в нём, как видим, нет упоминания о WM_PAINT. Где же этот WM_PAINT тогда обрабатывается? |
| Автор: p0s0l 20.6.2005, 18:48 |
| DefaultHandler - метод виртуальный Ищи не в TControl, а например, в TWinControl или TGraphicControl, смотря какой у тебя созданный объект Но не стоит надеятся найти что-то интересное, т.к. оба этих класса лишь основа для создания более сложных классов. TGraphicControl в обработчике WM_PAINT вызывает виртуальный метод Paint, который у самого TGraphicControl абсолютно ничего не делает, а в наследниках, например, в TImage выводит картинку. TWinControl в обработчике WM_PAINT вызывает стандартную оконную процедуру, которая обрабатывает это сообщение (заливая фоном)... |
| Автор: Rennigth 20.6.2005, 19:56 | ||
а он не помоему не серый, он по умолчанию ничего не рисует на себе, прозрачный он. |
| Автор: Limonadni Joe 21.6.2005, 09:51 |
| p0s0l, посмотрел DefaultHandler у TWinControl, проследил цепочку кода, но так и не нашёл места где ловится WM_PAINT Rennigth, ан-нет, я специально проверил: создал чистый компонент на основе TWinControl, кинул на форму и положил под него TextBox, и на TextBox'е покорно отобразилась часть серого фона от моего контрола. Хотя поначалу я тоже думал, что он прозрачный, пока не сделал ему Bring to Front |
| Автор: p0s0l 21.6.2005, 15:35 | ||
| Зайди в Project-Options->Complier, поставь Use Debug DCUs Теперь, сделай так:
|
| Автор: Limonadni Joe 21.6.2005, 17:10 | ||
Дошёл до вызова функции CallWindowProc:
Что же получается - серый фон рисует винда? Хотя, это вполне вероятно. Ведь у некоторых контролов (табов, например) градиентный фон, не будет же Delphi заниматься его прорисовкой. Мои догадки верны? |
| Автор: Girder 21.6.2005, 17:20 | ||
|
| Автор: Limonadni Joe 21.6.2005, 17:38 |
| Girder, это ты к чему написал? Я вроде и сам видел этот код. |
| Автор: Rrader 21.6.2005, 18:17 | ||
Что касается табов, то они полностью отрисовываются Windows, в Delphi даже событий перерисовки у них нет. Думаю, что твои догадки насчёт TWinControl'а верны. |
| Автор: p0s0l 21.6.2005, 20:06 | ||||
|
| Автор: Limonadni Joe 21.6.2005, 20:16 |
| p0s0l, да, спасибо. Просто я тогда не имел богатого представления о том, что такое стандартная оконная процедура и что (как я понял?) принадлежит она целиком и полностью винде. |
| Автор: Girder 22.6.2005, 00:02 | ||||||
По сабжу: Глянул исходники Controls... т.в. там регистрируется класс окна с _WNDCLASSEX.hbrBackground равным 0... а енто значит:
Т.е. вот оно (FillRect):
|
| Автор: p0s0l 22.6.2005, 01:14 |
| Мда, мне самому надо было продебаггить |
| Автор: Limonadni Joe 22.6.2005, 12:30 |
| Так... ну вроде разобрались откуда берётся фон компонента. А как сделать так, чтобы фон компонента был прозрачным? Так, как это реализовано, например, в TImage. Причём предок моего компонента - это не TGraphicControl, а TWinControl. Я пробовал перекрыть обратчик события WM_ERASEBKGND пустым методом, но тогда вместо компонента отображается то, что находиться аж под самой фомой - редактор кода Никак не могу разобраться Обсуждение можно продолжить в http://forum.vingrad.ru/index.php?showtopic=55913 топике. Только, пожалуйста, не надо корректировать то, что дано по условию. |