您现在的位置是:首页 >

c窗体程序设计 如何使用Delphi实现无边界窗体的移动

火烧 2022-06-08 23:40:59 1041
如何使用Del hi实现无边界窗体的移动   在用Del hi制作Wi dow 程序的窗体时 窗体的边界有四种选择 对话框式( Dialog) 单边固定式( Si gle) 双边可变式( Sizea

如何使用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(Sender TObject)

  

  public

  {申明消息过滤过程}

  procedureAppMessage(varmsg TMsg varHandled Boolean)

  

  implementation

  procedureTForm .FormCreate(Sender TObject)

  begin

  {捕捉消息 将程序的收到消息事件与消息过滤过程 关联起来}

  Application.OnMessage ΚAppMessage

  end

  procedureTForm .AppMessage(varmsg TMsg var Handled Boolean)

  begin

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

  ifMsg.messageΚWM—LButtonDownthen

  begin

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

  ifDefWindowProc(Handle WM—NCHitTest Get MessagePos)ΚHTClientthen

  begin

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

  SendMessage(Handle WM—NCLButtonDown

c窗体程序设计 如何使用Delphi实现无边界窗体的移动

  HTCaption GetMessagePos)

  Handled Κtrue {消息处理完毕 窗体不再接受M ouseDown及Click事件 如果为false 程序的运行稍微有 些不正常 }

  end

  end

lishixinzhi/Article/program/Delphi/201311/24682  
永远跟党走
  • 如果你觉得本站很棒,可以通过扫码支付打赏哦!

    • 微信收款码
    • 支付宝收款码