Delphi MDI appliction 文档最大化显示、去掉最大化最小化等按钮

本文介绍了两种方法:一是通过修改CHILDWIN单元的代码以去除边框并实现最大化,二是直接在主窗口中创建MDIChild对象设置相关属性。两种方法都展示了如何控制子窗体的显示风格和最大化操作。

效果图

第一种方法:

        修改 CHILDWIN 单元,  太简单了, 不废话, 完整代码如下:

unit CHILDWIN;

interface

uses Winapi.Windows, System.Classes, Vcl.Graphics, Vcl.Forms, Vcl.Controls,
  Vcl.StdCtrls, Winapi.Messages, System.SysUtils;

type
  TMDIChild = class(TForm)
    Memo1: TMemo;
    procedure WMShowWindow(var Msg: TWMShowWindow); message WM_SHOWWINDOW;
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    // 重写 CreateParams
    procedure CreateParams(var Params: TCreateParams); override;
  private
    { Private declarations }
  public
    { Public declarations }
  end;

implementation

{$R *.dfm}

procedure TMDIChild.CreateParams(var Params: TCreateParams);
begin
  inherited;
  // 去掉 WS_BORDER WS_OVERLAPPEDWINDOW 等窗体样式
  Params.Style := Params.Style and not WS_OVERLAPPEDWINDOW or WS_BORDER;
end;

procedure TMDIChild.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := caFree;
end;

procedure TMDIChild.WMShowWindow(var Msg: TWMShowWindow);
begin
  // 自身最大化显示
  if Msg.Show then Self.Perform(WM_SYSCOMMAND, SC_MAXIMIZE, nil);
end;

end.

第二种方法:

        不动 CHILDWIN 单元, 在主窗口单元中创建 TMDIChild 对象时设置相关属性,相当简单。

        完整代码如下:

unit MAIN;

interface

uses Winapi.Windows, System.SysUtils, System.Classes, Vcl.Graphics, Vcl.Forms,
  Vcl.Controls, Vcl.Menus, Vcl.StdCtrls, Vcl.Dialogs, Vcl.Buttons, Winapi.Messages,
  Vcl.ExtCtrls, Vcl.ComCtrls, Vcl.StdActns, Vcl.ActnList, Vcl.ToolWin,
  Vcl.ImgList, System.ImageList, System.Actions;

type
  TMainForm = class(TForm)
    MainMenu1: TMainMenu;
    File1: TMenuItem;
    FileNewItem: TMenuItem;
    FileOpenItem: TMenuItem;
    FileCloseItem: TMenuItem;
    Window1: TMenuItem;
    Help1: TMenuItem;
    N1: TMenuItem;
    FileExitItem: TMenuItem;
    WindowCascadeItem: TMenuItem;
    WindowTileItem: TMenuItem;
    WindowArrangeItem: TMenuItem;
    HelpAboutItem: TMenuItem;
    OpenDialog: TOpenDialog;
    FileSaveItem: TMenuItem;
    FileSaveAsItem: TMenuItem;
    Edit1: TMenuItem;
    CutItem: TMenuItem;
    CopyItem: TMenuItem;
    PasteItem: TMenuItem;
    WindowMinimizeItem: TMenuItem;
    StatusBar: TStatusBar;
    ActionList1: TActionList;
    EditCut1: TEditCut;
    EditCopy1: TEditCopy;
    EditPaste1: TEditPaste;
    FileNew1: TAction;
    FileSave1: TAction;
    FileExit1: TAction;
    FileOpen1: TAction;
    FileSaveAs1: TAction;
    WindowCascade1: TWindowCascade;
    WindowTileHorizontal1: TWindowTileHorizontal;
    WindowArrangeAll1: TWindowArrange;
    WindowMinimizeAll1: TWindowMinimizeAll;
    HelpAbout1: TAction;
    FileClose1: TWindowClose;
    WindowTileVertical1: TWindowTileVertical;
    WindowTileItem2: TMenuItem;
    ToolBar2: TToolBar;
    ToolButton1: TToolButton;
    ToolButton2: TToolButton;
    ToolButton3: TToolButton;
    ToolButton4: TToolButton;
    ToolButton5: TToolButton;
    ToolButton6: TToolButton;
    ToolButton9: TToolButton;
    ToolButton7: TToolButton;
    ToolButton8: TToolButton;
    ToolButton10: TToolButton;
    ToolButton11: TToolButton;
    ImageList1: TImageList;
    procedure FileNew1Execute(Sender: TObject);
    procedure FileOpen1Execute(Sender: TObject);
    procedure HelpAbout1Execute(Sender: TObject);
    procedure FileExit1Execute(Sender: TObject);
  private
    { Private declarations }
    procedure CreateMDIChild(const Name: string);
  public
    { Public declarations }
  end;

