gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 15:09:36 24 4
gpt4 key购买 nike

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

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

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

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

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

 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 和许多其他完全自定义窗口所做的事情。您仍然有一个非客户区域,由您来绘制它并处理非客户区域和边框绘制。换句话说,它并不是真正的无边界,但如果你愿意的话,它可以都是单一颜色。阅读此help about WM_NCPAINT messages ,开始吧。

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

关于forms - 在 Delphi 中以无边框形式/窗口平滑调整大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6652655/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com