dum*_*uch 9 delphi delphi-7 delphi-6
我花了很多时间尝试在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);
Run Code Online (Sandbox Code Playgroud)
删除对话框:
SetWindowLong(Wnd, GWL_EXSTYLE,
GetWindowLong(Wnd, GWL_EXSTYLE) and not WS_EX_DLGMODALFRAME);
Run Code Online (Sandbox Code Playgroud)
然后附加适当的系统菜单项以调整要处理的消息的大小:
AppendMenu(GetSystemMenu(Wnd, False), MF_STRING, SC_SIZE, 'Size');
Run Code Online (Sandbox Code Playgroud)
并绘制新框架:
SetWindowPos(Wnd, 0, 0, 0, 0, 0,
SWP_NOSIZE or SWP_NOMOVE or SWP_NOZORDER or SWP_FRAMECHANGED);
Run Code Online (Sandbox Code Playgroud)
通常,您可以通过实现对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;
Run Code Online (Sandbox Code Playgroud)
上面的代码对于这些情况来说是非常好的锅炉,但为了节省时间,我从这里采用了这个特殊的例子.如果应用于现有窗口/表单,则需要调整此值以适合WndProc挂钩用例.
有一个复杂的...
如果钩子形式具有bsDialog或bsSingle(以及可能的其他)的BorderStyle,那么如果表单还具有系统菜单(在BorderIcons中设置biSysMenu),则这将不起作用.问题是这样的:更改BorderIcons属性也会强制重新创建窗口,这会使你重新回到正好重新创建形式HWND的方块.
但是,检查了Delphi 7中的工具>环境选项对话框后,这似乎没有系统菜单,因此在该对话框的WndProc挂钩中添加WM_NCHITTEST处理应具有所需的效果.