在 Delphi 中以无边框形式/窗口平滑调整大小

2023-12-10

我正在尝试调整无边框表单的大小,但是当我使用右侧/底部增加大小时,边框和旧客户区域之间存在间隙,该间隙取决于移动鼠标的速度。

当您从左边框甚至从左下角调整大小时,效果会更加明显,到处都很可怕(我尝试使用其他商业应用程序,它也会发生)。当我更改为相当大的边框时也会发生这种效果,但它并不像删除表单边框时那么糟糕

表单布局由一个执行标题栏功能的顶部面板(带有一些图像和按钮)和一些显示其他信息的其他面板(如备忘录、其他控件等)组成。

我的代码有一个片段,我捕获鼠标按钮并向窗口发送消息,但我也尝试手动执行此操作,得到类似的结果

激活顶部面板的双缓冲区可以避免闪烁,但调整面板大小与调整表单大小不同步,从而出现间隙或部分面板消失

 procedure TOutputForm.ApplicationEvents1Message( var Msg: tagMSG;
  var Handled: Boolean );
const
  BorderBuffer = 5;
var
  X, Y: Integer;
  ClientPoint: TPoint;
  direction: integer;
begin
  Handled := false;
  case Msg.message of
    WM_LBUTTONDOWN:
      begin
        if fResizable then
        begin
          if fSides = [sTop] then
            direction := 3
          else if fSides = [sLeft] then
            direction := 1
          else if fSides = [sBottom] then
            direction := 6
          else if fSides = [sRight] then
            direction := 2
          else if fSides = [sRight, sTop] then
            direction := 5
          else if fSides = [sLeft, sTop] then
            direction := 4
          else if fSides = [sLeft, sBottom] then
            direction := 7
          else if fSides = [sRight, sBottom] then
            direction := 8;
          ReleaseCapture;
          SendMessage( Handle, WM_SYSCOMMAND, ( 61440 + direction ), 0 );
          Handled := true;
        end;
      end;
    WM_MOUSEMOVE:
      begin
        // Checks the borders and sets fResizable to true if it's in a "border" 
        // ...
      end; // mousemove
  end; // case
end;

我怎样才能避免该区域和/或强制重新绘制窗口?我正在使用 Delphi,但通用解决方案(或其他语言)甚至前进的方向对我来说都很好

先感谢您


上次我尝试手动创建一个通过 WM_SYSCOMMAND 和鼠标拖动调整大小的顶级窗口,无论是否涉及任何嵌套面板,我发现问题不仅限于闪烁。

即使使用没有可调整大小边框的裸 TForm,添加我自己的可调整大小边框并直接处理鼠标按下、鼠标移动和鼠标向上消息也被证明太有问题。我放弃了您在此处展示的代码方法,而是找到了两种可行的方法:

  1. 使用一种由我接管非客户区域绘画的方法。这就是 Google Chrome 和许多其他完全自定义窗口所做的事情。您仍然有一个非客户区域,由您来绘制它并处理非客户区域和边框绘制。换句话说,它并不是真正的无边界,但如果你愿意的话,它可以都是单一颜色。读这个有关 WM_NCPAINT 消息的帮助, 开始。

  2. 使用仍能被识别的无边框可调整大小窗口(即使其非客户区域没有作为可调整大小窗口)。想想便利贴小程序。Here这是我不久前问过的一个问题,在我的问题的底部是一个完全工作的演示,它提供了一种平滑的无闪烁方式来拥有无边框可调整大小的窗口。答案的基本技术由 David H.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Delphi 中以无边框形式/窗口平滑调整大小 的相关文章

