delphi – TTrackBar定制职位?
发布时间:2020-12-15 04:30:46 所属栏目:大数据 来源:网络整理
导读:我试图在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,
我试图在Win 7缩放轨道栏中复制PAINT应用程序的行为:
(我知道这是一个常见的跟踪栏控件) 100%位于中心. 等等… 12.5%,25%,50%,100%,200%,300%,400%,500%,600%,700%,800% 所以我的缩放值(ZoomArray)是: 这很容易,我可以将最小值设置为1,最大值为11,并获取我需要的值: 问题是如何保持100%在中心,唯一可用的位置是上面的? 我试图在数组中使用虚拟值将1保留在中心,例如: 有任何想法吗? 解决方法
这是从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. 如果需要,垂直实施将是相似的.这不是一个完整的产品,只是一个模仿上述控件的行为的审判. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |