【问题标题】:Disable or remove MDI child form minimize and restore actions禁用或删除 MDI 子窗体最小化和还原操作
【发布时间】:2013-10-01 11:50:56
【问题描述】:

我想删除或禁用主菜单中的按钮,这些按钮控制我的应用程序的子窗体(最小化、恢复)。

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

我已经尝试通过设置禁用它们

BoderIcons := [biSystemMenu];

但我得到了这个:

我已经尝试在 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 企业版
  • Windows 7 Pro x64

【问题讨论】:

  • 为什么不使用常规表单和标签或页面控件?看来你实际上不需要MDI?
  • 这是一个遗留应用程序...我们正在对其进行调整以适应新的用户界面,并尽可能减少影响。

标签: delphi winapi delphi-7 mdi mdichild


【解决方案1】:

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

【讨论】:

    【解决方案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 孩子保持最大化,用户无法恢复或最小化。

    【讨论】:

      【解决方案3】:

      MDI 正是一种使 from(子)浮动在另一个表单(父)中的机制。看不到将其永久最大化的意义。

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

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

      【讨论】:

        【解决方案4】:

        不知何故,接受的答案对我不起作用。这对我有用: MDIChildForm.BorderIcons := MDIChildForm.BorderIcons - [biSystemMenu];

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-01-23
          • 1970-01-01
          • 2012-02-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多