我有一些通过带有bsSizeToolWin
边框的表单制作的工具面板,我有自定义处理窗口移动和自定义例程,用于将工具面板与主表单的边框(几乎像停靠功能)粘贴/对齐,但是bsSizeToolWin
边框样式的问题我的边框的所有角落/边都很大。
是否可以只使一个特定的边界侧变大?(例如,当工具面板粘在主窗体的左边框上时,我只想要面板的右边框相当大,因为面板的顶部和底部坐标根据主窗体的客户区域的高度对齐,左坐标粘在主窗体的右边框上)
我有一些通过带有bsSizeToolWin
边框的表单制作的工具面板,我有自定义处理窗口移动和自定义例程,用于将工具面板与主表单的边框(几乎像停靠功能)粘贴/对齐,但是bsSizeToolWin
边框样式的问题我的边框的所有角落/边都很大。
是否可以只使一个特定的边界侧变大?(例如,当工具面板粘在主窗体的左边框上时,我只想要面板的右边框相当大,因为面板的顶部和底部坐标根据主窗体的客户区域的高度对齐,左坐标粘在主窗体的右边框上)
从视觉的角度来看,默认情况下,如果一个窗口有相当大的边框,那么所有的边缘都被绘制成相当大的,否则它们都不是,因为 Win32 API 没有每个边缘边框样式的概念,只有整个窗口边框样式。如果您希望各种边框看起来不同,您可能必须通过直接处理WM_NCCALCSIZE
和WM_NCPAINT
消息来手动自定义绘制边框。
从功能的角度来看,阻止用户在特定边缘调整窗口大小是相当容易的。最简单的方法是让面板处理WM_NCHITTEST
消息。给面板正常大小的边框(如果需要,可以自定义绘制),然后让它首先将任何接收到WM_NCHITTEST
的消息传递给默认处理程序,然后根据需要调整结果。这种方法的好处是操作系统将不允许用户抓取任何被报告为HTBORDER
(不可调整大小的边框)的边缘,并且不会有视觉反馈表明边缘是可调整大小的(即使确实如此)。
例如,让我们使用您的 panel-aligned-on-the-left 示例。如果默认处理程序返回HTBOTTOM
、HTBOTTOMLEFT
、HTLEFT
、HTTOPLEFT
或HTTOP
,HTBORDER
则改为返回。如果默认处理程序返回HTBOTTOMRIGHT
or HTTOPRIGHT
,HTRIGHT
则返回。否则返回默认处理程序返回的任何内容。
根据需要调整面板的哪个边缘来调整值。
例如:
type
TMyPanelForm = class(TForm)
private
fWhichSideCanBeResized: TAlign;
procedure WMNCHitTest(var Message: TMessage); message WM_NCHITTEST;
end;
procedure TMyPanelForm.WMNCHitTest(var Message: TMessage);
begin
inherited;
case fWhichSideCanBeResized of
alLeft:
begin
case Message.Result of
HTBOTTOM, HTBOTTOMRIGHT, HTRIGHT, HTTOPRIGHT, HTTOP:
Message.Result := HTBORDER;
HTBOTTOMLEFT, HTTOPLEFT:
Message.Result := HTLEFT;
end;
end;
alRight:
begin
case Message.Result of
HTBOTTOM, HTBOTTOMLEFT, HTLEFT, HTTOPLEFT, HTTOP:
Message.Result := HTBORDER;
HTBOTTOMRIGHT, HTTOPRIGHT:
Message.Result := HTRIGHT;
end;
end;
alTop:
begin
case Message.Result of
HTLEFT, HTBOTTOMLEFT, HTBOTTOM, HTBOTTOMRIGHT, HTRIGHT:
Message.Result := HTBORDER;
HTTOPLEFT, HTTOPRIGHT:
Message.Result := HTTOP;
end;
end;
alBottom:
begin
case Message.Result of
HTLEFT, HTTOPLEFT, HTTOP, HTTOPRIGHT, HTRIGHT:
Message.Result := HTBORDER;
HTBOTTOMLEFT, HTBOTTOMRIGHT:
Message.Result := HTBOTTOM;
end;
end;
end;
end;
或者:
procedure TMyPanelForm.WMNCHitTest(var Message: TMessage);
begin
inherited;
case Message.Result of
HTLEFT:
if fWhichSideCanBeResized <> alLeft then
Message.Result := HTBORDER;
HTRIGHT:
if fWhichSideCanBeResized <> alRight then
Message.Result := HTBORDER;
HTTOP:
if fWhichSideCanBeResized <> alTop then
Message.Result := HTBORDER;
HTBOTTOM:
if fWhichSideCanBeResized <> alBottom then
Message.Result := HTBORDER;
HTTOPLEFT:
case fWhichSideCanBeResized of
alTop: Message.Result := HTTOP;
alLeft: Message.Result := HTLEFT;
else
Message.Result := HTBORDER;
end;
HTBOTTOMLEFT:
case fWhichSideCanBeResized of
alBottom: Message.Result := HTBOTTOM;
alLeft: Message.Result := HTLEFT;
else
Message.Result := HTBORDER;
end;
HTTOPRIGHT:
case fWhichSideCanBeResized of
alTop: Message.Result := HTTOP;
alRight: Message.Result := HTRIGHT;
else
Message.Result := HTBORDER;
end;
HTBOTTOMRIGHT:
case fWhichSideCanBeResized of
alBottom: Message.Result := HTBOTTOM;
alRight: Message.Result := HTRIGHT;
else
Message.Result := HTBORDER;
end;
end;
end;