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

表单 – 在Delphi中以无边框形式窗口平滑调整大小,第1张

概述我正在尝试调整无边框形状的大小,但是当我使用右/底侧增加大小时,边界和旧客户区之间会出现间隙,这取决于移动鼠标的速度. 当你从左边界或从左下角调整大小时,效果更明显,到处都是可怕的(我尝试过其他商业应用程序也会发生这种情况).当我改变为相当大的边框时,这种效果也会发生,但它并不像我删除表格边框那样糟糕 表单布局包含一个顶部面板,用于执行标题栏功能(带有一些tImages和按钮),还有一些其他面板显 我正在尝试调整无边框形状的大小,但是当我使用右/底侧增加大小时,边界和旧客户区之间会出现间隙,这取决于移动鼠标的速度.

当你从左边界或从左下角调整大小时,效果更明显,到处都是可怕的(我尝试过其他商业应用程序也会发生这种情况).当我改变为相当大的边框时,这种效果也会发生,但它并不像我删除表格边框那样糟糕

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

有一段我的代码,我捕获鼠标按钮并向Windows发送消息,但我也尝试手动执行类似的结果

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

 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; // caseend;

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

先感谢您

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

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

>使用一种方法,我接管非客户区域的绘画.这就是谷歌Chrome和许多其他完全自定义的窗口.您仍然有一个非客户区域,由您来绘制它并处理非客户端和边框绘制.换句话说,它不是真正的无边框,但如果你想要的话,它可能都是单一的颜色.阅读本help about WM_NCPAINT messages,开始使用.
>使用仍然可以识别的无边框可调整窗口(即使没有非客户区域作为可调整大小的窗口.想想一个post-it-note-applet.Here是我前一段时间问的一个问题,在我的问题的底部是一个完全工作的演示,提供一个平滑的无闪烁方式,以获得无边框可调整窗口.答案的基础技术由DavID H.提供.

总结

以上是内存溢出为你收集整理的表单 – 在Delphi中以无边框形式/窗口平滑调整大小全部内容,希望文章能够帮你解决表单 – 在Delphi中以无边框形式/窗口平滑调整大小所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1087586.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-27
下一篇 2022-05-27

发表评论

登录后才能评论

评论列表(0条)

保存