Как настроить размер большого пальца TrackBar?

Я не могу увеличить размер большого пальца с TTrackBar. Смотрите изображение:

Трекбар маленький (слева)

У меня маленький палец слева, и я не могу его увеличить (но не сам TrackBar).
Желаемый размер большого пальца показан на изображении с красной областью.
Может быть, я могу как-то использовать WINAPI ? Приложения C++ часто имеют больший палец.

Это то, чего я на самом деле прыгаю:

Стиль трекбара NotePad++


person Prog1020    schedule 18.02.2013    source источник
comment
@kobik: Это сделает утопленный прямоугольник намного тоньше, но это не повлияет на большой палец, который получит размер по умолчанию (~ 24).   -  person Andreas Rejbrand    schedule 18.02.2013
comment
@Ingo: нет проблем с достижением стиля, показанного на скриншоте. В современных версиях Delphi просто установите ShowSelRange в false. Если TTrackBar.ShowSelRange недоступен в вашей версии, просто удалите стиль окна TBS_ENABLESELRANGE.   -  person Andreas Rejbrand    schedule 19.02.2013
comment
Я почти уверен, что «желаемый размер большого пальца» на первом снимке экрана больше, чем большой палец на втором снимке экрана...   -  person Andreas Rejbrand    schedule 19.02.2013


Ответы (2)


Казалось бы, это невозможно сделать с помощью стандартного элемента управления трекбаром. Действительно, я не вижу никакой трекбара стиль или панель управления сообщение по этому поводу. Есть только TBM_SETTHUMBLENGTH, к которому вы также можете получить доступ из TTrackBar.ThumbLength VCL, но это также влияет на высоту утопленного прямоугольника фона.

Следствием этого является то, что я сомневаюсь в наблюдении, что «приложения на C++ часто имеют больший палец».

Конечно, вы всегда можете сделать свой собственный трекбар управление.

Или вы хотите только уменьшить затонувший прямоугольник? Затем просто установите ShowSelRange в False в инспекторе объектов. Но если темы включены, вы все равно не можете сделать большой палец больше примерно 24.

Если вы используете старую версию Delphi без TrackBar.ShowSelRange, вам необходимо вручную удалить стиль окна TBS_ENABLESELRANGE. Вы можете сделать это в любое время, используя SetWindowLong, или вы можете сделать это в CreateParams подкласса элемента управления трекбар. Самым простым способом может быть использование «класса промежуточного звена»:

type
  TTrackBar = class(ComCtrls.TTrackBar)
  protected
    procedure CreateParams(var Params: TCreateParams); override;
  end;

...   
implementation

{ TTrackBar }

procedure TTrackBar.CreateParams(var Params: TCreateParams);
begin
  inherited;
  Params.Style := Params.Style and not TBS_ENABLESELRANGE;
end;

Чтобы получить внешний вид на снимке экрана Notepad ++, вы также должны установить TickMarks на tmBoth и TickStyle на tsNone.

Однако это не отвечает на ваш вопрос, который касался увеличения большого пальца. Это сделает утопленный прямоугольник меньше... Однако, судя по вашим снимкам экрана, это то, что вам нужно.

person Andreas Rejbrand    schedule 18.02.2013
comment
@Andreas, мне нужен такой трекбар в стиле Notepad++ -- изображение NP++ - person Prog1020; 19.02.2013
comment
+1 p.s: Нет ShowSelRange в D7 (OP мог бы использовать TBS_ENABLESELRANGE в любом случае), я также думаю, что ~ 24 - это максимальный размер, который он может получить только при использовании тем XP. - person kobik; 19.02.2013
comment
... И при установке TickMarks на tmBoth фактически нет ограничений по размеру. Я думаю, ты попал в точку :) - person kobik; 19.02.2013
comment
@kobik: Да, я только что это видел. Интересный. Тем не менее, второй скриншот, предоставленный ОП, предполагает, что он на самом деле не хотел увеличивать большой палец, а скорее уменьшал затонувший прямоугольник... - person Andreas Rejbrand; 19.02.2013
comment
@ Андреас, ты угадал мое желание, я хочу меньший затонувший прямоугольник. Решено. - person Prog1020; 19.02.2013

