拖动无标题窗口
方法一:
适用于托拽无标题栏的文字提示浮动小窗口(因如果使用PIC作为BTN的话会影响到PIC的Click事件获得)
//当鼠标拖动时Windows 首先会向鼠标
//下的窗口发送一个 wm_nchittest 消息,窗口收到这个消息
//后再由窗口的消息处理函数进行处理,消息处理函数将会返
//回一个整数表示鼠标正处于窗口的什么部位。大家只需要知
//道的是处理函数返回2,表示鼠标正处于窗口的标题栏上。
//根据这一点,我们只要截获这条消息,然后直接返回2。
//这样不管鼠标真正位于窗口的什么部位,WINDOWS 一律认为
//鼠标位于标题栏上。因此,用户自然可以拖动窗口。
//下的窗口发送一个 wm_nchittest 消息,窗口收到这个消息
//后再由窗口的消息处理函数进行处理,消息处理函数将会返
//回一个整数表示鼠标正处于窗口的什么部位。大家只需要知
//道的是处理函数返回2,表示鼠标正处于窗口的标题栏上。
//根据这一点,我们只要截获这条消息,然后直接返回2。
//这样不管鼠标真正位于窗口的什么部位,WINDOWS 一律认为
//鼠标位于标题栏上。因此,用户自然可以拖动窗口。
procedure WMNCHitTest(var Msg:TWMNCHitTest); message WM_NCHITTEST;
procedure TForm1.WMNCHitTest(var Msg:TWMNCHitTest);
begin
DefaultHandler(Msg);
if Msg.Result = HTCLIENT then
Msg.Result:= HTCAPTION;
end;
procedure TForm1.WMNCHitTest(var Msg:TWMNCHitTest);
begin
DefaultHandler(Msg);
if Msg.Result = HTCLIENT then
Msg.Result:= HTCAPTION;
end;
方法二:
比较好用,可以用于自定窗口制作,简单的并不会对其它控件有影响。
//直接在MouseDown事件中使用
procedure TForm1.Button1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
Shift: TShiftState; X, Y: Integer);
begin
//WINAPI释放鼠标
ReleaseCapture;
ReleaseCapture;
//发送系统消息,通知窗口标题栏被按下,之后就可以拖了
SendMessage(Handle,WM_SYSCOMMAND,$F012,0);
end;
SendMessage(Handle,WM_SYSCOMMAND,$F012,0);
end;