delphi - 在鼠标移动时水平滚动平滑
delphi - Scroll Horizontally on Mouse Movement smoothly
我有一个带有水平滚动条的表单,但我想通过在表单上使用鼠标移动(水平)来删除滚动条作为一种滚动方式。
我希望随着鼠标的移动,我的表单将滚动但没有滞后且流畅,当我到达终点时它停止滚动。
因此,如果有人可以帮助我,那将是一个巨大的帮助。
提前致谢。
只要您不隐藏滚动条,这会使屏幕在 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 上有效,请告诉我们,因为这对未来的读者有用。
我有一个带有水平滚动条的表单,但我想通过在表单上使用鼠标移动(水平)来删除滚动条作为一种滚动方式。 我希望随着鼠标的移动,我的表单将滚动但没有滞后且流畅,当我到达终点时它停止滚动。 因此,如果有人可以帮助我,那将是一个巨大的帮助。 提前致谢。
只要您不隐藏滚动条,这会使屏幕在 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 上有效,请告诉我们,因为这对未来的读者有用。