禁用或删除MDI子窗体最小化和还原操作

时间:2013-10-01 11:50:57

标签: delphi winapi delphi-7 mdi mdichild

我想删除或禁用主菜单中的按钮,这些按钮控制我的应用程序的子表单(最小化,还原)。

remove buttons at red retangle

应用程序应该看起来像“浏览器”,MDI子窗体必须始终保持最大化。

我通过设置

尝试禁用它们
BoderIcons := [biSystemMenu];

但我得到了这个:

buttons

我已经尝试在WM_INITMENU消息中禁用菜单命令,但没有成功:

procedure WMInitMenu(var Message: TWMInitMenu); message WM_INITMENU;

procedure TMyMDIChildForm.WMInitMenu(var Message: TWMInitMenu);
begin
  inherited;
  EnableMenuItem(Message.Menu, SC_MAXIMIZE, MF_BYCOMMAND or MF_GRAYED);
  EnableMenuItem(Message.Menu, SC_MINIMIZE, MF_BYCOMMAND or MF_GRAYED);
end;

我正在使用:

  • Delphi 7.1 Enterprise
  • Windows 7 Pro x64

4 个答案:

答案 0 :(得分:2)

你最终会打击让MDI成为现实的一切。而不是使用MDI,考虑使用框架。设计TFrame后代来表示UI的一个屏幕。您可以将实例放在TPageControl上以帮助组织它们。 (如果要提供自己的在屏幕之间导航的方法,请将每个页面的TabVisible属性设置为false。)

答案 1 :(得分:2)

我通过拦截MainForm中的WM_COMMAND解决了,如下面的代码所示:

type
  TMDIMainForm = class(TForm)
  protected
    procedure WMCommand(var Message: TWMCommand); message WM_COMMAND;
  end;

implementation

procedure TMDIMainForm.WMCommand(var Message: TWMCommand);
begin
  case Message.ItemID of
    SC_CLOSE, SC_MINIMIZE, SC_RESTORE, SC_MAXIMIZE:
      begin
        Message.Result := 0;
        Exit;
      end;
  else
    inherited;
  end;
end;

在儿童表格中,我简单地说了这个:

procedure TMDIChild.OnCreate(Sender: TObject);
begin
  WindowState := wsMaximized;
end;

现在我的MDI孩子保持最大化状态,用户无法恢复或最小化。

答案 2 :(得分:1)

MDI正是一种让from(child)浮动到另一个表单(parent)中的机制。无法看到永久最大化的观点。

如果您想分离代码并将其放在其他单元中,您可以使用框架(可以在设计时或运行时插入)或表格(使用以下代码)

procedure TParentForm.FormCreate(ASender: TObject);
begin
  FEmbeddedForm := TEmbeddedForm.Create(self);
  FEmbeddedForm.Parent := Panel1;
  FEmbeddedForm.Align := alClient;
  FEmbeddedForm.BorderStyle := bsNone;
  FEmbeddedForm.Visible := True;
end; 

答案 3 :(得分:0)

以某种方式使我无法接受的答案。相反,这对我有用: MDIChildForm.BorderIcons:= MDIChildForm.BorderIcons-[biSystemMenu];