Delphi:使 window 可从组件拖动
Delphi: Make the window draggable from a component
我有一个没有边框的自定义表单(自定义形状和透明度)(BorderStyle: bsNone
)。它有一个背景图像,一个普通的 TImage 组件。它希望表单可以从 TImage 中拖动。那可能吗?我正在使用 Lazarus 1.2.6(FPC 版本:2.6.4)。
这是我的自定义表单在空桌面上的样子:Image.
假设您正在使用 windows,这是执行您所要求的一般方法:
uses
Windows;
type
TForm1 = class(TForm)
private
procedure WMNCHitTest(var Msg: TWMNCHitTest); message WM_NCHITTEST;
end;
procedure TForm1.WMNCHitTest(var Msg: TWMNCHitTest);
begin
Msg.Result := HTCAPTION
end;
这是一个跨平台的解决方案:
type
TForm1 = class(TForm)
Image1: TImage;
procedure Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure Image1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var PX, PY: Integer;
MouseIsDown: Boolean;
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if Button = mbLeft then begin
MouseIsDown := True;
PX := X;
PY := Y;
end;
end;
procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if MouseIsDown then begin
SetBounds(Form1.Left + (X - PX), Form1.Top + (Y - PY), Form1.Width, Form1.Height);
end;
end;
procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
MouseIsDown:=False;
end;
拖动 TImage 将导致拖动 Form。
我有一个没有边框的自定义表单(自定义形状和透明度)(BorderStyle: bsNone
)。它有一个背景图像,一个普通的 TImage 组件。它希望表单可以从 TImage 中拖动。那可能吗?我正在使用 Lazarus 1.2.6(FPC 版本:2.6.4)。
这是我的自定义表单在空桌面上的样子:Image.
假设您正在使用 windows,这是执行您所要求的一般方法:
uses
Windows;
type
TForm1 = class(TForm)
private
procedure WMNCHitTest(var Msg: TWMNCHitTest); message WM_NCHITTEST;
end;
procedure TForm1.WMNCHitTest(var Msg: TWMNCHitTest);
begin
Msg.Result := HTCAPTION
end;
这是一个跨平台的解决方案:
type
TForm1 = class(TForm)
Image1: TImage;
procedure Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure Image1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var PX, PY: Integer;
MouseIsDown: Boolean;
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if Button = mbLeft then begin
MouseIsDown := True;
PX := X;
PY := Y;
end;
end;
procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if MouseIsDown then begin
SetBounds(Form1.Left + (X - PX), Form1.Top + (Y - PY), Form1.Width, Form1.Height);
end;
end;
procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
MouseIsDown:=False;
end;
拖动 TImage 将导致拖动 Form。