Исключить стили VCL из диалога стилей / границ ShowMessage

есть ли способ исключить стили VCL из стиля границы системных диалогов.

Sepecifically диалог, который отображается путем вызова MessageDlg или ShowMessage.

Я прочитал несколько статей о "дороге в Дельфы" (которая является отличным сайтом кстати), но не смог найти ответ.

вот чего я хочу добиться:

теперь (стиль углерода со стилизованными границ):

now

цель (стиль углерода со стандартными окнами границы):

enter image description here

Я все еще хочу иметь элементы управления в стиле, но без стилизованной границы.

удаление seBorder из родительских форм StyleElements не делает трюк.

enter image description here

спасибо!

2 ответов


MessageDlg() и ShowMessage() являются функциями Delphi VCL. Они динамически создают Delphi TForm и отображать это, так что у вас нет возможности настроить его. Однако, вы можете использовать создать то же TForm, затем измените его элементы стиля по мере необходимости, а затем покажите его. Например:

function DoMessageDlgPosHelp(MessageDialog: TForm; X, Y: Integer): Integer;
begin
  with MessageDialog do
    try
      if X >= 0 then Left := X;
      if Y >= 0 then Top := Y;
      if (Y < 0) and (X < 0) then Position := poScreenCenter;
      Result := ShowModal;
    finally
      Free;
    end;
end;

procedure ShowStyledMessage(const Msg: string; const StyleElements: TStyleElements);
var
  Form: TForm;
begin
  Form := CreateMessageDialog(Msg, mtCustom, [mbOK]);
  Form.StyleElements := StyleElements;
  DoMessageDlgPosHelp(Form, -1, -1);
end;

назовем это так:

ShowStyledMessage('Some text', [seFont, seClient]);

и диалог выглядит так:

screenshot


чтобы иметь стилизованную форму без границ, вы должны удалить seBorder из формы StyleElements собственность.

  StyleElements := [seFont, seClient];

From form designer

но вы должны установить это свойство для каждого форме. Если я правильно понял вас, вы хотите показать диалоговое окно сообщения с границей Windows. В этом случае параметр StyleElements свойство для формы, что вызывает ShowMessage не будет влиять на диалоговое окно, потому что это совершенно новая форма.

то, что вы должны сделать, это как-то set StyleElements свойство для диалоговой формы, которую Delphi создает вне вашей досягаемости. Для этого вы должны создать свою собственную форму StyleHook и заменить TFormStyleHook зарегистрированы для всех форм.

просто добавьте следующий блок в свой проект, и все формы будут иметь границу Windows, без необходимости устанавливать его явно для каждой формы.

unit WinBorder;

interface

uses
  Winapi.Windows,
  Winapi.Messages,
  Vcl.Themes,
  Vcl.Controls,
  Vcl.Forms;

type
  TWinBorderFormStyleHook = class(TFormStyleHook)
  protected
    procedure WndProc(var Message: TMessage); override;
  public
    constructor Create(AControl: TWinControl); override;
  end;

implementation

constructor TWinBorderFormStyleHook.Create(AControl: TWinControl);
begin
  inherited;
  OverridePaintNC := false;
end;

procedure TWinBorderFormStyleHook.WndProc(var Message: TMessage);
begin
  inherited;
  if Message.Msg = CM_VISIBLECHANGED then
    begin
      if (Control is TCustomForm) and (seBorder in TCustomForm(Control).StyleElements) then
        TCustomForm(Control).StyleElements := [seFont, seClient];
    end;
end;

initialization

  TCustomStyleEngine.UnRegisterStyleHook(TCustomForm, TFormStyleHook);
  TCustomStyleEngine.UnRegisterStyleHook(TForm, TFormStyleHook);
  TCustomStyleEngine.RegisterStyleHook(TCustomForm, TWinBorderFormStyleHook);
  TCustomStyleEngine.RegisterStyleHook(TForm, TWinBorderFormStyleHook);

finalization

  TCustomStyleEngine.UnRegisterStyleHook(TCustomForm, TWinBorderFormStyleHook);
  TCustomStyleEngine.UnRegisterStyleHook(TForm, TWinBorderFormStyleHook);
  TCustomStyleEngine.RegisterStyleHook(TCustomForm, TFormStyleHook);
  TCustomStyleEngine.RegisterStyleHook(TForm, TFormStyleHook);

end.