双击标题禁用表单恢复
Disable form restoring on title doubleclick
- 创建一个空的 Delphi VCL 项目
- 删除主窗体的所有BorderIcons
- 将 WindowState 设置为 wsMaximized
- 运行申请。 Main window 显示为最大化。
- 双击 window 标题。 Main window 恢复它的大小并且不可能再次最大化它。
如何防止window在不隐藏标题栏的情况下双击标题恢复?
答案已编辑!
如果我没看错,您可能希望通过标题栏禁止 double-click 以防止将表格恢复到其原始大小。您可以通过拦截 WM_NCLBUTTONDBLCLK 来做到这一点。
在下面的示例中,我已经重写了主窗体的 WndProc
方法和挂钩上述消息。
procedure TForm1.WndProc(var Message: TMessage);
begin
case Message.Msg of
WM_NCLBUTTONDBLCLK:
begin
case TWMNCHitMessage(Message).HitTest of
HTCAPTION:
Exit
else // Another HitTest-codes are handled here
Inherited WndProc(Message);
end;
end
else
Inherited WndProc(Message);
end;
end;
重要提示
虽然现在不能通过double-clicking恢复maximized形式,但是移动它还是可以恢复的鼠标被标题栏捕获。至少,在 Windows 7 上呈现了这种效果。
重现步骤:
- 运行申请;
- 将鼠标悬停在标题栏上时按下鼠标左键;
- 不要松开 LMB 并轻轻移动鼠标 - 现在表单会恢复其大小。
附录
修复了错误处理另一个 non-client HitTest-codes 除了 HTCAPTION
的错误(感谢用户 Dsm 指出了这一点!)。
您可以通过拖动标题来拦截恢复和移动系统命令以防止恢复。
type
TForm1 = class(TForm)
protected
procedure WMSysCommand(var Message: TWMSysCommand); message WM_SYSCOMMAND;
...
procedure TForm1.WMSysCommand(var Message: TWMSysCommand);
begin
case Message.CmdType and $FFF0 of
SC_MOVE, SC_RESTORE: Exit;
end;
inherited;
end;
我测试了一些解决方案,有效的是:
- 将 Align 属性 设置为 alClient;
- 从 BorderIcons 中删除 biMaximize 属性;
- 让 WindowState wsNormal(默认)。
- 创建一个空的 Delphi VCL 项目
- 删除主窗体的所有BorderIcons
- 将 WindowState 设置为 wsMaximized
- 运行申请。 Main window 显示为最大化。
- 双击 window 标题。 Main window 恢复它的大小并且不可能再次最大化它。
如何防止window在不隐藏标题栏的情况下双击标题恢复?
答案已编辑!
如果我没看错,您可能希望通过标题栏禁止 double-click 以防止将表格恢复到其原始大小。您可以通过拦截 WM_NCLBUTTONDBLCLK 来做到这一点。
在下面的示例中,我已经重写了主窗体的 WndProc
方法和挂钩上述消息。
procedure TForm1.WndProc(var Message: TMessage);
begin
case Message.Msg of
WM_NCLBUTTONDBLCLK:
begin
case TWMNCHitMessage(Message).HitTest of
HTCAPTION:
Exit
else // Another HitTest-codes are handled here
Inherited WndProc(Message);
end;
end
else
Inherited WndProc(Message);
end;
end;
重要提示
虽然现在不能通过double-clicking恢复maximized形式,但是移动它还是可以恢复的鼠标被标题栏捕获。至少,在 Windows 7 上呈现了这种效果。
重现步骤:
- 运行申请;
- 将鼠标悬停在标题栏上时按下鼠标左键;
- 不要松开 LMB 并轻轻移动鼠标 - 现在表单会恢复其大小。
附录
修复了错误处理另一个 non-client HitTest-codes 除了 HTCAPTION
的错误(感谢用户 Dsm 指出了这一点!)。
您可以通过拖动标题来拦截恢复和移动系统命令以防止恢复。
type
TForm1 = class(TForm)
protected
procedure WMSysCommand(var Message: TWMSysCommand); message WM_SYSCOMMAND;
...
procedure TForm1.WMSysCommand(var Message: TWMSysCommand);
begin
case Message.CmdType and $FFF0 of
SC_MOVE, SC_RESTORE: Exit;
end;
inherited;
end;
我测试了一些解决方案,有效的是:
- 将 Align 属性 设置为 alClient;
- 从 BorderIcons 中删除 biMaximize 属性;
- 让 WindowState wsNormal(默认)。