var
  MainForm: TMainForm;

implementation

{$R *.dfm}

uses CHILDWIN, About;

procedure TMainForm.CreateMDIChild(const Name: string);
var
  Child: TMDIChild;
begin
  { create a new MDI child window }
  Child := TMDIChild.Create(Application);
  Child.Caption := Name;
  if FileExists(Name) then Child.Memo1.Lines.LoadFromFile(Name);

  // 去掉 WS_BORDER WS_OVERLAPPEDWINDOW 等窗体样式
  var style:= GetWindowLong(Child.Handle, GWL_STYLE);
  if style >0 then SetWindowLong(Child.Handle, GWL_STYLE, style and not (WS_OVERLAPPEDWINDOW + WS_BORDER));

  // 最大化显示
  SendMessage(Child.Handle, WM_SYSCOMMAND, SC_MAXIMIZE, 0);
  // 最大化显示
  //ShowWindow(Child.Handle, SW_SHOWMAXIMIZED);
  // 最大化显示
  //Child.perform(WM_SYSCOMMAND, SC_MAXIMIZE, nil);

end;

procedure TMainForm.FileNew1Execute(Sender: TObject);
begin
  CreateMDIChild('NONAME' + IntToStr(MDIChildCount + 1));
end;

procedure TMainForm.FileOpen1Execute(Sender: TObject);
begin
  if OpenDialog.Execute then
    CreateMDIChild(OpenDialog.FileName);
end;

procedure TMainForm.HelpAbout1Execute(Sender: TObject);
begin
  AboutBox.ShowModal;
end;

procedure TMainForm.FileExit1Execute(Sender: TObject);
begin
  Close;
end;

end.

### Application类的作用 Android 中的 `Application` 类是应用级别的组件,它在整个应用生命周期中仅存在一个实例,负责全局状态的管理和资源的初始化[^1]。通过继承 `Application` 类并重写其 `onCreate()` 方法,开发者可以在应用启动时执行全局的初始化操作,例如配置全局变量、初始化第三方库或管理共享资源[^3]。这种机制使得 `Application` 成为跨组件共享数据和状态的理想选择。 ### MainActivity的作用 `MainActivity` 是 Android 应用中常见的一个 `Activity` 子类,负责管理应用的主界面生命周期和用户交互。`Activity` 的生命周期较短,通常随着用户的操作频繁创建和销毁,其作用范围限定于单个界面的显示与交互[^1]。在 `MainActivity` 中,通常会实现用户界面的加载、事件监听器的绑定以及与其他组件的交互逻辑。 ### Application与MainActivity的关系 `Application` 和 `MainActivity` 的关系体现在全局与局部的职责划分上。`Application` 提供全局状态和资源管理,而 `MainActivity` 则专注于界面级别的操作。例如,`Application` 可以初始化一个全局变量,供 `MainActivity` 或其他组件访问和修改。这种设计使得 `MainActivity` 能够专注于界面交互,而将全局逻辑交由 `Application` 处理[^2]。 此外,`MainActivity` 可以通过静态方法获取自身实例,实现跨类调用其方法的功能。例如,通过定义 `private static MainActivity instance` 和 `public static MainActivity getInstance()` 方法,其他类可以直接调用 `MainActivity` 的方法,而无需重新创建实例[^4]。 ### 示例代码 以下是一个简单的 `Application` 类和 `MainActivity` 的示例: ```java // 自定义Application类 public class MyApplication extends Application { private String globalData; @Override public void onCreate() { super.onCreate(); // 初始化全局数据 globalData = "Global State"; } public String getGlobalData() { return globalData; } } ``` ```java // MainActivity类 public class MainActivity extends AppCompatActivity { private static MainActivity instance; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); instance = this; } public static MainActivity getInstance() { return instance; } public void myMethod() { // 执行某些操作 } } ``` 在 `MyApplication` 中定义的 `globalData` 可以在 `MainActivity` 或其他组件中访问和修改,从而实现全局状态的共享。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值