Приложение MDI на Delphi и строка заголовка дочерних элементов MDI

StackOverflow https://stackoverflow.com/questions/8728

  •  08-06-2019
  •  | 
  •  

Вопрос

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

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

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

Это было полезно?

Решение

Вся ваша необходимая процедура перегрузки 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 стандартизирован - ваши пользователи могут это оценить :)

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

Спасибо onnodb

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top