拖动不带标题栏的delphi表单

移动窗口最常用的方法是通过标题栏拖动窗口。继续阅读,了解如何在没有标题栏的情况下为Delphi表单提供拖动功能,以便用户可以通过单击客户端区域的任意位置来移动表单。...

移动窗口最常用的方法是通过标题栏拖动窗口。继续阅读,了解如何在没有标题栏的情况下为Delphi表单提供拖动功能,以便用户可以通过单击客户端区域的任意位置来移动表单。

Browser Window

例如,考虑一个没有标题栏的Windows应用程序的情况,我们怎样才能移动这样的窗口呢?事实上,创建带有非标准标题栏甚至非矩形窗体的窗口是可能的。在这种情况下,Windows如何知道窗口的边框和角在哪里?

wm_nchittest windows消息

Windows操作系统在很大程度上依赖于处理消息。例如,当您单击窗口或控件时,Windows会向其发送wm_LButtonDown消息,其中包含有关鼠标光标所在位置以及当前按下哪些控件键的其他信息。听起来熟悉吗?是的,这只是Delphi中的OnMouseDown事件。

类似地,每当鼠标事件发生时,即光标移动时,或当按下或释放鼠标按钮时,Windows都会发送wm_NCHitTest消息。

输入代码

如果我们可以让Windows认为用户正在拖动(已单击)标题栏而不是客户端区域,那么用户可以通过单击客户端区域来拖动窗口。最简单的方法是“愚弄”窗口,使其认为您实际上是在点击表单的标题栏。以下是您必须做的:

1.在表单的“私有声明”部分(消息处理过程声明)中插入以下行:

procedure WMNCHitTest(var Msg: TWMNCHitTest) ; message WM_NCHitTest;

2.将以下代码添加到表单单元的“实现”部分(其中Form1是假定的表单名称):

procedure TForm1.WMNCHitTest(var Msg: TWMNCHitTest) ; begin inherited;    if Msg.Result = htClient then Msg.Result := htCaption; end;

消息处理程序中的第一行代码调用继承的方法,以获取wm_NCHitTest消息的默认处理。过程中的If部分截取并更改窗口的行为。这就是实际发生的情况:当操作系统向窗口发送wm_NCHitTest消息以及鼠标坐标时,窗口返回一个代码,说明自己的哪个部分被击中。对于我们的任务来说,重要的信息是Msg.Result字段的值。此时,我们有机会修改消息结果。

这就是我们要做的:如果用户在表单的客户端区域单击了,我们会使窗口认为用户单击了标题栏。在Object Pascal“words”中:如果消息返回值是HTCLIENT,我们只需将其更改为HTCAPTION。

不再有鼠标事件

通过更改表单的默认行为,我们可以删除Windows在鼠标移动到客户端区域时通知您的功能。这个技巧的一个副作用是表单将不再为鼠标消息生成事件。

无标题无边界窗口

如果想要类似浮动工具栏的无标题无边框窗口,请将窗体的标题设置为空字符串,禁用所有边框图标,并将边框样式设置为bsNone。

通过在CreateParams方法中应用自定义代码,可以以各种方式更改表单。

更多wm_n切题技巧

如果您更仔细地查看wm_NCHitTest消息,您将看到函数的返回值指示光标热点的位置。这使我们能够对消息进行更多的处理,以创建奇怪的结果。

下面的代码片段将阻止用户通过单击“关闭”按钮来关闭表单。

if Msg.Result = htClose then Msg.Result := htNowhere;

如果用户试图通过单击标题栏并拖动来移动表单,则代码将用指示用户单击客户端区域的结果替换消息的结果。这可以防止用户用鼠标移动窗口(与我们在文章中所做的相反)。

if Msg.Result = htCaption then Msg.Result := htClient;

在表单上有组件的

在大多数情况下,表单上都会有一些组件。例如,假设一个面板对象位于窗体上。如果面板的Align属性设置为alClient,则面板将填充整个客户端区域,因此无法通过单击来选择父窗体。上面的代码不起作用-为什么?这是因为鼠标总是在面板组件上移动,而不是在窗体上移动。

要通过在窗体上拖动面板来移动窗体,必须在面板组件的OnMouseDown事件过程中添加几行代码:

procedure TForm1.Panel1MouseDown    (Sender: TObject; Button: TMouseButton;    Shift: TShiftState; X, Y: Integer) ; begin ReleaseCapture; SendMessage(Form1.Handle, WM_SYSCOMMAND, 61458, 0) ; end;

