我花了很多时间尝试在GExperts中制作Delphi 6/7 IDE的Tools / Environment Options对话框。一切似乎工作正常,直到我发现将表单的BorderStyle更改为bsSizable关闭并重新创建表单的句柄,并在此过程中丢失调色板配置的列表框的内容。 (之后,Items属性为空。)
更改表单的大小(通过设置高度和宽度)可以正常工作,但允许用户调整大小会遇到上述问题。
有没有办法在不改变BorderStyle的情况下使Delphi表格变得相当大?
答案 0 :(得分:8)
" Wnd中"作为对话框句柄,您可以将对话框转换为带有大小调整框的重叠窗口:
SetWindowLong(Wnd, GWL_STYLE,
GetWindowLong(Wnd, GWL_STYLE) and not WS_POPUP or WS_THICKFRAME);
删除对话框:
SetWindowLong(Wnd, GWL_EXSTYLE,
GetWindowLong(Wnd, GWL_EXSTYLE) and not WS_EX_DLGMODALFRAME);
然后附加适当的系统菜单项以调整要处理的消息的大小:
AppendMenu(GetSystemMenu(Wnd, False), MF_STRING, SC_SIZE, 'Size');
并绘制新框架:
SetWindowPos(Wnd, 0, 0, 0, 0, 0,
SWP_NOSIZE or SWP_NOMOVE or SWP_NOZORDER or SWP_FRAMECHANGED);
答案 1 :(得分:5)
通常情况下,您可以通过实施对 WM_NCHITTEST 的响应并设置指示窗口框架中一个调整大小“区域”的结果来赋予一个调整行为大小的窗口。
例如:
procedure WMNCHitTest(var Message: TWMNCHitTest); message WM_NCHITTEST;
...
procedure TForm2.WMNCHitTest(var Message: TWMNCHitTest);
const
EDGEDETECT = 7; //adjust as required
var
deltaRect: TRect; //not used as a rect, just a convenient structure
begin
inherited;
with Message, deltaRect do
begin
Left := XPos - BoundsRect.Left;
Right := BoundsRect.Right - XPos;
Top := YPos - BoundsRect.Top;
Bottom := BoundsRect.Bottom - YPos;
if (Top<EDGEDETECT)and(Left<EDGEDETECT) then
Result := HTTOPLEFT
else if (Top<EDGEDETECT)and(Right<EDGEDETECT) then
Result := HTTOPRIGHT
else if (Bottom<EDGEDETECT)and(Left<EDGEDETECT) then
Result := HTBOTTOMLEFT
else if (Bottom<EDGEDETECT)and(Right<EDGEDETECT) then
Result := HTBOTTOMRIGHT
else if (Top<EDGEDETECT) then
Result := HTTOP
else if (Left<EDGEDETECT) then
Result := HTLEFT
else if (Bottom<EDGEDETECT) then
Result := HTBOTTOM
else if (Right<EDGEDETECT) then
Result := HTRIGHT
end;
end;
对于这些情况,上面的代码非常适合,但为了节省时间,我采用了这个特殊的例子from here。如果应用于现有窗口/表单,则需要调整此值以适合WndProc挂钩用例。
有一个并发症......
如果隐藏的表单有 bsDialog 的 BorderStyle 或 bsSingle (可能还有其他),那么如果表单 还有一个系统菜单( biSysMenu 在 BorderIcons 中设置)。问题是这样的:更改 BorderIcons 属性也会强制重新创建窗口,这会使您重新回到正方形,重新创建 HWND 格式。
但是,检查了工具&gt;在Delphi 7中的环境选项对话框中,不似乎有一个系统菜单,因此在 WndProc 挂钩中添加 WM_NCHITTEST 处理该对话框应具有所需的效果。