实现已生成组件的拖动

Perform(Msg: Cardinal; WParam: WPARAM; LParam: LPARAM): LRESULT; overload;

其中Msg用WM_SYSCOMMAND

WParam用SC_SIZE OR 9

LParam用0

就可以实现已生成组件的拖动。

1
2
3
4
5
6
procedure TForm1.Button1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
    ReleaseCapture;
    Button1.Perform(WM_SYSCOMMAND,SC_SIZE OR 9,0);
end;

很神奇吧,可见windows消息的强大,下面把WM_SYSCOMMAND消息命令整理一下:

SC_CLOSE 关闭窗口

SC_HOTKEY Activate the window associated with the application-specified hot key.

SC_HSCROLL Scroll horizontally. SC_KEYMENU Retrieve a menu through a keystroke.

SC_MAXIMIZE 最大化窗口 SC_MINIMIZE 最小化窗口.

SC_MOUSEMENU Retrieve a menu through a mouse click.

SC_MOVE Move the window.

SC_NEXTWINDOW Move to the next window.

SC_PREVWINDOW Move to the previous window.

SC_RESTORE Save the previous coordinates (checkpoint).

SC_SCREENSAVE 激活屏幕保护程序.

SC_SIZE Size the window.

SC_TASKLIST 激活开始菜单.

SC_VSCROLL Scroll vertically.

SC_MONITORPOWER 关闭显示器(LPARAM为非0参数)

SC_SEPARATOR SC_CONTEXTHELP 显示帮助

SC_DEFAULT SC_SIZE = $F000

SC_MOVE = $F010

SC_MINIMIZE = $F020

SC_MAXIMIZE = $F030

SC_NEXTWINDOW = $F040

SC_PREVWINDOW = $F050

SC_CLOSE = $F060

SC_VSCROLL = $F070

SC_HSCROLL = $F080

SC_MOUSEMENU = $F090

SC_KEYMENU = $F100

SC_ARRANGE = $F110

SC_RESTORE = $F120

SC_TASKLIST = $F130

SC_SCREENSAVE = $F140

SC_HOTKEY = $F150

SC_DEFAULT = $F160

SC_MONITORPOWER = $F170

SC_CONTEXTHELP = $F180

SC_SEPARATOR = $F00F

有的时候我们看到一些这里没有的命令,比如用鼠标拖动控件时用的panel1.Perform(WM_SYSCOMMAND, $F012, 0);这个$F012这个命令在定义里没有,其实它是SC_MOVE or 2的结果,微软的文档中提到WM_SYSCOMMAND命令中wParam的值的低4位值是保留的。

举例说明: 在Form的MouseDown事件里写如下代码

ReleaseCapture;

Perform(WM_SYSCOMMAND, SC_SIZE OR 1, 0);// Left

Perform(WM_SYSCOMMAND, SC_SIZE OR 2, 0);// Right

Perform(WM_SYSCOMMAND, SC_SIZE OR 3, 0); // Top

Perform(WM_SYSCOMMAND, SC_SIZE OR 4, 0); // left-top

Perform(WM_SYSCOMMAND, SC_SIZE OR 5, 0);// Right-top

Perform(WM_SYSCOMMAND, SC_SIZE OR 6, 0);// bottom

Perform(WM_SYSCOMMAND, SC_SIZE OR 7, 0); // left-bottom

Perform(WM_SYSCOMMAND, SC_SIZE OR 8, 0); // right-bottom

ReleaseCapture

  函数功能:该函数从当前线程中的窗口释放鼠标捕获,并恢复通常的鼠标输入处理。捕获鼠标的窗口接收所有的鼠标输入(无论光标的位置在哪里),除非点击鼠标键时,光标热点在另一个线程的窗口中。

  函数原型:BOOL ReleaseCapture(VOlD)

  参数:无。

  返回值:如果函数调用成功,返回非零值;如果函数调用失败,返回值是零。若想获得更多的错误信息,请调用GetlastError函数。

  备注:应用程序在调用函数SetCaPture之后调用此函数。

  Windows:调用ReleaseCapture会引起失去鼠标捕获的窗日接收一个WM_CAPTURECHANGED消息。

原文地址:https://www.cnblogs.com/leonkin/p/3183227.html