【问题标题】:delphi - Scroll Horizontally on Mouse Movement smoothlydelphi - 平滑地在鼠标移动时水平滚动
【发布时间】:2017-11-15 07:16:18
【问题描述】:

我有一个带有水平滚动条的表单,但我想通过在表单上使用鼠标移动(水平)作为滚动方式来删除滚动条。 我希望随着鼠标的移动,我的表单将滚动但没有滞后且平滑,当我到达终点时它会停止滚动。 因此,如果有人可以帮助我,那将是一个巨大的帮助。 提前致谢。

【问题讨论】:

  • 滚动条是显式使用的,还是其他控件的一部分?你能举一个小例子来说明你目前在做什么吗?
  • 滚动条是表单本身的一部分,我的表单有一些额外的元素,不滚动就看不到
  • 很容易做到except来隐藏滚动条。你死心塌地吗?
  • 我可以通过 Tscrollbar.visible 隐藏
  • 很遗憾这不起作用。是的,您可以隐藏滚动条,但是尽管文档说了什么,滚动条完全停止工作,使得以编程方式移动滚动条的简单解决方案不可行。文档说这应该可以工作,但在 10.1 Berlin 上肯定不行。它可能在早期版本上。如果您想尝试,我会发布。

标签: user-interface delphi scroll scrollbar freepascal


【解决方案1】:

只要您不隐藏滚动条,这会在 10.1 Berlin 上很好地移动屏幕。文档建议如果您隐藏滚动条它应该可以工作,所以也许在早期版本的 Delphi 上它会。

使用了 OnMouseDown、OnMouseMove 和 OnMouseUp,以及 3 个局部变量。

unit Unit10;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, System.StrUtils, Vcl.Mask;

type
  TForm10 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Button1: TButton;
    procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure FormMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
  private
    { Private declarations }
    fIsDown : boolean;
    fX, fY : integer;
  public
    { Public declarations }
  end;

var
  Form10: TForm10;

implementation

{$R *.dfm}

procedure TForm10.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if Shift = [ssLeft] then  // if ONLY left down
  begin
    // Save co-ordinates
    fIsDown := TRUE;
    fX := X;
    fY := Y;
  end;
end;

procedure TForm10.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  if Shift = [ssLeft] then  // if ONLY left down
  begin
    if fIsDown then
    begin
      HorzScrollBar.Position := HorzScrollBar.Position + fX - X;
      VertScrollBar.Position := VertScrollBar.Position + fY - Y;
    end
    else
    begin
      fIsDown := TRUE;
    end;
    fX := X;
    fY := Y;
  end
  else
  begin
    fIsDown := FALSE;
  end;
end;

procedure TForm10.FormMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  fIsDown := FALSE; // regardless of shift state!
end;

end.

请告诉我们隐藏滚动条是否适用于 XE8,因为这对未来的读者很有用。

【讨论】:

  • 如果您将Tracking 属性设置为True 而无需任何额外代码,则滚动条可以在拖动滚动拇指的同时移动内容。此代码将在拖动不可聚焦的客户区时滚动表单内容。如果这就是 OP 想要的,也许是时候澄清一下这个问题了。
  • 对于一些你可以称之为真正的“视觉平滑滚动”我会关注this post
  • @维多利亚。这确实提供了“视觉上良好的滚动”,并且与链接中的 3 个解决方案中的第一个没有什么不同(TForm 和 TScrollingWindow”具有相同的祖先负责滚动。第 2 和第 3 形式是很好的选择但需要额外的代码以确保您不会走得太远。使用计时器不会提高响应速度。
  • 怎么样?您在此处提供的内容仅允许您通过客户端不可聚焦的矩形拖动内容。该链接中的代码提供了一个很酷的动画:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多