如何使用Delphi实现无边界窗体的移动
用Delphi制作Windows程序窗体时,窗体的边界有四种选择:对话框(bsDialog)、单边固定(bsSingle)、双边可变(bs sibilized)和无边界(bsNone)。当设置为bsNone时,窗体没有标题栏。显然,在程序运行后,表单不能被移动。事实上,无边框表单非常有用。比如Word中的浮动工具箱,其实就是一个无边框的形式,可以大大节省屏幕空。那么,如何用Delphi实现这个功能呢?显然,这需要修改Windows的内部消息,也就是说,消息“MouseDownonForm”需要改为“MouseDownonCaption”。有三个关键:捕获鼠标按下消息,判断光标位置,发送鼠标按下消息。如果光标在表单中,则发送MouseDownonCaption消息。
Delphi的object guard tour系统中列出的所有事件都无法捕获Windows消息,因为这些都是已经发送的消息,无法修改。捕获Windows消息有两种方式:一种是添加消息处理句柄,直接处理Windows消息;另一种是对消息进行过滤,筛选出需要的消息。第二种方法比较常用,适用于各种情况。下面是移动无边框表单的程序片段,注释部分是手动添加的:
unitUnit1
:
类型
TForm 1κ类(t form)
procedureFormCreate(发件人:to object);
:
公众的
{声明邮件过滤过程}
procedure appmessage(varMsg:TMsg;var handled
:Boolean);
:
履行
过程表单1。FormCreate(发件人:to object)
;
开始
{捕获消息:将程序的接收消息事件与消息过滤过程相关联
}
申请。on message:κapp message;
结束;
过程表单1。app message(varMsg:TMsg;var
Handled:Boolean);
开始
{如果按下鼠标左键}
ifmsg . messageκWM—LButtonDownthen
开始
{确定光标是否在用户的工作区中}
ifDefWindowProc(Handle,WM—NCHitTest,0,Get
message pos)κHTClientthen
开始
{发送用户标题栏中鼠标被按下的消息}
SendMessage(Handle,WM—NCLButtonDown,
HTCaption,GetMessagePos);
已处理:true{处理完邮件后,表单不再接受M
ouseDown和Click事件。如果为false,程序运行会稍微
不正常。}
结束;
结束;
结束;
结束。
程序运行在Delphi1.0和中文Windows3.2下。
0条评论