Исключить стили VCL из диалога стилей / границ ShowMessage
есть ли способ исключить стили VCL из стиля границы системных диалогов.
Sepecifically диалог, который отображается путем вызова MessageDlg или ShowMessage.
Я прочитал несколько статей о "дороге в Дельфы" (которая является отличным сайтом кстати), но не смог найти ответ.
вот чего я хочу добиться:
теперь (стиль углерода со стилизованными границ):
цель (стиль углерода со стандартными окнами границы):
Я все еще хочу иметь элементы управления в стиле, но без стилизованной границы.
удаление seBorder
из родительских форм StyleElements не делает трюк.
спасибо!
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]);
и диалог выглядит так:
чтобы иметь стилизованную форму без границ, вы должны удалить seBorder
из формы StyleElements
собственность.
StyleElements := [seFont, seClient];
но вы должны установить это свойство для каждого форме. Если я правильно понял вас, вы хотите показать диалоговое окно сообщения с границей 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.