| 
| 
 | Вопрос # 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. Удачи
 |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |