如何使用Delphi实现无边界窗体的移动

如何使用Delphi实现无边界窗体的移动,第1张

如何使用Delphi实现无边界窗体的移动,第2张

用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下。

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » 如何使用Delphi实现无边界窗体的移动

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情