Приложение Delphi MDI и заглавие детей MDI

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

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

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

12.08.2008 12:10:14
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.
5
2.10.2008 07:33:43

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

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

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

0
12.08.2008 13:06:23

Спасибо onnodb

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

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

0
12.08.2008 13:58:52

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

НТН

1
12.08.2008 14:10:18