Приложение MDI на Delphi и строка заголовка дочерних элементов MDI
Вопрос
У меня есть 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, а затем создать свою собственную строку заголовка (простая панель с некоторым управлением мышью для перемещения).Работает достаточно хорошо, поэтому я думаю, что мог бы запустить его с помощью клиента и посмотреть, подойдет ли это...