随机推荐

  • 使用 jquery 调用 ajax 后如何等待图像加载?

    我有一个 Python 脚本 它对 JPEG 图像进行一些操作 我将一些参数传递给此脚本并从 HTML 页面调用它 该脚本返回一个 img src newimage jpg 标签 我知道如何等待脚本的回复 但我不知道如何判断图像何时完全加载
  • 由于 RAM 故障,是否会发生 System.AccessViolationException?

    我有一个网站 我已经工作了大约一年了 最近 它开始时不时地在我的开发机器中抛出 System AccessViolationException 大多数情况下 当我离开机器时 几周以来我没有对服务器代码进行任何更改 因为我一直在 100 地处
  • cmake 错误:QGLWidget:没有这样的文件或目录

    我正在尝试将 cmake 与 Qt 一起使用 但是在构建时出现以下错误 QGLWidget No such file or directory 在我的 CMakeLists txt 文件中 我有 set CMAKE INCLUDE CURR
  • 使用 C# 在另一个应用程序上执行鼠标单击事件

    我需要做的是 我需要使用我的自定义应用程序来控制安装在同一台计算机上的另一个应用程序 例如 如果我需要使用标准 Windows 计算器 我只需将输入事件发送到计算器 我使用了一些代码片段来实现这一点 现在我已经触发了鼠标和键盘事件 但问题是
  • Python 列表的幂集[重复]

    这个问题在这里已经有答案了 我正在尝试实现一个函数来生成列表的幂集xs 总体思路是我们遍历以下元素xs并选择是否包含x或不 我面临的问题是withX最终等于 None 一个单例列表None 因为 我认为 s add x 回报None 这不是
  • 使用 /= 规范化变量会引发 ufunc 错误

    我正在慢慢地进入一些机器学习领域 但在一项使用计算机视觉处理 Kaggle 猫和狗数据集的练习中 发生了一些我不太明白的事情 当我尝试标准化pickle中的图像值时 它在写入时起作用 X X 255 0 但当我写入时抛出错误 X 255 0
  • C select() 超时 STDIN 单字符(无 ENTER)

    我希望能够使用select 从 STDIN 输入单个字符 无 ENTER 因此 当用户按下一个键时 select 应立即返回 而不是等待用户按 ENTER 键 int main void fd set rfds struct timeval
  • 将字符串电话号码转换为整数[关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 我对 Java 和 Android 都缺乏经验 我正在尝试检索存储在 Android 手机模拟器的联系人之一中的电话号码 虽然我成功获取了它 但该号码已以 987 654 3210
  • C# 中委托的协变/不变/逆变

    我有以下代码 我没有为此委托指定任何通用参数和 IN OUT 方差 如果我正确理解不变性的含义 我应该无法返回基本类型的对象 因为我的委托提到了对象的返回类型 我对不变性的理解是错误的吗 class Program public deleg
  • Ansible 比较两个列表变量

    我必须检查系统上是否有可用的安装点列表 因此 我定义了一个包含挂载点列表的变量 然后从 Ansible 事实中提取可用的挂载点 hosts all vars required mounts prom data prom logs tasks
  • Webkit 中奇怪的边框不透明行为?

    我一直在测试不透明的边框 Webkit 似乎有一个奇怪的行为 这是我的代码 div span span div 你可以测试一下here 在 Firefox 中 您将得到预期的结果 一个 10px 的白色
  • 使用带有 ORDER BY 的 SQL 串联

    我很困惑 您如何解释变量连接与 ORDER BY 的差异 declare tbl table id int insert into tbl values 1 2 3 declare msg1 varchar 100 msg2 varchar
  • scikit-learn 中的哪些估计器不支持稀疏矩阵?

    我想训练一个具有很多名义属性的数据集 我从一些帖子中注意到 要转换名义属性 必须将它们转换为重复的二进制特征 据我了解 这样做在概念上会使数据集变得稀疏 我还知道 scikit learn 使用稀疏矩阵和一些估计器 因为它更快左右 但我还发
  • ScrollPane 拖动后内容变得模糊

    JavaFX 8 0有这个bug 我不知道如何解决 例子 https i stack imgur com HfsgZ png 如果我拖动 ScrollPane 其内容会变得模糊 但如果我将其拖回 内容会恢复其清晰度 如果我不修改坐标 内容看
  • 对于分配内存的函数,您遵循哪些命名约定?

    所以这里有两个函数几乎做同样的事情 如果您必须将两者都包含在您的项目中 您会如何命名每一个 void strToLower1 char str int len strlen str int i for i 0 i
  • Apache Mod Rewrite:带有 L 参数的 RewriteRule。怎么了?

    我正在开发一个 php 应用程序 但我在 Apache 和 Mod Rewrite 方面遇到了一些问题 有人知道这里出了什么问题吗 RewriteEngine on RewriteBase mysite RewriteRule css cs
  • 如何在 R 中按名称模式删除列?

    我有这个数据框 state county city region mmatrix X1 X2 X3 A1 A2 A3 B1 B2 B3 C1 C2 C3 1 1 1 1 111010 1 0 0 2 20 200 Push 8 12 NA
  • CSS3 背景图像过渡

    我正在尝试使用 CSS 过渡来制作 淡入淡出 效果 但我无法让它与背景图像一起使用 The CSS title a display block width 340px height 338px color black background
  • iPhone自动锁值?

    无法检索自动锁定值吗 或者有人知道如何像现有的警报应用程序一样修改自动锁定时间 Thanks 是的 杰森是对的 您可以使用 application setIdleTimerDisabled YES 停止自动睡眠 但没有办法访问自动锁定值 问
  • 在 Delphi 中以无边框形式/窗口平滑调整大小

    我正在尝试调整无边框表单的大小 但是当我使用右侧 底部增加大小时 边框和旧客户区域之间存在间隙 该间隙取决于移动鼠标的速度 当您从左边框甚至从左下角调整大小时 效果会更加明显 到处都很可怕 我尝试使用其他商业应用程序 它也会发生 当我更改为