有没有办法让Delphi VCL表格大小而不改变BorderStyle?

时间:2015-12-13 18:15:25

标签: delphi delphi-7 delphi-6

我花了很多时间尝试在GExperts中制作Delphi 6/7 IDE的Tools / Environment Options对话框。一切似乎工作正常,直到我发现将表单的BorderStyle更改为bsSizable关闭并重新创建表单的句柄,并在此过程中丢失调色板配置的列表框的内容。 (之后,Items属性为空。)

更改表单的大小(通过设置高度和宽度)可以正常工作,但允许用户调整大小会遇到上述问题。

有没有办法在不改变BorderStyle的情况下使Delphi表格变得相当大?

2 个答案:

答案 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 处理该对话框应具有所需的效果。