请问如何在窗体内某区域按住鼠标来移动整个窗体?(50分)

  • 主题发起人 主题发起人 bingyung
  • 开始时间 开始时间
B

bingyung

Unregistered / Unconfirmed
GUEST, unregistred user!
Delphi中,如何在窗体内某区域按住鼠标来移动整个窗体?
 
在鼠标被按下的控件的鼠标Down事件中填入如下代码:
begin
ReleaseCapture;
Perform(WM_SYSCOMMAND,$F012,0);
end;
 
处理鼠标onmousedown事件
 
// 在 X(10,50) Y(10,50) 这个区域内可以移动窗体。
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if (Sender is TForm) and (X >= 10) and (X <= 50) and (Y >= 10) and (Y <= 50) then
begin
ReleaseCapture;
TForm(Sender).Perform(WM_SYSCOMMAND,$F012,0);
end;
end;

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
Caption := 'X=' + IntToStr(X) + ' Y='+IntToStr(Y);
end;
 
interface
private
procedure wmnchittest(var msg:twmnchittest);message wm_nchittest;
public
end;
implementation
{$R *.DFM}
procedure TFormRsw.wmnchittest(var msg:twmnchittest);
begin
inherited;
if (htclient=msg.result) then msg.result:=htcaption;
end;
 
可以利用Perform函数来实现。以下的程序可以在(20,20,200,200)的区域内
拖动窗口
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
const
SC_DragMove=$F012;
begin
if(((20<x)and(x<200))and
((20<y)and(y<200))) then
begin
ReleaseCapture;
(Sender as TWinControl).PerForm(WM_SysCommand,SC_DragMove,0);
end;
end;
 
在需要移动的控件的onMouseDown事件中添加一下代码:
if Button = mbLeft then
begin
ReleaseCapture;
Perform(WM_SYSCOMMAND, $F012, 0);
end;
 
后退
顶部