代码之家  ›  专栏  ›  技术社区  ›  AviD

Delphi MDI应用程序和MDI子项的标题栏

  •  4
  • AviD  · 技术社区  · 16 年前

    我有一个用Delphi2006编写的MDI应用程序,它使用默认主题运行XP。

    是否有一种方法可以控制MDI子级的外观,以避免每个窗口上出现大型的XP样式的标题栏?

    我试过设置 BorderStyle MDIChildren bsSizeToolWin 但它们仍然呈现为正常形式。

    4 回复  |  直到 8 年前
        1
  •  5
  •   CoolMagic    16 年前

    所有需要-重载过程createWindowHandle,如下所示:

    unit CHILDWIN;
    interface
    uses Windows, Classes, Graphics, Forms, Controls, StdCtrls;
    
    type
      TMDIChild = class(TForm)
      private
        { Private declarations }
      public
        { Public declarations }
        procedure CreateWindowHandle(const Params: TCreateParams); override;
      end;
    
    implementation
    
    {$R *.dfm}
    procedure TMDIChild.CreateWindowHandle(const Params: TCreateParams);
    begin
      inherited CreateWindowHandle(Params);
      SetWindowLong(Handle, GWL_EXSTYLE, WS_EX_TOOLWINDOW);
    end;
    end.
    
        2
  •  1
  •   Tim Sullivan    16 年前

    MDI的工作方式与你想做的不一致。

    如果需要“MDI”格式,则应考虑使用内置或 commercial 对接包,并使用对接设置来模拟MDI的感觉。

    在我的Delphi应用程序中,我经常使用tframe并将它们作为主窗体的父级,并将它们最大化,这样它们就占据了客户机区域。这给了您一些类似于Outlook的外观。有点像这样:

    TMyForm = class(TForm)
    private
      FCurrentModule : TFrame;
    public
      property CurrentModule : TFrame read FModule write SetCurrentModule;
    end;
    
    procedure TMyForm.SetCurrentModule(ACurrentModule : TFrame);
    begin
      if assigned(FCurrentModule) then
        FreeAndNil(FCurrentModule);  // You could cache this if you wanted
      FCurrentModule := ACurrentModule;
      if assigned(FCurrentModule) then
      begin
        FCurrentModule.Parent := Self;
        FCurrentModule.Align := alClient;
      end;
    end;
    

    要使用它,您只需执行以下操作:

    MyForm.CurrentModule := TSomeFrame.Create(nil);
    

    有一个很好的理由,您应该使用您使用的接口(创建imodule接口或其他东西)。我经常这样做,但在这里解释这个概念比需要的要复杂得多。

    高温高压

        3
  •  0
  •   onnodb    16 年前

    我认为不存在;根据我的经验,Delphi中的MDI受到VCL中实现的严格限制和控制(也可能受到Windows API的控制?).例如,不要试图隐藏一个MDI子项(如果尝试,您会得到一个例外,并且您必须跳过几个API环才能解决这个问题),或者更改MDI子项的主菜单与宿主窗体的合并方式。

    考虑到这些限制,也许你应该重新考虑一下为什么你首先要有特别的标题栏?我想这也是MDI标准化的原因——您的用户可能会喜欢它:)

    (附言:很高兴看到这里有一个德尔菲问题!)

        4
  •  0
  •   AviD    16 年前

    感谢点头

    不幸的是,客户坚持MDI和较小的标题栏。

    我已经想出了一种方法,那就是通过覆盖Windows CreateParams来隐藏标题栏,然后创建自己的标题栏(简单的面板,带有一些移动鼠标操作)。工作得很好,所以我想我可能会由客户机运行它,看看它是否可以……