Если вам не нравится, как выглядит стандартный MessageBox или просто захотелось немного оригинальности в своём приложение, то можно создать кастомный MessageBox. В этой заметке я расскажу, как это сделать.
UPD. Добавляем плавность и тень, используем TFloatAnimation и TShadowEffect
UPD. Добавляем плавность и тень, используем TFloatAnimation и TShadowEffect
Upd (21.04.14). Проверено на Delphi XE6
Для начала создадим пустое приложение.
На форму положим компонент TRectangle(Rectangle1) (Вкладка Shapes) и изменим свойства:
- Выравнивание - Align: alContents
- Прозрачность - Opacity: 0,5
- Фон - Fill->Color: Black
- Visible := False;
В итоге выглядеть это будет так:
Далее кладём на форму ещё один TRectangle, это будет наше кастомное окно. Т.к. мы используем компонент TRectangle, то и изменять можем очень много свойств (фон, прозрачность, закругление краёв и т.д. и т.п.) влияющих на отображение. На TRectangle можем поместить любые компоненты(Label, Edit и т.д.).
Приведу пример такого окна:
Выставляем у второго TRectangle(Rectangle2) свойства:
- Align: alCenter
- Height: 170
- Width: 230
- Fill->Color: White
- Stroke->Kind: bkNone
- Visible := False;
Далее кладём на Rectangle2 компоненты:
TToolBar, свойства по умолчанию.
Кладём TLabel на TToolBar, свойства:
- Align: alCenter;
- AutoSize: True;
- Text: ‘Введите имя’;
TEdit, свойства:
- Align: alVertCenter;
- Margins-Left: 10;
- Margins-Right: 10;
TLayout, свойства:
- Align: alBottom
На TLayout, кладём две кнопки:
TSpeedButton (SpeedButton1):
- StyleLookup: deletetoolbutton;
- Text: ‘Отмена’;
- Align: alLeft;
- Width: 100
TSpeedButton (SpeedButton2):
- StyleLookup: donetoolbutton;
- Text: ‘Готово’;
- Align: alRight;
- Width: 100
Что получилось:
UPD.
Постарался сделать (на глаз) плавность открытия такой же, как у стандартных MessageBox.
Начнём с тени окна.
Помещаем компонент TShadowEffect в Rectangle2, свойства для изменения:
- Distance: 1
Теперь плавное появление окна.
Чтобы создать ощущение плавного открытия, необходимо добавить эффект анимации (TFloatAnimation) к свойству TRectangle.Opacity.
Начнём с Rectangle1. Выбираем его на панели Structure. Находим свойство Opacity, жмём и выбираем «Create New TFloatAnimation» из выпадающего списка. Теперь меняем свойства у FloatAnimation1:
- Duration: 0,2
- StartValue: 0
- StopValue: 0,5
- PropertyName: Opacity
- Все галочки сняты.
- Trigger: IsVisible=true
- Duration: 0,2
- StartValue: 0,8
- StopValue: 1
- PropertyName: Opacity
- Все галочки сняты.
- Trigger: IsVisible=true
Примечание: Хотите больше плавности, меняйте значения Duration, StartValue, StopValue.
Вопрос для читателей: Как добавить анимацию для закрытия окна?
Теперь код:
Чтобы вызвать наше окно, будем использовать свойство Visible у TRectangle. У меня на форме есть кнопка «ShowMessage» для неё создадим событие OnClick:
procedure TForm1.Button1Click(Sender: TObject); begin Rectangle1.Visible := True; Rectangle2.Visible := True; end;
Кнопкам SpeedButton1 и SpeedButton2 также создадим событие OnClick:
procedure TForm1.SpeedButton1Click(Sender: TObject); begin Rectangle2.Visible := False; Rectangle1.Visible := False; end;
Теперь посмотрим, что получилось в итоге:
Версия без анимации
Версия без анимации
Версия с анимацией
Исходный код (версия без анимации): Скачать с Google Drive
Исходный код (версия с анимацией): Скачать с Google Drive