【发布时间】:2011-07-11 15:36:17
【问题描述】:
我正在尝试调整无边框表单的大小,但是当我使用右侧/底部增加大小时,边框和旧客户区之间会出现间隙,这取决于您移动鼠标的速度。
当您从左边框甚至左下角调整大小时,效果会更加明显,到处都是可怕的(我尝试使用其他商业应用程序,它也发生了)。当我更改为相当大的边框时也会发生这种效果,但它不像我删除表单边框时那么糟糕
表单布局包含一个执行标题栏功能的顶部面板(带有一些 tImage 和按钮),以及一些显示其他信息的其他面板(如备忘录、其他控件等)
有一个我的代码片段,我在其中捕获鼠标按钮并向窗口发送消息,但我也尝试手动执行,结果相似
激活顶部面板的双缓冲可避免闪烁,但调整面板大小与调整表单大小不同步,从而出现间隙,或部分面板消失
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,但通用解决方案(或其他语言)甚至是前进的方向对我来说都很好
提前谢谢你
【问题讨论】:
-
你的意思是在调整大小的过程中存在“间隙”,一旦你结束调整大小操作,表格就画好了?
-
如何调整无边框表单的大小?
-
但更重要的是:你自己画画吗?你使用 OnPaint 事件处理程序吗?如果都是这样:也许这幅画太重了,或者这幅画可以做得更聪明吗?请向我们展示您的代码设计,我们可以为您提供更好的帮助。
-
您无法按照您描述的方式调整无边框表单的大小。 (通过拖动调整大小边框)。你告诉我们你真正在做什么并向我们展示一些代码。
-
抱歉耽搁了,这里很忙。我使用 wm_syscommand 并设置边界手动捕获 wm_mousemove 消息,但结果是一样的,鼠标移动之间需要很长时间,直到重新绘制窗口,我想这是正常的窗口行为,因为几乎所有程序我使用它,但我想知道如何最小化它,或者如果可能的话甚至避免它。
标签: forms delphi resize smooth borderless