在用Delphi制作Windows程序的窗体时窗体的边界有四种选择对话框式(bsDialog)单边固定式(bsSingle)双边可变式(bsSizeable)无边界式(bsNone)当设置为bsNone时窗体也就没有标题条很显然程序运行以后就无法移动窗体了事实上无边界窗体是很有用的例如象Word里面的浮动式工具箱其实就是无边界窗体它可以大大节约屏幕空间那么如何用Delphi实现这个功能呢?显然这需要修改Windows的内部消息也就是说需要把MouseDownonForm这个消息改为MouseDownonCaption这其中有三个关键 捕捉MouseDown消息判断光标位置发送MouseDown消息如果光标在窗体中则发送MouseDownonCaption消息
在Delphi的对象巡检器中列出的所有事件是不能捕捉到Windows消息的因为这些都是已经发出的消息无法修改了捕捉Windows消息有两种办法一个就是增加一个消息处理句柄直接处理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