其他语言

位置:IT落伍者 >> 其他语言 >> 浏览文章

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


发布日期:2023年09月21日
 
如何使用Delphi实现无边界窗体的移动

在用Delphi制作Windows程序的窗体时窗体的边界有四种选择对话框式(bsDialog)单边固定式(bsSingle)双边可变式(bsSizeable)无边界式(bsNone)当设置为bsNone时窗体也就没有标题条很显然程序运行以后就无法移动窗体了事实上无边界窗体是很有用的例如象Word里面的浮动式工具箱其实就是无边界窗体它可以大大节约屏幕空间那么如何用Delphi实现这个功能呢?显然这需要修改Windows的内部消息也就是说需要把MouseDownonForm这个消息改为MouseDownonCaption这其中有三个关键 捕捉MouseDown消息判断光标位置发送MouseDown消息如果光标在窗体中则发送MouseDownonCaption消息

在Delphi的对象巡检器中列出的所有事件是不能捕捉到Windows消息的因为这些都是已经发出的消息无法修改了捕捉Windows消息有两种办法一个就是增加一个消息处理句柄直接处理Windows消息另一个是对消息进行过滤滤出所需消息第二个办法比较常用适用于各种情况下面就是移动无边界窗体程序片断加注释部分是手动加入的

unitUnit

type

TFormΚclass(TForm)

procedureFormCreate(SenderTObject)

public

{申明消息过滤过程}

procedureAppMessage(varmsgTMsgvarHandled

Boolean)

implementation

procedureTForm.FormCreate(SenderTObject)

begin

{捕捉消息将程序的收到消息事件与消息过滤过程

关联起来}

Application.OnMessageΚAppMessage

end

procedureTForm.AppMessage(varmsgTMsgvar

HandledBoolean)

begin

{如果鼠标左键按下的话}

ifMsg.messageΚWM—LButtonDownthen

begin

{判断光标是否在用户工作区内}

ifDefWindowProc(HandleWM—NCHitTestGet

MessagePos)ΚHTClientthen

begin

{发出鼠标在用户标题栏内被按下的消息}

SendMessage(HandleWM—NCLButtonDown

HTCaptionGetMessagePos)

HandledΚtrue{消息处理完毕窗体不再接受M

ouseDown及Click事件如果为false程序的运行稍微有

些不正常

end

end

end

上一篇:DelphiforLinux中应用共享对象库

下一篇:Delphi部分函数、命令、属性中文说明