Приложение Delphi MDI и заголовок MDI Children

У меня есть приложение MDI, написанное на Delphi 2006, которое запускает XP с темой по умолчанию.

Есть ли способ контролировать внешний вид дочерних элементов MDI, чтобы избежать появления большой строки заголовка в стиле XP в каждом окне?

Я попытался установить BorderStyle из MDIChildren к , bsSizeToolWin но они по - прежнему отображаются как нормальные формы.

Ответов (4)

Решение

Все, что вам нужно - перегрузить процедуру 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.

То, как работает MDI, не сочетается с тем, что вы пытаетесь сделать.

Если вам нужен формат «MDI», вам следует подумать об использовании встроенного или коммерческого пакета стыковки и использовать настройку стыковки, чтобы имитировать ощущение MDI.

В своих приложениях Delphi я часто использую TFrames и привязываю их к основной форме и максимизирую их, чтобы они занимали клиентскую область. Это дает вам нечто похожее на то, как выглядит 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 или что-то в этом роде), которые вы используете. Я часто это делаю, но объяснить здесь концепцию сложнее, чем нужно.

HTH

Я не думаю, что есть; по моему опыту, MDI в Delphi очень строго ограничен и контролируется его реализацией в VCL (и, возможно, также с помощью Windows API?). Например, не пытайтесь скрыть дочерний элемент MDI (вы получите исключение, если попытаетесь, и вам придется перепрыгнуть через пару обручей API, чтобы обойти это) или изменить способ главного меню дочернего MDI объединяется с формой хоста.

Учитывая эти ограничения, возможно, вам стоит пересмотреть, почему вы вообще хотите иметь специальные строки заголовка? Думаю, есть также веские причины, по которым этот материал MDI стандартизирован - ваши пользователи могут это оценить :)

(PS: приятно видеть здесь вопрос о Delphi!)

Спасибо onnodb

К сожалению, клиент настаивает на MDI и меньшей строке заголовка.

Я разработал один способ сделать это: скрыть строку заголовка, переопределив окно CreateParams, а затем создать свою собственную строку заголовка (простая панель с некоторой обработкой мыши для перемещения). Работает достаточно хорошо, поэтому я думаю, что могу запустить его клиентом и посмотреть, подойдет ли он ...