Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 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, а самостоятельно, можно получить не только цветную полосу прокрутки, но и полосу, раскрашенную разными узорами.

Приложение:
  1. type
  2. TColorScrollBar=class(TScrollBar)
  3. private
  4. procedure CNCtlColorScrollBar(var Msg:TMessage);message CN_CtlColorScrollBar;
  5. published
  6. property Color;
  7. end;
  8.  
  9. procedure TColorScrollBar.CNCtlColorScrollBar(var Msg:TMessage);
  10. begin
  11. DefaultHandler(Msg)
  12. 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

Alex Van Glukhman (статус: 7-ой класс), 20 февраля 2007, 07:07 [#1]:

На самом деле разработка компонентов не такая сложная вещь. Зато именно вся прелесть рабочей программы определяется компонентами имеющими максимум функциональности, за счёт использования минимума properties procedures & functions & events. На фига например мне тащить в прогу полный TDBGrid со всем описанием его свойств и методов если он используется только для просмотра данных. Не лучше ли наследовать только необходимые функции и при этом добавить что нибудь своё -например многострочные Cells.
Удачи

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:59
Выполнено за 0.03 сек.