当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《有没有办法让DelphiVCL表格大小而不改变BorderStyle?》经验,为你挑选了2个好方法。

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

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

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



1> Sertac Akyuz..:

"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);



2> Deltics..:

通常,您可以通过实现对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

上面的代码对于这些情况来说是非常好的锅炉,但为了节省时间,我从这里采用了这个特殊的例子.如果应用于现有窗口/表单,则需要调整此值以适合WndProc挂钩用例.

有一个复杂的...

如果钩子形式具有bsDialogbsSingle(以及可能的其他)的BorderStyle,那么如果表单具有系统菜单(在BorderIcons中设置biSysMenu),则这将不起作用.问题是这样的:更改BorderIcons属性也会强制重新创建窗口,这会使你重新回到正好重新创建形式HWND的方块.

但是,检查了Delphi 7中的工具>环境选项对话框后,这似乎没有系统菜单,因此在该对话框的WndProc挂钩中添加WM_NCHITTEST处理应具有所需的效果.

推荐阅读
yzh148448
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有