В Windows предусмотрено сообщение WM_CtlColorScrollBar,
которое посылается окну, содержащему элементы управления
ScrollBar (полосы прокрутки). В ответ на это сообщение
окно должно вернуть системе кисть, которой надо закрасить
полосу прокрутки. С помощью WM_CtlColorScrollBar можно
получать разноцветные полосы прокрутки, что иногда бывает
достаточно красиво.
В Delphi форма при получении этого сообщения посылает
соответствующему компоненту типа TScrollBar сообщение
CN_CtlColorScrollBar, перепоручая обработку ему. И тут
мы сталкиваемся с явным глюком VCL: это сообщение передаётся
стандартную оконную процедуру, хотя сообщение само по
себе нестандартное, и стандартная процедура заведомо не
сможет его обработать. Из-за этого TScrollBar не может
изменять свой цвет, хотя львиная доля работы, необходимой
для этого, делается в VCL. Чтобы исправить это, достаточно
передать обработку CN_CtlColorScrollBar в метод DefaultHandler
вместо DefWndProc. Ещё надо перенести в раздел published свойство
Color, чтобы получить возможность управлять цветом полосы прокрутки.
Но, несмотря на то, что в VCL здесь явная ошибка, не исправленная,
кстати, даже в седьмой версии Delphi, править исходный код StdCtrls
всё же не стоит. Вместо этого лучше написать свой компонент,
который доделает то, что не доделано в стандартном TScrollBar'е.
Код этого компонента будет выглядеть так:
type
TColorScrollBar=class(TScrollBar)
private
procedure CNCtlColorScrollBar(var Msg:TMessage);message CN_CtlColorScrollBar;
published
property Color;
end;
procedure TColorScrollBar.CNCtlColorScrollBar(var Msg:TMessage);
begin
DefaultHandler(Msg)
end;
Создав и зарегистрировав такой компонент, вы получите возможность
управлять цветом полосы прокрутки. К сожалению, управлять цветом
стандартных полос прокрутки формы или ScrollBox'а так же легко не
получится.
В принципе, реализовав обработку CN_CtlColorScrollBar не с помощью
процедуры DefaultHandler, а самостоятельно, можно получить не только
цветную полосу прокрутки, но и полосу, раскрашенную разными узорами.
Источник: www.delphikingdom.ru
|