delphi – TTrackBar定制职位?

前端之家收集整理的这篇文章主要介绍了delphi – TTrackBar定制职位?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图在Win 7缩放轨道栏中复制PAINT应用程序的行为:
(我知道这是一个常见的跟踪栏控件)

100%位于中心.
它有11个可用职位:

等等…

12.5%,25%,50%,100%,200%,300%,400%,500%,600%,700%,800%

所以我的缩放值(ZoomArray)是:
0.125,0.25,0.5,1,2,3,4,5,6,7,8

这很容易,我可以将最小值设置为1,最大值为11,并获取我需要的值:
ZoomArray [TrackBar1.Position]

问题是如何保持100%在中心,唯一可用的位置是上面的?

我试图在数组中使用虚拟值将1保留在中心,例如:
0.125,1 -1,-1,8
并且在“变更”事件中重新定位轨迹栏,但是我的逻辑似乎没有正确的工作.

有任何想法吗?

解决方法

这是从TTrackbar中导出新控件的一个替代方法,去除滚动消息中的自动提示和处理滑动,其行为与Paint中的控件几乎相同.用D2007编译,试图点评一下:
unit Unit1;

interface

uses
  Windows,Messages,SysUtils,Classes,Controls,Forms,ComCtrls,StdCtrls;

type
  TCNHScroll = TWMHScroll;

  TTrackBar = class(comctrls.TTrackBar)  // interposer class for quick test
  protected
    procedure CreateParams(var Params: TCreateParams); override;
    procedure CreateWnd; override;
    procedure CNHScroll(var Message: TCNHScroll); message CN_HSCROLL;
  public
    constructor Create(AOwner: TComponent); override;
  end;

  TForm1 = class(TForm)
    Label1: TLabel;
    TrackBar1: TTrackBar;
    procedure TrackBar1Change(Sender: TObject);
  end;

var
  Form1: TForm1;

implementation

uses
  commctrl;

{$R *.dfm}

procedure TForm1.TrackBar1Change(Sender: TObject);
begin
  // account for non-linear scaling for a sensible value
  if TrackBar1.Position <= 8 then
    Label1.Caption := IntToStr(TrackBar1.Position * 125)
  else
    Label1.Caption := IntToStr(TrackBar1.Position * 1000 - 7000)
end;

{ TTrackBar }

constructor TTrackBar.Create(AOwner: TComponent);
begin
  inherited;

  // We'll have 15 positions which should account for the following values 
  // 125 250 - 500 - - - 1000 2000 3000 4000 5000 6000 7000 8000
  // positions 3,5..7 will be skipped when tracking
  Min := 1;
  Max := 15;
  LineSize := 1;
  PageSize := 1;
end;

procedure TTrackBar.CreateParams(var Params: TCreateParams);
begin
  inherited;
  // remove automatic ticks so that we don't have ticks at 3 and 5..7
  Params.Style := Params.Style and not TBS_AUTOTICKS;
end;

procedure TTrackBar.CreateWnd;
begin
  inherited;
  // first and last tick not required
  SetTick(2);  //  250
  SetTick(4);  //  500
  SetTick(8);  // 1000
  SetTick(9);  // 2000
  SetTick(10); 
  SetTick(11);
  SetTick(12);
  SetTick(13);
  SetTick(14); // 7000
end;

procedure TTrackBar.CNHscroll(var Message: TCNHScroll);
var
  Pos: Integer;
begin
  // prevent jumping back and forth while thumb tracking,do not slide to the
  // next tick until a threshold is passed
  if Message.ScrollCode = SB_THUMBTRACK then begin
    case Message.Pos of            
      5: SendMessage(Handle,TBM_SETPOS,4);
      6,7: SendMessage(Handle,8);
    end;
  end;

  // for line and page and rest of the scrolling,skip certain ticks
  Pos := SendMessage(Handle,TBM_GETPOS,0);
  if Pos > Position then      // compare with prevIoUs position
    case Pos of
      3: SendMessage(Handle,4);
      5..7: SendMessage(Handle,8);
    end;
  if Pos < Position then
    case Pos of
      3: SendMessage(Handle,2);
      5..7: SendMessage(Handle,4);
    end;

  inherited;
end;

end.

如果需要,垂直实施将是相似的.这不是一个完整的产品,只是一个模仿上述控件的行为的审判.

猜你在找的Delphi相关文章