Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有没有一种方法可以在不改变边框样式的情况下使Delphi VCL表单变得相当大?_Delphi_Delphi 7_Delphi 6 - Fatal编程技术网

有没有一种方法可以在不改变边框样式的情况下使Delphi VCL表单变得相当大?

有没有一种方法可以在不改变边框样式的情况下使Delphi VCL表单变得相当大?,delphi,delphi-7,delphi-6,Delphi,Delphi 7,Delphi 6,我刚刚花了很多时间试图从GExperts中调整Delphi6/7IDE的工具/环境选项对话框的大小。在我发现将窗体的BorderStyle更改为bsSizable会关闭并重新创建窗体的句柄之前,一切似乎都正常工作,在此过程中,调色板配置的列表框的内容将丢失。 (项目属性之后为空。) 更改表单的大小(通过设置高度和宽度)效果很好,但允许用户调整大小会遇到上述问题 有没有办法在不改变边框样式的情况下使Delphi窗体变大?通常,您可以通过实现对WM\n chittest的响应并设置一个结果来指示窗口

我刚刚花了很多时间试图从GExperts中调整Delphi6/7IDE的工具/环境选项对话框的大小。在我发现将窗体的BorderStyle更改为bsSizable会关闭并重新创建窗体的句柄之前,一切似乎都正常工作,在此过程中,调色板配置的列表框的内容将丢失。 (项目属性之后为空。)

更改表单的大小(通过设置高度和宽度)效果很好,但允许用户调整大小会遇到上述问题


有没有办法在不改变边框样式的情况下使Delphi窗体变大?

通常,您可以通过实现对WM\n chittest的响应并设置一个结果来指示窗口框架中的一个调整大小的“区域”,赋予窗口调整大小的行为

例如:

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;
程序WMNCHitTest(var消息:TWMNCHitTest);信息WM_NCHITTEST;
...
程序TForm2.WMNCHitTest(变量消息:TWMNCHitTest);
常数
EDGEDETECT=7//根据需要进行调整
变量
三角洲:树突//不是用作rect,只是一个方便的结构
开始
继承;
带着消息,deltaRect做什么
开始
左:=XPos-BoundsRect.Left;
右:=BoundsRect.Right-XPos;
Top:=YPos-BoundsRect.Top;
底部:=BoundsRect.Bottom-YPos;
如果(Top“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);

您不能在“进程中丢失调色板配置列表框的内容”的早期设置该属性吗我不确定这意味着什么,但我敢打赌,这是在你应该做的时候不做你的绘图——只应该在Windows发送的
WM_PAINT
消息上做控件画布的绘图。@david不幸的是,我只有在窗体被构造并设置为活动窗体之后才得到对它的引用rm.到那时已经太晚了,因为它已经可见。@jerry不,不是那样的。Items属性后来是空的。这实际上是VCL的一个已知问题。处理
WM\u NCHITTEST
是一种方法。听起来很有希望,我会尝试一下。有趣。这不应该起作用,因为WS\u THICKFRAME样式被记录为不可用可以在创建窗口后进行更改。但似乎确实如此,尽管对话框标题栏(没有系统菜单和错误位置的小工具)中出现了一个丑陋的初始故障,直到表单实际调整大小,再加上在对话框系统菜单上添加了一个看起来很奇怪的附加“大小”项,才得以解决(在已经存在但已禁用的情况下-例如BorderStyle=bsSingle)@Deltics-我不知道thickframe不能更改,你能给我一个参考吗?关于其他点,我想知道我是否记错了,修改系统菜单会导致重新绘制框架。如果是这样的话,也许用RDW_frame+RDW_INVALIDATE重新绘制的窗口会有所帮助。现有的“大小”菜单应该可以通过ModifyMenu进行修改,GetMenuItem[Count/Info]可以用来测试是否有。这将需要更多的工作。@Sertac:WS_THICKFRAME的注释中没有任何内容表明它在创建后是可修改的(与之相比,例如,WS_GROUP在创建后可更改)。我不理解这个讨论。这个答案似乎是正确的。+1谢谢,如果Sertac Akyuz的建议不起作用,我会试试你的建议。正如我在对Sertac的答案的评论中所指出的,他的方法不应该起作用,但看起来确实起作用。不过,它确实存在一些恼人的视觉问题(在我在Windows 7上测试它时)。这比挂起窗口程序要简单一点,但如果你能忍受这些小故障和依赖不应该工作的东西的不安感觉,那么这可能是正确的选择。:)是的。这是一个切换窗口框架的msdn博客示例。注意,WS_OVERLAPPEDWINDOW包括WS_THICKFRAME。