TrackBar 类的方法
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了TrackBar 类的方法相关的知识,希望对你有一定的参考价值。
参考技术A说明 说明 AccessibilityNotifyClients
(AccessibleEvents, Int32) 就指定的子控件的指定 AccessibleEvents 通知辅助功能客户端应用程序。 (继承自 Control。) AccessibilityNotifyClients
(AccessibleEvents, Int32, Int32) 就指定的子控件的指定 AccessibleEvents 通知辅助功能客户端应用程序。 (继承自 Control。) BeginInit 基础结构。开始初始化在窗体上使用或由另一个组件使用的 TrackBar。 初始化发生在运行时。 BeginInvoke(Delegate) 在创建控件的基础句柄所在线程上异步执行指定委托。 (继承自 Control。) BeginInvoke(Delegate, array<Object>) 在创建控件的基础句柄所在线程上,用指定的参数异步执行指定委托。 (继承自 Control。) BringToFront 将控件带到Z 顺序的前面。 (继承自 Control。) Contains 检索一个值,该值指示指定控件是否为一个控件的子控件。 (继承自 Control。) CreateAccessibilityInstance 为该控件创建一个新的辅助功能对象。 (继承自 Control。) CreateControl 强制创建可见控件,包括创建句柄和任何可见子控件。 (继承自 Control。) CreateControlsInstance 为控件创建控件集合的新实例。 (继承自 Control。) CreateGraphics 为控件创建 Graphics。 (继承自 Control。) CreateHandle 基础结构。重写 CreateHandle 方法。 (重写 Control::CreateHandle()。) CreateObjRef 创建一个对象,该对象包含生成用于与远程对象进行通信的代理所需的全部相关信息。 (继承自 MarshalByRefObject。) DefWndProc 向默认窗口过程发送指定消息。 (继承自 Control。) DestroyHandle 毁坏与该控件关联的句柄。 (继承自 Control。) Dispose() 释放由 Component 使用的所有资源。 (继承自 Component。) Dispose(Boolean) 释放由 Control 和它的子控件占用的非托管资源,另外还可以释放托管资源。 (继承自 Control。) DoDragDrop 开始拖放操作。 (继承自 Control。) DrawToBitmap 支持呈现到指定的位图。 (继承自 Control。) EndInit 基础结构。结束在窗体上使用或由另一个组件使用的 TrackBar 的初始化。 初始化发生在运行时。 EndInvoke 检索由传递的 IAsyncResult 表示的异步操作的返回值。 (继承自 Control。) Equals(Object) 确定指定的 Object 是否等于当前的 Object。 (继承自 Object。) Finalize 在通过垃圾回收将 Component 回收之前,释放非托管资源并执行其他清理操作。 (继承自 Component。) FindForm 检索控件所在的窗体。 (继承自 Control。) Focus 为控件设置输入焦点。 (继承自 Control。) GetAccessibilityObjectById 检索指定的 AccessibleObject。 (继承自 Control。) GetAutoSizeMode 检索一个值,该值指示当启用控件的 AutoSize 属性时控件的行为方式。 (继承自 Control。) GetChildAtPoint(Point) 检索位于指定坐标处的子控件。 (继承自 Control。) GetChildAtPoint(Point, GetChildAtPointSkip) 检索位于指定坐标的子控件,并且指定是否忽略特定类型的子控件。 (继承自 Control。) GetContainerControl 沿着控件的父控件链向上,返回下一个 ContainerControl。 (继承自 Control。) GetHashCode 用作特定类型的哈希函数。 (继承自 Object。) GetLifetimeService 检索控制此实例的生存期策略的当前生存期服务对象。 (继承自 MarshalByRefObject。) GetNextControl 按照子控件的Tab 键顺序向前或向后检索下一个控件。 (继承自 Control。) GetPreferredSize 检索适合控件的矩形区域的大小。 (继承自 Control。) GetScaledBounds 检索缩放控件时的边界。 (继承自 Control。) GetService 返回一个对象,该对象表示由 Component 或它的 Container 提供的服务。 (继承自 Component。) GetStyle 为控件检索指定控件样式位的值。 (继承自 Control。) GetTopLevel 确定控件是否是顶级控件。 (继承自 Control。) GetType 获取当前实例的 Type。 (继承自 Object。) Hide 对用户隐藏控件。 (继承自 Control。) InitializeLifetimeService 获取控制此实例的生存期策略的生存期服务对象。 (继承自 MarshalByRefObject。) InitLayout 在将控件添加到另一个容器之后调用。 (继承自 Control。) Invalidate() 使控件的整个图面无效并导致重绘控件。 (继承自 Control。) Invalidate(Boolean) 使控件的特定区域无效并向控件发送绘制消息。 还可以使分配给该控件的子控件无效。 (继承自 Control。) Invalidate(Rectangle) 使控件的指定区域无效(将其添加到控件的更新区域,下次绘制操作时将重新绘制更新区域),并向控件发送绘制消息。 (继承自Control。) Invalidate(Region) 使控件的指定区域无效(将其添加到控件的更新区域,下次绘制操作时将重新绘制更新区域),并向控件发送绘制消息。 (继承自Control。) Invalidate(Rectangle, Boolean) 使控件的指定区域无效(将其添加到控件的更新区域,下次绘制操作时将重新绘制更新区域),并向控件发送绘制消息。 还可以使分配给该控件的子控件无效。 (继承自 Control。) Invalidate(Region, Boolean) 使控件的指定区域无效(将其添加到控件的更新区域,下次绘制操作时将重新绘制更新区域),并向控件发送绘制消息。 还可以使分配给该控件的子控件无效。 (继承自 Control。) Invoke(Delegate) 在拥有此控件的基础窗口句柄的线程上执行指定的委托。 (继承自 Control。) Invoke(Delegate, array<Object>) 在拥有控件的基础窗口句柄的线程上,用指定的参数列表执行指定委托。 (继承自 Control。) InvokeGotFocus 为指定的控件引发 GotFocus 事件。 (继承自 Control。) InvokeLostFocus 为指定的控件引发 LostFocus 事件。 (继承自 Control。) InvokeOnClick 为指定的控件引发 Click 事件。 (继承自 Control。) InvokePaint 为指定的控件引发 Paint 事件。 (继承自 Control。) InvokePaintBackground 为指定的控件引发 PaintBackground 事件。 (继承自 Control。) IsInputChar 确定一个字符是否是控件可识别的输入字符。 (继承自 Control。) IsInputKey 处理特殊输入键,如Page Up、Page Down、Home 和End。 (重写 Control::IsInputKey(Keys)。) MemberwiseClone() 创建当前 Object 的浅表副本。 (继承自 Object。) MemberwiseClone(Boolean) 创建当前 MarshalByRefObject 对象的浅表副本。 (继承自 MarshalByRefObject。) NotifyInvalidate 基础结构。引发 Invalidated 事件,其中带有要使之无效的控件的指定区域。 (继承自 Control。) OnAutoSizeChanged 引发 AutoSizeChanged 事件。 (继承自 Control。) OnBackColorChanged 当任一属性发生变化时,该控件就会调用此方法。 继承控件可以重写此方法,以获取基础属性的属性更改通知。 继承控件必须调用base.propertyChanged。 (重写 Control::OnBackColorChanged(EventArgs)。) OnBackgroundImageChanged 引发 BackgroundImageChanged 事件。 (继承自 Control。) OnBackgroundImageLayoutChanged 引发 BackgroundImageLayoutChanged 事件。 (继承自 Control。) OnBindingContextChanged 引发 BindingContextChanged 事件。 (继承自 Control。) OnCausesValidationChanged 引发 CausesValidationChanged 事件。 (继承自 Control。) OnChangeUICues 引发 ChangeUICues 事件。 (继承自 Control。) OnClick 引发 Click 事件。 (继承自 Control。) OnClientSizeChanged 引发 ClientSizeChanged 事件。 (继承自 Control。) OnContextMenuChanged 引发 ContextMenuChanged 事件。 (继承自 Control。) OnContextMenuStripChanged 引发 ContextMenuStripChanged 事件。 (继承自 Control。) OnControlAdded 引发 ControlAdded 事件。 (继承自 Control。) OnControlRemoved 引发 ControlRemoved 事件。 (继承自 Control。) OnCreateControl 引发 CreateControl 方法。 (继承自 Control。) OnCursorChanged 引发 CursorChanged 事件。 (继承自 Control。) OnDockChanged 引发 DockChanged 事件。 (继承自 Control。) OnDoubleClick 引发 DoubleClick 事件。 (继承自 Control。) OnDragDrop 引发 DragDrop 事件。 (继承自 Control。) OnDragEnter 引发 DragEnter 事件。 (继承自 Control。) OnDragLeave 引发 DragLeave 事件。 (继承自 Control。) OnDragOver 引发 DragOver 事件。 (继承自 Control。) OnEnabledChanged 引发 EnabledChanged 事件。 (继承自 Control。) OnEnter 引发 Enter 事件。 (继承自 Control。) OnFontChanged 引发 FontChanged 事件。 (继承自 Control。) OnForeColorChanged 引发 ForeColorChanged 事件。 (继承自 Control。) OnGiveFeedback 引发 GiveFeedback 事件。 (继承自 Control。) OnGotFocus 引发 GotFocus 事件。 (继承自 Control。) OnHandleCreated 基础结构。请使用 Control::OnHandleCreated 方法。 (重写 Control::OnHandleCreated(EventArgs)。) OnHandleDestroyed 引发 HandleDestroyed 事件。 (继承自 Control。) OnHelpRequested 引发 HelpRequested 事件。 (继承自 Control。) OnImeModeChanged 引发 ImeModeChanged 事件。 (继承自 Control。) OnInvalidated 引发 Invalidated 事件。 (继承自 Control。) OnKeyDown 引发 KeyDown 事件。 (继承自 Control。) OnKeyPress 引发 KeyPress 事件。 (继承自 Control。) OnKeyUp 引发 KeyUp 事件。 (继承自 Control。) OnLayout 引发 Layout 事件。 (继承自 Control。) OnLeave 引发 Leave 事件。 (继承自 Control。) OnLocationChanged 引发 LocationChanged 事件。 (继承自 Control。) OnLostFocus 引发 LostFocus 事件。 (继承自 Control。) OnMarginChanged 引发 MarginChanged 事件。 (继承自 Control。) OnMouseCaptureChanged 引发 MouseCaptureChanged 事件。 (继承自 Control。) OnMouseClick 引发 MouseClick 事件。 (继承自 Control。) OnMouseDoubleClick 引发 MouseDoubleClick 事件。 (继承自 Control。) OnMouseDown 引发 MouseDown 事件。 (继承自 Control。) OnMouseEnter 引发 MouseEnter 事件。 (继承自 Control。) OnMouseHover 引发 MouseHover 事件。 (继承自 Control。) OnMouseLeave 引发 MouseLeave 事件。 (继承自 Control。) OnMouseMove 引发 MouseMove 事件。 (继承自 Control。) OnMouseUp 引发 MouseUp 事件。 (继承自 Control。) OnMouseWheel 引发 MouseWheel 事件。 (重写 Control::OnMouseWheel(MouseEventArgs)。) OnMove 引发 Move 事件。 (继承自 Control。) OnNotifyMessage 向控件通知Windows 消息。 (继承自 Control。) OnPaddingChanged 引发 PaddingChanged 事件。 (继承自 Control。) OnPaint 引发 Paint 事件。 (继承自 Control。) OnPaintBackground 绘制控件的背景。 (继承自 Control。) OnParentBackColorChanged 当控件容器的 BackColor 属性值更改时,将引发 BackColorChanged 事件。 (继承自 Control。) OnParentBackgroundImageChanged 当控件容器的 BackgroundImage 属性值更改时,将引发 BackgroundImageChanged 事件。 (继承自 Control。) OnParentBindingContextChanged 当控件容器的 BindingContext 属性值更改时,将引发 BindingContextChanged 事件。 (继承自 Control。) OnParentChanged 引发 ParentChanged 事件。 (继承自 Control。) OnParentCursorChanged 引发 CursorChanged 事件。 (继承自 Control。) OnParentEnabledChanged 当控件容器的 Enabled 属性值更改时,将引发 EnabledChanged 事件。 (继承自 Control。) OnParentFontChanged 当控件容器的 Font 属性值更改时,将引发 FontChanged 事件。 (继承自 Control。) OnParentForeColorChanged 当控件容器的 ForeColor 属性值更改时,将引发 ForeColorChanged 事件。 (继承自 Control。) OnParentRightToLeftChanged 当控件容器的 RightToLeft 属性值更改时,将引发 RightToLeftChanged 事件。 (继承自 Control。) OnParentVisibleChanged 当控件容器的 Visible 属性值更改时,将引发 VisibleChanged 事件。 (继承自 Control。) OnPreviewKeyDown 引发 PreviewKeyDown 事件。 (继承自 Control。) OnPrint 引发 Paint 事件。 (继承自 Control。) OnQueryContinueDrag 引发 QueryContinueDrag 事件。 (继承自 Control。) OnRegionChanged 引发 RegionChanged 事件。 (继承自 Control。) OnResize 引发 Resize 事件。 (继承自 Control。) OnRightToLeftChanged 引发 RightToLeftChanged 事件。 (继承自 Control。) OnRightToLeftLayoutChanged 引发 RightToLeftLayoutChanged 事件。 OnScroll 引发 Scroll 事件。 OnSizeChanged 引发 SizeChanged 事件。 (继承自 Control。) OnStyleChanged 引发 StyleChanged 事件。 (继承自 Control。) OnSystemColorsChanged 引发 Control::SystemColorsChanged 事件。 (重写 Control::OnSystemColorsChanged(EventArgs)。) OnTabIndexChanged 引发 TabIndexChanged 事件。 (继承自 Control。) OnTabStopChanged 引发 TabStopChanged 事件。 (继承自 Control。) OnTextChanged 引发 TextChanged 事件。 (继承自 Control。) OnValidated 引发 Validated 事件。 (继承自 Control。) OnValidating 引发 Validating 事件。 (继承自 Control。) OnValueChanged 基础结构。引发 ValueChanged 事件。 OnVisibleChanged 引发 VisibleChanged 事件。 (继承自 Control。) PerformLayout() 强制控件将布局逻辑应用于其所有子控件。 (继承自 Control。) PerformLayout(Control, String) 强制控件将布局逻辑应用于其所有子控件。 (继承自 Control。) PointToClient 将指定屏幕点的位置计算成工作区坐标。 (继承自 Control。) PointToScreen 将指定工作区点的位置计算成屏幕坐标。 (继承自 Control。) PreProcessControlMessage 在调度键盘或输入消息之前,在消息循环内对它们进行预处理。 (继承自 Control。) PreProcessMessage 在调度键盘或输入消息之前,在消息循环内对它们进行预处理。 (继承自 Control。) ProcessCmdKey 处理命令键。 (继承自 Control。) ProcessDialogChar 处理对话框字符。 (继承自 Control。) ProcessDialogKey 处理对话框键。 (继承自 Control。) ProcessKeyEventArgs 处理键消息并生成适当的控件事件。 (继承自 Control。) ProcessKeyMessage 处理键盘消息。 (继承自 Control。) ProcessKeyPreview 预览键盘消息。 (继承自 Control。) ProcessMnemonic 处理助记键字符。 (继承自 Control。) RaiseDragEvent 基础结构。引发适当的拖动事件。 (继承自 Control。) RaiseKeyEvent 基础结构。引发适当的键事件。 (继承自 Control。) RaiseMouseEvent 基础结构。引发适当的鼠标事件。 (继承自 Control。) RaisePaintEvent 基础结构。引发适当的绘画事件。 (继承自 Control。) RecreateHandle 强制为控件重新创建句柄。 (继承自 Control。) RectangleToClient 计算指定屏幕矩形的大小和位置(以工作区坐标表示)。 (继承自 Control。) RectangleToScreen 计算指定工作区矩形的大小和位置(以屏幕坐标表示)。 (继承自 Control。) Refresh 强制控件使其工作区无效并立即重绘自己和任何子控件。 (继承自 Control。) ResetBackColor 将 BackColor 属性重置为其默认值。 (继承自 Control。) ResetBindings 使绑定到 BindingSource 的控件重新读取列表中的所有项,并刷新这些项的显示值。 (继承自 Control。) ResetCursor 将 Cursor 属性重置为其默认值。 (继承自 Control。) ResetFont 将 Font 属性重置为其默认值。 (继承自 Control。) ResetForeColor 将 ForeColor 属性重置为其默认值。 (继承自 Control。) ResetImeMode 将 ImeMode 属性重置为其默认值。 (继承自 Control。) ResetMouseEventArgs 基础结构。重置控件以处理 MouseLeave 事件。 (继承自 Control。) ResetRightToLeft 将 RightToLeft 属性重置为其默认值。 (继承自 Control。) ResetText 将 Text 属性重置为其默认值。 (继承自 Control。) ResumeLayout() 恢复正常的布局逻辑。 (继承自 Control。) ResumeLayout(Boolean) 恢复正常的布局逻辑,可以选择强制对挂起的布局请求立即进行布局。 (继承自 Control。) RtlTranslateAlignment(ContentAlignment) 将指定的 ContentAlignment 转换为相应的 ContentAlignment 以支持从右向左的文本。 (继承自 Control。) RtlTranslateAlignment(HorizontalAlignment) 将指定的 HorizontalAlignment 转换为相应的 HorizontalAlignment 以支持从右向左的文本。 (继承自 Control。) RtlTranslateAlignment(LeftRightAlignment) 将指定的 LeftRightAlignment 转换为相应的 LeftRightAlignment 以支持从右向左的文本。 (继承自 Control。) RtlTranslateContent 将指定的 ContentAlignment 转换为相应的 ContentAlignment 以支持从右向左的文本。 (继承自 Control。) RtlTranslateHorizontal 将指定的 HorizontalAlignment 转换为相应的 HorizontalAlignment 以支持从右向左的文本。 (继承自 Control。) RtlTranslateLeftRight 将指定的 LeftRightAlignment 转换为相应的 LeftRightAlignment 以支持从右向左的文本。 (继承自 Control。) Scale(Single) 已过时。缩放控件和任何子控件。 (继承自 Control。) Scale(SizeF) 按指定的比例因子缩放控件和所有子控件。 (继承自 Control。) Scale(Single, Single) 已过时。缩放整个控件和任何子控件。 (继承自 Control。) ScaleControl 缩放控件的位置、大小、空白和边距。 (继承自 Control。) ScaleCore 基础结构。此方法与此类无关。 (继承自 Control。) Select() 激活控件。 (继承自 Control。) Select(Boolean, Boolean) 激活子控件。 还可以指定从中选择控件的Tab 键顺序的方向。 (继承自 Control。) SelectNextControl 激活下一个控件。 (继承自 Control。) SendToBack 将控件发送到Z 顺序的后面。 (继承自 Control。) SetAutoSizeMode 设置一个值,该值指示当启用控件的 AutoSize 属性时控件的行为方式。 (继承自 Control。) SetBounds(Int32, Int32, Int32, Int32) 将控件的边界设置为指定位置和大小。 (继承自 Control。) SetBounds(Int32, Int32, Int32, Int32, BoundsSpecified) 将控件的指定边界设置为指定位置和大小。 (继承自 Control。) SetBoundsCore 重写Control.setBoundsCore 以强制进行autoSize。 (重写 Control::SetBoundsCore(Int32, Int32, Int32, Int32, BoundsSpecified)。) SetClientSizeCore 设置控件的工作区的大小。 (继承自 Control。) SetRange 设置 TrackBar 的最小值和最大值。 SetStyle 将指定的 ControlStyles 标志设置为 true 或 false。 (继承自 Control。) SetTopLevel 将控件设置为顶级控件。 (继承自 Control。) SetVisibleCore 将控件设置为指定的可见状态。 (继承自 Control。) Show 向用户显示控件。 (继承自 Control。) SizeFromClientSize 确定整个控件(从控件工作区的高度和宽度起计算)的大小。 (继承自 Control。) SuspendLayout 临时挂起控件的布局逻辑。 (继承自 Control。) ToString 基础结构。返回表示 TrackBar 控件的字符串。 (重写 Component::ToString()。) Update 使控件重绘其工作区内的无效区域。 (继承自 Control。) UpdateBounds() 用当前大小和位置更新控件的边界。 (继承自 Control。) UpdateBounds(Int32, Int32, Int32, Int32) 用指定大小和位置更新控件的边界。 (继承自 Control。) UpdateBounds(Int32, Int32, Int32, Int32, Int32, Int32) 用指定大小、位置和工作区的大小更新控件的边界。 (继承自 Control。) UpdateStyles 强制将分配的样式重新应用到控件。 (继承自 Control。) UpdateZOrder 按控件的父级的Z 顺序更新控件。 (继承自 Control。) WndProc 基础结构。重写 WndProc 方法。 (重写 Control::WndProc(Message%)。)
用于输入值范围的组件(类似于 trackbar)
【中文标题】用于输入值范围的组件(类似于 trackbar)【英文标题】:Component (similar to trackbar) to enter a range of values 【发布时间】:2011-05-22 05:20:27 【问题描述】:我需要一个用于输入范围的组件。我在思考带有两个标记的轨迹栏。是否有用于此目的或可以轻松模拟它的“本机 Delphi”组件?
【问题讨论】:
注意:主题中有一个错误:如果您使用主题/皮肤,SelStart/SelEnd 标记将不会出现。 【参考方案1】:除了Andreas' 不错的答案和组件,特此另一个slider component 能够:
显示范围, 显示该范围内的过滤范围, 拖动把手和绿色条, 双击键盘输入的手柄, 在键盘输入的握把上按一下, 显示不同的数据类型, 将值限制为步长。(来源:NLDelphi.com)
【讨论】:
【参考方案2】:我过了几分钟写了这个:
unit RangeSelector;
interface
uses
SysUtils, Windows, Messages, Graphics, Classes, Controls, UxTheme, Dialogs;
type
TRangeSelectorState = (rssNormal, rssDisabled, rssThumb1Hover, rssThumb1Down, rssThumb2Hover, rssThumb2Down, rssBlockHover, rssBlockDown);
TRangeSelector = class(TCustomControl)
private
Private declarations
FBuffer: TBitmap;
FMin,
FMax,
FSelStart,
FSelEnd: real;
FTrackPos,
FSelPos,
FThumbPos1,
FThumbPos2: TRect;
FState: TRangeSelectorState;
FDown: boolean;
FPrevX,
FPrevY: integer;
FOnChange: TNotifyEvent;
FDblClicked: Boolean;
FThumbSize: TSize;
procedure SwapBuffers;
procedure SetMin(Min: real);
procedure SetMax(Max: real);
procedure SetSelStart(SelStart: real);
procedure SetSelEnd(SelEnd: real);
function GetSelLength: real;
procedure UpdateMetrics;
procedure SetState(State: TRangeSelectorState);
function DeduceState(const X, Y: integer; const Down: boolean): TRangeSelectorState;
function BarWidth: integer; inline;
function LogicalToScreen(const LogicalPos: real): real;
procedure UpdateThumbMetrics;
protected
Protected declarations
procedure Paint; override;
procedure WndProc(var Message: TMessage); override;
procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X: Integer; Y: Integer); override;
procedure MouseMove(Shift: TShiftState; X: Integer; Y: Integer); override;
procedure MouseUp(Button: TMouseButton; Shift: TShiftState; X: Integer; Y: Integer); override;
procedure MouseLeave(Sender: TObject);
procedure DblClick; override;
public
Public declarations
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
published
Published declarations
property Anchors;
property Min: real read FMin write SetMin;
property Max: real read FMax write SetMax;
property SelStart: real read FSelStart write SetSelStart;
property SelEnd: real read FSelEnd write SetSelEnd;
property SelLength: real read GetSelLength;
property Enabled;
property Visible;
property OnChange: TNotifyEvent read FOnChange write FOnChange;
end;
procedure Register;
implementation
uses Math;
procedure Register;
begin
RegisterComponents('Rejbrand 2009', [TRangeSelector]);
end;
function IsIntInInterval(x, xmin, xmax: integer): boolean; inline;
begin
IsIntInInterval := (xmin <= x) and (x <= xmax);
end;
function PointInRect(const X, Y: integer; const Rect: TRect): boolean; inline;
begin
PointInRect := IsIntInInterval(X, Rect.Left, Rect.Right) and
IsIntInInterval(Y, Rect.Top, Rect.Bottom);
end;
function IsRealInInterval(x, xmin, xmax: extended): boolean; inline;
begin
IsRealInInterval := (xmin <= x) and (x <= xmax);
end;
TRangeSelector
function TRangeSelector.BarWidth: integer;
begin
result := Width - 2*FThumbSize.cx;
end;
constructor TRangeSelector.Create(AOwner: TComponent);
begin
inherited;
FBuffer := TBitmap.Create;
FMin := 0;
FMax := 100;
FSelStart := 20;
FSelEnd := 80;
FDown := false;
FPrevX := -1;
FPrevY := -1;
FDblClicked := false;
end;
procedure TRangeSelector.UpdateThumbMetrics;
var
theme: HTHEME;
const
DEFAULT_THUMB_SIZE: TSize = (cx: 12; cy: 20);
begin
FThumbSize := DEFAULT_THUMB_SIZE;
if UxTheme.UseThemes then
begin
theme := OpenThemeData(Handle, 'TRACKBAR');
if theme <> 0 then
try
GetThemePartSize(theme, FBuffer.Handle, TKP_THUMBTOP, TUTS_NORMAL, nil, TS_DRAW, FThumbSize);
finally
CloseThemeData(theme);
end;
end;
end;
destructor TRangeSelector.Destroy;
begin
FBuffer.Free;
inherited;
end;
function TRangeSelector.GetSelLength: real;
begin
result := FSelEnd - FSelStart;
end;
function TRangeSelector.LogicalToScreen(const LogicalPos: real): real;
begin
result := FThumbSize.cx + BarWidth * (LogicalPos - FMin) / (FMax - FMin)
end;
procedure TRangeSelector.DblClick;
var
str: string;
begin
FDblClicked := true;
case FState of
rssThumb1Hover, rssThumb1Down:
begin
str := FloatToStr(FSelStart);
if InputQuery('Initial value', 'Enter new initial value:', str) then
SetSelStart(StrToFloat(str));
end;
rssThumb2Hover, rssThumb2Down:
begin
str := FloatToStr(FSelEnd);
if InputQuery('Final value', 'Enter new final value:', str) then
SetSelEnd(StrToFloat(str));
end;
end;
end;
function TRangeSelector.DeduceState(const X, Y: integer; const Down: boolean): TRangeSelectorState;
begin
result := rssNormal;
if not Enabled then
Exit(rssDisabled);
if PointInRect(X, Y, FThumbPos1) then
if Down then
result := rssThumb1Down
else
result := rssThumb1Hover
else if PointInRect(X, Y, FThumbPos2) then
if Down then
result := rssThumb2Down
else
result := rssThumb2Hover
else if PointInRect(X, Y, FSelPos) then
if Down then
result := rssBlockDown
else
result := rssBlockHover;
end;
procedure TRangeSelector.MouseDown(Button: TMouseButton; Shift: TShiftState; X,
Y: Integer);
begin
inherited;
if FDblClicked then
begin
FDblClicked := false;
Exit;
end;
FDown := Button = mbLeft;
SetState(DeduceState(X, Y, FDown));
end;
procedure TRangeSelector.MouseLeave(Sender: TObject);
begin
if Enabled then
SetState(rssNormal)
else
SetState(rssDisabled);
end;
procedure TRangeSelector.MouseMove(Shift: TShiftState; X, Y: Integer);
begin
inherited;
if FState = rssThumb1Down then
SetSelStart(FSelStart + (X - FPrevX) * (FMax - FMin) / BarWidth)
else if FState = rssThumb2Down then
SetSelEnd(FSelEnd + (X - FPrevX) * (FMax - FMin) / BarWidth)
else if FState = rssBlockDown then
begin
if IsRealInInterval(FSelStart + (X - FPrevX) * (FMax - FMin) / BarWidth, FMin, FMax) and
IsRealInInterval(FSelEnd + (X - FPrevX) * (FMax - FMin) / BarWidth, FMin, FMax) then
begin
SetSelStart(FSelStart + (X - FPrevX) * (FMax - FMin) / BarWidth);
SetSelEnd(FSelEnd + (X - FPrevX) * (FMax - FMin) / BarWidth);
end;
end
else
SetState(DeduceState(X, Y, FDown));
FPrevX := X;
FPrevY := Y;
end;
procedure TRangeSelector.MouseUp(Button: TMouseButton; Shift: TShiftState; X,
Y: Integer);
begin
inherited;
FDown := false;
SetState(DeduceState(X, Y, FDown));
end;
procedure TRangeSelector.Paint;
var
theme: HTHEME;
begin
inherited;
FBuffer.Canvas.Brush.Color := Color;
FBuffer.Canvas.FillRect(ClientRect);
if UxTheme.UseThemes then
begin
theme := OpenThemeData(Handle, 'TRACKBAR');
if theme <> 0 then
try
DrawThemeBackground(theme, FBuffer.Canvas.Handle, TKP_TRACK, TRS_NORMAL, FTrackPos, nil);
case FState of
rssDisabled:
DrawThemeBackground(theme, FBuffer.Canvas.Handle, TKP_THUMB, TUS_DISABLED, FSelPos, nil);
rssBlockHover:
DrawThemeBackground(theme, FBuffer.Canvas.Handle, TKP_THUMB, TUS_HOT, FSelPos, nil);
rssBlockDown:
DrawThemeBackground(theme, FBuffer.Canvas.Handle, TKP_THUMB, TUS_PRESSED, FSelPos, nil);
else
DrawThemeBackground(theme, FBuffer.Canvas.Handle, TKP_THUMB, TUS_NORMAL, FSelPos, nil);
end;
case FState of
rssDisabled:
DrawThemeBackground(theme, FBuffer.Canvas.Handle, TKP_THUMBBOTTOM, TUBS_DISABLED, FThumbPos1, nil);
rssThumb1Hover:
DrawThemeBackground(theme, FBuffer.Canvas.Handle, TKP_THUMBBOTTOM, TUBS_HOT, FThumbPos1, nil);
rssThumb1Down:
DrawThemeBackground(theme, FBuffer.Canvas.Handle, TKP_THUMBBOTTOM, TUBS_PRESSED, FThumbPos1, nil);
else
DrawThemeBackground(theme, FBuffer.Canvas.Handle, TKP_THUMBBOTTOM, TUBS_NORMAL, FThumbPos1, nil);
end;
case FState of
rssDisabled:
DrawThemeBackground(theme, FBuffer.Canvas.Handle, TKP_THUMBTOP, TUTS_DISABLED, FThumbPos2, nil);
rssThumb2Hover:
DrawThemeBackground(theme, FBuffer.Canvas.Handle, TKP_THUMBTOP, TUTS_HOT, FThumbPos2, nil);
rssThumb2Down:
DrawThemeBackground(theme, FBuffer.Canvas.Handle, TKP_THUMBTOP, TUTS_PRESSED, FThumbPos2, nil);
else
DrawThemeBackground(theme, FBuffer.Canvas.Handle, TKP_THUMBTOP, TUTS_NORMAL, FThumbPos2, nil);
end;
finally
CloseThemeData(theme);
end;
end
else
begin
DrawEdge(FBuffer.Canvas.Handle, FTrackPos, EDGE_SUNKEN, BF_RECT);
FBuffer.Canvas.Brush.Color := clHighlight;
FBuffer.Canvas.FillRect(FSelPos);
case FState of
rssDisabled:
DrawEdge(FBuffer.Canvas.Handle, FSelPos, EDGE_BUMP, BF_RECT or BF_MONO);
rssBlockHover:
DrawEdge(FBuffer.Canvas.Handle, FSelPos, EDGE_RAISED, BF_RECT);
rssBlockDown:
DrawEdge(FBuffer.Canvas.Handle, FSelPos, EDGE_SUNKEN, BF_RECT);
else
DrawEdge(FBuffer.Canvas.Handle, FSelPos, EDGE_ETCHED, BF_RECT);
end;
case FState of
rssDisabled:
DrawEdge(FBuffer.Canvas.Handle, FThumbPos1, EDGE_BUMP, BF_RECT or BF_MONO);
rssThumb1Hover:
DrawEdge(FBuffer.Canvas.Handle, FThumbPos1, EDGE_RAISED, BF_RECT);
rssThumb1Down:
DrawEdge(FBuffer.Canvas.Handle, FThumbPos1, EDGE_SUNKEN, BF_RECT);
else
DrawEdge(FBuffer.Canvas.Handle, FThumbPos1, EDGE_ETCHED, BF_RECT);
end;
case FState of
rssDisabled:
DrawEdge(FBuffer.Canvas.Handle, FThumbPos2, EDGE_BUMP, BF_RECT or BF_MONO);
rssThumb2Hover:
DrawEdge(FBuffer.Canvas.Handle, FThumbPos2, EDGE_RAISED, BF_RECT);
rssThumb2Down:
DrawEdge(FBuffer.Canvas.Handle, FThumbPos2, EDGE_SUNKEN, BF_RECT);
else
DrawEdge(FBuffer.Canvas.Handle, FThumbPos2, EDGE_ETCHED, BF_RECT);
end;
end;
SwapBuffers;
end;
procedure TRangeSelector.UpdateMetrics;
begin
UpdateThumbMetrics;
FBuffer.SetSize(Width, Height);
FTrackPos := Rect(FThumbSize.cx, FThumbSize.cy + 2, Width - FThumbSize.cx, Height - FThumbSize.cy - 2);
FSelPos := Rect(round(LogicalToScreen(FSelStart)),
FTrackPos.Top,
round(LogicalToScreen(FSelEnd)),
FTrackPos.Bottom);
with FThumbPos1 do
begin
Top := 0;
Left := round(LogicalToScreen(FSelStart) - FThumbSize.cx / 2);
Right := Left + FThumbSize.cx;
Bottom := Top + FThumbSize.cy;
end;
with FThumbPos2 do
begin
Top := Self.Height - FThumbSize.cy;
Left := round(LogicalToScreen(FSelEnd) - FThumbSize.cx / 2);
Right := Left + FThumbSize.cx;
Bottom := Top + FThumbSize.cy;
end;
end;
procedure TRangeSelector.WndProc(var Message: TMessage);
begin
inherited;
case Message.Msg of
WM_SIZE:
UpdateMetrics;
end;
end;
procedure TRangeSelector.SetMax(Max: real);
begin
if FMax <> Max then
begin
FMax := Max;
UpdateMetrics;
Paint;
end;
end;
procedure TRangeSelector.SetMin(Min: real);
begin
if FMin <> Min then
begin
FMin := Min;
UpdateMetrics;
Paint;
end;
end;
procedure TRangeSelector.SetSelEnd(SelEnd: real);
begin
if (FSelEnd <> SelEnd) and IsRealInInterval(SelEnd, FMin, FMax) then
begin
FSelEnd := SelEnd;
if FSelStart > FSelEnd then
FSelStart := FSelEnd;
UpdateMetrics;
Paint;
if Assigned(FOnChange) then
FOnChange(Self);
end;
end;
procedure TRangeSelector.SetSelStart(SelStart: real);
begin
if (FSelStart <> SelStart) and IsRealInInterval(SelStart, FMin, FMax) then
begin
FSelStart := SelStart;
if FSelStart > FSelEnd then
FSelEnd := FSelStart;
UpdateMetrics;
Paint;
if Assigned(FOnChange) then
FOnChange(Self);
end;
end;
procedure TRangeSelector.SetState(State: TRangeSelectorState);
begin
if State <> FState then
begin
FState := State;
Paint;
end;
end;
procedure TRangeSelector.SwapBuffers;
begin
BitBlt(Canvas.Handle,
0,
0,
Width,
Height,
FBuffer.Canvas.Handle,
0,
0,
SRCCOPY);
end;
end.
还有一些地方需要改进,例如 1) 添加键盘界面,2) 使标记的显示成为可选并添加更多外观设置,4) 对齐整数网格,以及 3) 添加通过数字输入值的能力尝试双击拇指!
该控件在启用和不启用视觉主题的情况下都可以使用,并且是完全双缓冲的。
【讨论】:
一个经典的 SO 成员:无私和谦虚:-) 我们如何添加 VCL 样式支持?谢谢 @SveinBringsli - 同意。我总是说,在我看来,Andreas R 是最好的 Delphi SO 成员!谢谢安德烈亚斯! 嗨。我尝试了这个组件,它真的很好用而且很漂亮。然而,对于那些在他们的应用程序中使用皮肤的小警告:它不会应用皮肤的颜色。例如,在 Auric 皮肤(即深色皮肤)上,该组件仍然是白色的。 @InTheNameOfScience:确实如此。当我写这个答案时,我什至不认为 VCL 样式是发明的!此外,我个人不喜欢 VCL 样式,因此您可能永远不会看到我创建的任何明确支持 VCL 样式的控件。【参考方案3】:我建议进行一对旋转编辑。用户可以根据需要单击上/下,但大多数人只想输入他们的值:
【讨论】:
【参考方案4】:TTrackBar 有 SelStart、SelEnd 和 ShowSelRange。然而,它们似乎没有多大用处 - 如果主题和 AFAICT 用户无法移动 Sel* 标记,它们几乎是不可见的。
【讨论】:
【参考方案5】:我不知道这样的事情,虽然可能有这样的事情。我会担心将其中一个标记移到另一个标记上的可用性问题。当我在我的应用中询问范围时,我只是要求用户输入数字。
【讨论】:
以上是关于TrackBar 类的方法的主要内容,如果未能解决你的问题,请参考以下文章
TrackBar属性OrientationShowSelRange