Delphi表单没有系统菜单,但有关闭按钮

时间:2011-01-31 10:41:03

标签: delphi

默认情况下,具有BorderStyle = bsSizeable的表单具有系统菜单(在左侧)和关闭按钮(在右侧的“X”)。我想摆脱系统菜单并保持关闭按钮。

BorderIcons属性允许我删除系统菜单(通过biSystemmenu),但现在关闭按钮也消失了。

有办法做到这一点吗?

使用Delphi XE

PS:就Windows而言应该是可能的:IE8的“InPrivate过滤设置”窗口是相当大的,有一个关闭按钮,没有系统菜单。

3 个答案:

答案 0 :(得分:0)

我认为没有办法在不借助自定义绘制非客户区域的情况下执行此操作,这在涉及玻璃时非常困难。

考虑这种方法。

procedure TMyForm.DeleteSystemMenu;
var
  SystemMenu: HMenu;
begin
  SystemMenu := GetSystemMenu(Handle, False);
  DeleteMenu(SystemMenu, SC_CLOSE, MF_BYCOMMAND);
end;

是的,它成功地从系统菜单中删除了关闭项目,但它也导致关闭按钮被禁用。所以看起来你不能没有另一个。

答案 1 :(得分:0)

BorderStyle := bsSizeToolWin做你想要的,X按钮的外观略有不同。

答案 2 :(得分:0)

“系统菜单”是指标题栏左侧的图标?或者通过右键单击调用弹出菜单?

如果是要移除的图标 - 请使用以下代码:

const
  WM_ResetIcon = WM_APP - 1;

type
  TForm1 = class(TForm)
    procedure FormShow(Sender: TObject);
  protected
    procedure WMResetIcon(var Message: TMessage); message WM_ResetIcon;
  end;

implementation

procedure TForm1.FormShow(Sender: TObject);
begin
  PostMessage(Handle, WM_ResetIcon, 0, 0);
end;

procedure TForm1.WMResetIcon(var Message: TMessage);
const
  ICON_SMALL = 0;
  ICON_BIG   = 1;
begin
  DestroyIcon(SendMessage(Handle, WM_SETICON, ICON_BIG, 0));
  DestroyIcon(SendMessage(Handle, WM_SETICON, ICON_SMALL, 0));
end;