我花了很多时间尝试在GExperts中使Delphi 6/7 IDE的Tools/Environment Options对话框变得相当大.一切似乎工作正常,直到我发现将窗体的BorderStyle更改为bsSizable关闭并重新创建窗体的句柄,并在此过程中丢失调色板配置的列表框的内容.(之后Items项属性为空.)
更改表单的大小(通过设置高度和宽度)可以正常工作,但允许用户调整大小会遇到上述问题.
有没有办法在不改变BorderStyle的情况下使Delphi表格变得相当大?
"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);
通常,您可以通过实现对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挂钩用例.
有一个复杂的...
如果钩子形式具有bsDialog或bsSingle(以及可能的其他)的BorderStyle,那么如果表单还具有系统菜单(在BorderIcons中设置biSysMenu),则这将不起作用.问题是这样的:更改BorderIcons属性也会强制重新创建窗口,这会使你重新回到正好重新创建形式HWND的方块.
但是,检查了Delphi 7中的工具>环境选项对话框后,这似乎没有系统菜单,因此在该对话框的WndProc挂钩中添加WM_NCHITTEST处理应具有所需的效果.