注意:此代码不适用于非窗口控件,如TLabel组件。

  • 发表于 2021-09-15 03:49
  • 阅读 ( 146 )
  • 分类:编程

你可能感兴趣的文章

如何在Windows7快速启动栏中将快捷方式分组

...要在桌面和快速启动栏上保留快捷方式,请在将快捷方式拖动到“新建”菜单之前按Ctrl键,将快捷方式的副本拖动到快速启动栏。 这是我们在快速启动栏上的浏览器组。 您可以重命名快速启动栏上的任何快捷方式,无论它们...

  • 发布于 2021-04-12 11:37
  • 阅读 ( 182 )

蓝鱼文本html编辑器教程

...话框,提示您输入要使用的标记。您可以输入““前”(不带尖括号),蓝鱼会在文档中插入开始和结束““前”标记: .   04 2004年 蓝鱼的其他特征 虽然蓝鱼不是所见即所得编辑器,但它确实能够让您在计算机上安...

  • 发布于 2021-09-04 23:43
  • 阅读 ( 129 )

了解delphi编程的基础知识

希望掌握Delphi编程语言的初学者应该已经熟悉Microsoft Windows的基础知识。学习Delphi是最容易的,如果你从一个有指导的、基于教程的参考框架来学习它。 基本概念 从一堂历史课开始,介绍(Turbo)Pascal到Delphi 2005的演变,例...

  • 发布于 2021-09-06 15:13
  • 阅读 ( 185 )

理解delphi项目和单元源文件

简而言之,Delphi项目只是组成由Delphi创建的应用程序的文件集合。DPR是用于Delphi项目文件格式的文件扩展名,用于存储与项目相关的所有文件。这包括其他Delphi文件类型,如表单文件(DFM)和单元源文件(.PASs)。 由于Delphi...

  • 发布于 2021-09-06 15:15
  • 阅读 ( 175 )

如何在运行时移动和调整控件大小(在delphi应用程序中)(move and resize controls at run time (in delphi applications))

下面介绍如何在应用程序运行时使用鼠标拖动和调整控件大小(在Delphi窗体上)。 运行时的表单编辑器 在窗体上放置控件(可视组件)后,可以调整其位置、大小和其他设计时特性。但是,在某些情况下,您必须允许应用...

  • 发布于 2021-09-10 20:45
  • 阅读 ( 196 )

德尔福单元剖析(德尔福初学者版)

如果您打算成为一名优秀的Delphi程序员,那么“接口”、“实现”和“使用”等词需要在您的编程知识中占有特殊的位置。 德尔福项目 当我们创建一个Delphi应用程序时,我们可以从一个空白项目、一个现有项目或Delphi的一...

  • 发布于 2021-09-10 20:53
  • 阅读 ( 181 )

如何自定义dbnavigator(customize the dbnavigator)

...我的客户想要更多用户友好的体验,如自定义按钮图形和标题,…” 此查询来自一位正在寻找增强DBNavigator组件功能的方法的Delphi开发人员。 DBNavigator是一个很好的组件,它提供了一个类似VCR的界面,用于在数据库应用程序...

  • 发布于 2021-09-10 22:21
  • 阅读 ( 220 )

如何delphidbgrid中的记录排序(sort records in delphi dbgrid)

...oTable1等),它们都保留为Delphi命名。 鼠标移动到dbgrid标题区域上 首先,让我们看看如何在鼠标指针移动到DBGrid标题区域时更改鼠标指针。您所要做的就是将代码添加到DBGrid组件的OnMouseMove事件中。 下面的代码只是使用DBGrid...

  • 发布于 2021-09-10 22:31
  • 阅读 ( 235 )

用delphi编写网络感知应用程序

在Delphi为支持通过网络(internet、intranet和local)交换数据的应用程序而提供的所有组件中,最常见的两个组件是TServerSocket和TClientSocket,这两个组件都旨在通过TCP/IP连接支持读写功能。 winsock和delphi套接字组件 Windows Sockets(W...

  • 发布于 2021-09-10 23:39
  • 阅读 ( 199 )

在系统托盘中放置delphi应用程序

...包含要为图标显示的工具提示文本—在本例中为应用程序标题。szTip最多可容纳64个字符。uFlags参数设置为告诉图标处理应用程序消息,使用应用程序的图标及其提示。uCallbackMessage指向应用程序定义的消息标识符。每当图标的边...

  • 发布于 2021-09-11 00:20
  • 阅读 ( 180 )
w13MCE47
w13MCE47

0 篇文章

相关推荐