|
Вопрос # 320/ вопрос открыт / |
|
Здравствуйте. Подскажите как создать ScrollBar особой формы. Например шарик на ниточке. Либо как в Winampе на цветной полоске квадратная ручка с изображением. Я делал подобие ScrollBara рисуя его картинками и управляя Image компонентами описывая все условия немелкой программой. Может есть какой-то простой путь, типа описывания регионов компонента как в случае с фигурной формой?
 |
Вопрос задал: Павлов Евгений Владимирович (статус: Посетитель)
Вопрос отправлен: 17 февраля 2007, 17:29
Состояние вопроса: открыт, ответов: 3.
|
Ответ #1. Отвечает эксперт: Роман
Здравствуйте, Павлов Евгений Владимирович!Скорее всего в данном случае прийдётся посоть свой компонент наследник TScrollBar или даже TCustomControl.Приведу на всякий случай вориант изменения цвета scrollbar-a;В Windows предусмотрено сообщение WM_CtlColorScrollBar, которое посылается окну, содержащему элементы управления ScrollBar (полосы прокрутки). В ответ на это сообщение окно должно вернуть системе кисть, которой надо закрасить полосу прокрутки. С помощью WM_CtlColorScrollBar можно получать разноцветные полосы прокрутки, что иногда бывает достаточно красиво.
В Delphi форма при получении этого сообщения посылает соответствующему компоненту типа TScrollBar сообщение CN_CtlColorScrollBar, перепоручая обработку ему. И тут мы сталкиваемся с явным глюком VCL: это сообщение передаётся в стандартную оконную процедуру, хотя сообщение само по себе нестандартное, и стандартная процедура заведомо не сможет его обработать. Из-за этого TScrollBar не может изменять свой цвет, хотя львиная доля работы, необходимой для этого, делается в VCL. Чтобы исправить это, достаточно передать обработку CN_CtlColorScrollBar в метод DefaultHandler вместо DefWndProc. Ещё надо перенести в раздел published свойство Color, чтобы получить возможность управлять цветом полосы прокрутки. Но, несмотря на то, что в VCL здесь явная ошибка, не исправленная, кстати, даже в седьмой версии Delphi, править исходный код StdCtrls всё же не стоит. Вместо этого лучше написать свой компонент, который доделает то, что не доделано в стандартном TScrollBar'е.Код этого компонента ниже.Создав и зарегистрировав такой компонент, вы получите возможность управлять цветом полосы прокрутки.В принципе, реализовав обработку CN_CtlColorScrollBar не с помощью процедуры DefaultHandler, а самостоятельно, можно получить не только цветную полосу прокрутки, но и полосу, раскрашенную разными узорами.
Приложение: Переключить в обычный режим- 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;
 |
Ответ отправил: Роман (статус: 5-ый класс)
Время отправки: 17 февраля 2007, 18:21
Оценка за ответ: 5
Комментарий к оценке: Очень содержательно
|
Ответ #2. Отвечает эксперт: Alex Van Glukhman
Здравствуйте, Павлов Евгений Владимирович!
Изучить разработку VCL компонентов, принципы наследования. Изучить исходные коды компонентов библиотеки VCL - они поставляются с дистрибутивом Delphi.
Удачи
 |
Ответ отправил: Alex Van Glukhman (статус: 7-ой класс)
Время отправки: 17 февраля 2007, 18:23
Оценка за ответ: 3
Комментарий к оценке: Одним словом, для придания форм объекту необходимо изучить всю среду программирования? Спасибо за совет. Пожалуй до такого я еще не дорос. Это очень круто.
|
Ответ #3. Отвечает эксперт: Матвеев Игорь Владимирович
Здравствуйте, Павлов Евгений Владимирович!
Изменить форму ScrollBar-а можно, но что толку? можно конечно и функцию отрисовки перехватить, заменив своей, но это сложнее чем написать свой компонент с нуля (TWinControl или, если не требуется управление клавиатурой, т.е. контрол не должен принимать фокус - то и от TGraphicControl).
Есть и другой вариант - скин-библиотеки, можно воспользоваться ей и замениь тогда сразу не только ScrollBar-ы но и другое контролы. А можно поискать и реализацию ScrollBar-а с возможностью смены внешнего вида. Уверен, реалюзацию этого можно найти, если посикать.
 |
Ответ отправил: Матвеев Игорь Владимирович (статус: Студент)
Время отправки: 19 февраля 2007, 06:05
Оценка за ответ: 4
Комментарий к оценке: Могли бы и по-подробнее. Спасибо за помощь
|
Мини-форум вопроса
Всего сообщений: 1; последнее сообщение — 20 февраля 2007, 07:07; участников в обсуждении: 1.
|
Alex Van Glukhman (статус: 7-ой класс), 20 февраля 2007, 07:07 [#1]:
На самом деле разработка компонентов не такая сложная вещь. Зато именно вся прелесть рабочей программы определяется компонентами имеющими максимум функциональности, за счёт использования минимума properties procedures & functions & events. На фига например мне тащить в прогу полный TDBGrid со всем описанием его свойств и методов если он используется только для просмотра данных. Не лучше ли наследовать только необходимые функции и при этом добавить что нибудь своё -например многострочные Cells.
Удачи
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|