:: MVP ::
|
|
:: RSS ::
|
|
|
Metropolis – технология, позволяющая приводить VCL приложения к виду Windows 8 по средствам стилизации интерфейса,
доступна начиная с релиза XE3. Поскольку речь идет имеено о стилизации, а не использовании нового API, созданные при
помощи Metropolis приложения будут запускаться не только Windows 8, но и на более ранних версиях. К сожалению, как
это не редко бывает, имитация оказалась немного хуже оригинала.
До этого мне не приходилось разрабатывать софт с расчетом на планшеты, так что я заранее настроился на то, что по
ходу разработки буду спотыкаться о подводные камни. И, к сожалению, я не ошибся...
Первое, с чем пришлось столкнуться – экранная клавиатура не появляется автоматически при получении фокуса ввода
элементом, отвечающим за редактирование текста. По большому счету это вполне ожидаемо, ведь такое поведение не
свойственно десктопным приложениям (а именно такими и являются приложения Metropolis), но попробуйте объяснить
это пользователям. Исправить ситуацию несложно, но об этом как-нибудь в следующий раз, так как и тут не обошлось
без подводных камней.
Второе – эффект смещения окна, если в нем есть скроллируемый контент. Чтобы стало понятнее,
что я имею ввиду, посмотрите на следующее изображение:
В самом эффекте нет ничего плохого, пока речь не заходит о полноэкранных приложениях (а именно такими и являются
приложения Metropolis). Посмотрите на следующее изображение, вы когда-нибудь видели подобное поведение у приложений
Windows 8?
К счастью эта проблема легко устраняется. Мне непонятно только одно, почему разработчики из Embarcadero не
предусмотрели этого в шаблонах приложений Metropolis и не добавили в них несколько строчек кода?
Решение проблемы:
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes,
Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
type
TForm1 = class(TForm)
ListBox1: TListBox;
procedure FormShow(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
procedure WMWindowPosChanging( var Msg: TWMWindowPosChanging ); message WM_WINDOWPOSCHANGING;
public
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
{ TForm1 }
var
X, Y: Integer;
procedure TForm1.FormCreate(Sender: TObject);
var
i: Integer;
begin
Randomize;
for i := 1 to 250 do
ListBox1.Items.Add( IntToStr( Random( 1000 ) ) );
end;
procedure TForm1.FormShow(Sender: TObject);
begin
X := Left;
Y := Top;
end;
procedure TForm1.WMWindowPosChanging(var Msg: TWMWindowPosChanging);
begin
Msg.WindowPos.x := X;
Msg.WindowPos.y := Y;
inherited;
end;
end.
|
Всего лишь запоминаем координаты приложения при старте, а при попытке сдвинуть окно возвращаем его на место.
P.S.
Есть еще один вопрос относительно приложений Metropolis, которым я задаюсь уже давно. При попытке конвертировать
VCL приложение в Metropolis среда разработки предупреждает нас о якобы необратимых изменениях (такой функционал
есть, например, в XE7, а вот 10 Seattle мне его найти не удалось).
Однако сделать “откат” совсем не сложно, буквально в несколько шагов:
- Установить свойству формы BorderStyle значение, отличное от bsNone (например bsSizeble);
- Установить свойству формы WindowState значение wsNormal;
- В настройках проекта (Project Options) на вкладке “Application” – “Appearance” снять все
галочки в группе Custom Style (поле Default Style должно принять значение “Windows”);
- В файле проекта (*.dpr) удалить строчки, относящиеся к Metropolis (например
Application.UseMetropolisUI; и (если есть) TStyleManager.TrySetStyle('Metropolis UI Dark');).
Обратный переход работает не только для сконвертированных приложений, но и для тех, которые изначально
создавались как Metropolis.
P.P.S.
С момента выхода XE3 прошло уже много времени, а возможности создавать приложения Windows 8 (а не их имитацию)
как не было, так и нет. А не помешало бы...
На этом все, поменьше подводных камней!
|
При использовании материала - ссылка на сайт обязательна
|
|