Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Custom ScrollBar своими руками, Полоса прокрутки с доп. возможностями 
:(
    Опции темы
Psychosis
Дата 11.8.2005, 23:26 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Уже 6 дней мучаюсь, никак не могу написать...

Этот scrollbar должен быть расширяемым. Имеется ввиду, что верний предел (Max), на самом деле не является пределом. Просто, при перемещении ползунка до этого Max, и далее, это значении Max будет увеличиваться пропорционально тому, насколько мы этот ползунок удвинули дальше. При последующем обратном движении, Max будет уменьшаться, но не опустится менее первоначального Max. Т.е. здесь есть как бы два предела первоначальный (OriginalMax) и текущий (CurrentMax).

Смысл этого. Представте, что у вас прокручиваемой областью является какая-либо диаграмма, на которой находяться разные прямоугольнички.
Множество этих прямоугольничков можно "вписать" в большой ограничивающий прямоугольник (BoundsRect). Высота и ширина этого прямоугольника и будет задавать пределы изменения двух scrollbar'ов.
Только вое если, пользователю захочется прокрутить на чистое место, что бы положить туда новый прямоугольничек, он с обычным scrollbar'ом этого не сделает.

Ответ желательно в форме обработчиков для трех событий:
- MouseDown
- MouseMove
- MouseUp

Язык C++ или ObjectPascal....
  Вверх
sergejzr
Дата 11.8.2005, 23:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 11
Всего: 360



Цитата(Psychosis @ 11.8.2005, 22:26)
Ответ желательно в форме обработчиков для трех событий:
- MouseDown
- MouseMove
- MouseUp

??
Почему бы не ловить событие onchange. Там запоминать значение и сравнивать его с новым. Затем менять соответсвенно MaxValue и двигать бегунок на новое значение setValue()


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Guest
Дата 11.8.2005, 23:45 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Position у стандартного Scrollbar'а не может выходить за [min; max] никогда!

Код

procedure TForm1.ScrollBar1Change(Sender: TObject);
begin
  Caption := IntToStr(ScrollBar1.Position);
end;


Будет от 0 (min) до 100 (max)....
  Вверх
sergejzr
Дата 12.8.2005, 01:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 11
Всего: 360



Надо значит ввести фактор и перерешивать координаты

канвас = scrollbar_value*factor
scrollbar_value=канвас/factor

faсtor меняется в зависимости от "настоящего" размера канваса и составляет настоящий_макс/100

Чтото вроде этого.
Единственно что тебе надо - вычислять настоящий макс в зависимости от предидущего значения скрола.


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Psychosis
Дата 12.8.2005, 03:25 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Нет, совсем не то!
Умножить TScrollBar.Position на какой-либо фактор я могу, только мне не это надо...

Я пишу свой собственный ScrollBar, да и к тому же не от TComponent, у меня есть свой собственный класс TArea (от TObject), от него порожден TCustomRectArea, затем TRectArea.

У TArea основные функциональные методы:
Код

    procedure MouseDown(AButton: TMouseButton; AShiftState: TShiftState; APosition: TPoint); virtual;
    procedure MouseMove(AShiftState: TShiftState; APosition: TPoint); virtual;
    procedure MouseUp(AButton: TMouseButton; AShiftState: TShiftState; APosition: TPoint); virtual;
    procedure PaintTo(ACanvas: TCanvas); virtual;


Отрисовка производиться на канву формы через буфферный битмап, события от мыши, так же, поступают от формы и передаются самой парентной TArea. У TArea есть список дочерних TArea.... and so on

Так вот я хочу написать нормальный TScrollBar (TScrollBarArea), а не такой глючный как стандартный виндовский и с доп. возможностями.
У стандартного есть например такой глюк, когда тянуть ползунок далеко вправо, за пределы ScrollBar'а, то ползунок перескакивает на позицию 0. Или если предварительно поместить ползунок на середину, а затем аналогично далеко потянуть его влево, то он перескочит на середину...

Так вот, TScrollBar у меня называется TScrollBarAreaNew, но он нам не интересен, т.к. реализует только расположение кнопок для прокрутки и "TSliderBarArea", кот. нас и интересует.
Код

  TScrollBarAreaNew = class(TRectArea)
  private
    FDecreaseButtonArea: TCustomTimerButtonArea;
    FIncreaseButtonArea: TCustomTimerButtonArea;
    FSliderBarArea: TSliderBarArea;
    FListLayout: TListLayout;

    function GetOrientation: TOrientation;
    procedure SetOrientation(AValue: TOrientation);

    function GetMin: Real;
    procedure SetMin(AValue: Real);
    function GetMax: Real;
    procedure SetMax(AValue: Real);
  protected
    procedure DecreaseButtonAreaPaintHandler(ACanvas: TCanvas);
    procedure IncreaseButtonAreaPaintHandler(ACanvas: TCanvas);
    procedure DecreaseButtonAreaTimerHandler(ASender: TObject);
    procedure IncreaseButtonAreaTimerHandler(ASender: TObject);
  public
    constructor Create; override;
    destructor Destroy; override;

    property Orientation: TOrientation read GetOrientation write SetOrientation;

    property Min: Real read GetMin write SetMin;
    property Max: Real read GetMax write SetMax;

    procedure Resize; override;
  end;


TSliderBarArea - по сути, просто контейнер, кот. определяет в каких пределах может ездить "TSliderArea".
Код

  TSliderBarArea = class(TRectArea)
  private
    FSliderArea: TSliderArea;
  public
    constructor Create; override;
    destructor Destroy; override;

    procedure Resize; override;

    procedure PaintTo(ACanvas: TCanvas); override;
  end;


Вот с "TSliderArea" и есть основная "Ж"

Код

  TSliderArea = class({TRectArea}TCustomRectArea)
  private
    FCaught: Boolean;
    FCatchPoint: TPoint;
    FOriginalPoint: TPoint;

    FPosition: Real;
    FSize: Real;
    FMin: Real;
    FMax: Real;
    FRealMin: Real;
    FRealMax: Real;
  protected
    function GetLeft: Integer; override;
    procedure SetLeft(AValue: Integer); override;
    function GetTop: Integer; override;
    procedure SetTop(AValue: Integer); override;
    function GetWidth: Integer; override;
    procedure SetWidth(AValue: Integer); override;
    function GetHeight: Integer; override;
    procedure SetHeight(AValue: Integer); override;
  public
    procedure MouseDown(AButton: TMouseButton; AShiftState: TShiftState; APosition: TPoint); override;
    procedure MouseMove(AShiftState: TShiftState; APosition: TPoint); override;
    procedure MouseUp(AButton: TMouseButton; AShiftState: TShiftState; APosition: TPoint); override;

    procedure PaintTo(ACanvas: TCanvas); override;
  end;

  Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0457 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.