Трекбар — это один из собственных элементов управления, поддерживающих пользовательское рисование. По сути, когда темы включены, вы можете управлять различными аспектами рисования элемента управления или можете сообщить ОС, что вы сами рисуете детали. Подробнее о пользовательском рисовании см. здесь.

Нам не нужно перегонять какой-либо рисунок, чтобы немного поиграть с размерами некоторых деталей. Именно VCL рисует канал (углубленный фон трекинга) и такты. Для тиков уже есть свойства, которые мы можем использовать. Для канала мы можем немного сдуть прямоугольник, и VCL возьмет на себя управление. Ползунок рисуется оконной процедурой по умолчанию, но это не имеет значения, ОС отрисовывает бегунок в измененный прямоугольник.

В приведенном ниже примере (для горизонтального трекбара) перехватывается уведомление WM_NOTIFY, отправленное в форму, для выполнения этих изменений. Это будет работать только в том случае, если трекбар размещен непосредственно на форме. Если это не так, вы можете получить новый элемент управления, производный от TTrackBar, для обработки CN_NOTIFY, или создать подкласс элемента управления или его родителя для WM_NOTIFY. Все, что имеет значение, — это обработать уведомление до того, как будет выполнено фактическое рисование.

Вот как выглядит пример:
введите здесь описание изображения

type
  TForm1 = class(TForm)
    Button1: TButton;
    TrackBar1: TTrackBar;
    procedure FormCreate(Sender: TObject);
  protected
    procedure WMNotify(var Msg: TWMNotify); message WM_NOTIFY;
  end;

...

uses
  themes, commctrl, xpman;

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  if ThemeServices.ThemesEnabled and
      (TrackBar1.Orientation = trHorizontal) then begin
    TrackBar1.TickMarks := tmBoth;
    TrackBar1.TickStyle := tsNone;
    TrackBar1.ThumbLength := 38;
  end;
end;

procedure TForm1.WMNotify(var Msg: TWMNotify);
begin
  if ThemeServices.ThemesEnabled and
      (TrackBar1.Orientation = trHorizontal) then begin

    if (Msg.IDCtrl = Longint(TrackBar1.Handle)) and
        (Msg.NMHdr.code = NM_CUSTOMDRAW) and
        (PNMCustomDraw(Msg.NMHdr).dwDrawStage = CDDS_ITEMPREPAINT) then begin

      case PNMCustomDraw(Msg.NMHdr).dwItemSpec of
        TBCD_THUMB: InflateRect(PNMCustomDraw(Msg.NMHdr).rc, -4, 0);
        TBCD_CHANNEL:
          with PNMCustomDraw(Msg.NMHdr).rc do begin
            Top := Bottom div 2 + 2;
            Bottom := Top + 5;
            Inc(Left, 4);
            Dec(Right, 4);
          end;
      end;
    end;
  end;

  inherited;
end;
person Sertac Akyuz    schedule 19.02.2013
comment
+1. Я полностью упустил этот вариант (несколько смущен). - person Andreas Rejbrand; 19.02.2013
comment
@Андреас - Спасибо. Я бы также выбрал ваше решение для этой проблемы. Я вообще чувствую себя немного неловко с пользовательским рисованием, я нахожу это каким-то непредсказуемым. - person Sertac Akyuz; 19.02.2013
comment
@SertacAkyuz: Да, и его нужно обновлять для каждой новой версии Windows, потому что MS (снова) передумает о стилях по умолчанию ... - person Marjan Venema; 19.02.2013
comment
@Marjan: Ну, согласно моим кошмарам, главная проблема будет заключаться в том, что MS полностью прекратит поддержку настольных приложений Win32 в течение десяти или двух лет. В конце концов, GDI и многие другие технологии уже помечены как «устаревшие» в MSDN. - person Andreas Rejbrand; 20.02.2013