方法三:
直接向窗体发送一条“wm_SysCommand”消息,需要使用未归档的“sc_DragMove”标志,定义如下:
const
sc_DragMove:LongInt=$F012;
我们只能向TWinControl派生组件发送该消息,而且只能响应鼠标按下事件,因为系统会在此时捕获鼠标(当释放鼠标键时,拖动操作是没有意义的)。
例程如下:
const
sc_DragMove:longint=$F012;
implementation
{$R *.DFM}
procedure TForm1.FormMouseDown
(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X
Y: Integer);
begin
if ssCtrl in Shift then
//判断“Ctrl”键是否按下
Begin
ReleaseCapture;
//释放鼠标事件的对象
(Sender as TWinControl).PerForm(wm_SysCommand
sc_DragMove
0);
//发送消息
end;
end;
这种方法适用与窗体与组件,如想移动组件,将其“OnMouseDown”事件写成与Form的“OnMouseDown”事件一样即可。
如只想移动窗体可按以下方法编写代码:
procedure TForm1.FormMouseDown
(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X
Y: Integer);
begin
if SsCtrl in Shift then
Begin
ReleaseCapture;
SendMessage(handle, wm_SysCommand, sc_DragMove, 0);
end;
end;
运行结果:
按下“Ctrl”键拖动鼠标即可移动窗体。
要实现无标题窗体的移动有很多种方法,还可以通过检测鼠标的位置(坐标)来确定Form的“left”与“top”值等方法,在此不再详细举例.
========================
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if ssleft in shift then
releasecapture;
perform(WM_SYSCOMMAND,$F012,0);
end;
上一页 [1] [2]
责任编辑:小草