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