Приложение Delphi MDI и заглавие Детей MDI - PullRequest
4 голосов
/ 12 августа 2008

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

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

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

Ответы [ 4 ]

5 голосов
/ 02 октября 2008

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

Принцип работы 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 или что-то еще), которые вы используете. Я часто так делаю, но объяснить эту концепцию здесь сложнее, чем нужно.

НТН

0 голосов
/ 12 августа 2008

Спасибо onnodb

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

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

0 голосов
/ 12 августа 2008

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

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

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

...