Поворот компонентов VCL в Delphi XE2

Теперь я адаптирую свое приложение для планшетного ПК. Я спрашиваю, как я могу зафиксировать форму при повороте экрана. Хорошие люди говорят, что я должен адаптировать свое приложение для портретной ориентации, и они правы.

Некоторые формы очень специфичны, и их очень сложно (возможно, невозможно) переделать под портретную ориентацию. Поэтому я думаю, что могу создать иллюзию, что мое приложение работает только в альбомной ориентации.

Вот почему мне нужно повернуть стандартные компоненты VCL в Delphi XE2. Например, для стандартной заметки мне нужно писать текст не только слева направо (или справа налево), а сверху вниз (и снизу вверх).

Также мне нужна кнопка поворота. Сейчас использую стандартные TButton и TRxSpeedButton.

  1. Я думаю, достаточно повернуть текст для TButton, но я не знаю, как я могу это сделать?

  2. В случае TRxSpeedButton я использую глифы. Теоретически, возможно, я могу переопределить холст и изменить изображение. Другой способ — создать 2 кнопки (одну для портретной ориентации, одну для альбомной. Каждая из них будет иметь свой особый глиф) и изменить их видимость. А вот второй вариант мне не нравится, т.к. в этом случае exe файл будет очень пухлым, я не люблю пухлый exe))

Спасибо за советы.


person 0xFF    schedule 13.12.2014    source источник
comment
Если вам действительно нужно заблокировать приложение в ландшафтном режиме, посмотрите stackoverflow.com/questions/16093502/   -  person Dalija Prasnikar    schedule 13.12.2014


Ответы (4)


У вас нет реальных шансов выполнить эту работу, используя стандартные элементы управления VCL. Элементы управления VCL не имеют режима, позволяющего поворачивать их на 90 градусов. Я не вижу легкой перспективы сделать так, чтобы любой элемент управления, отображающий текст, был повернут. Это просто вывод текста. Что с вводом текста? Существует также проблема теней и 3D-эффектов, основанных на определенной ориентации. У этого списка нет конца.

На мой взгляд, если вы хотите, чтобы это работало хорошо, вам почти наверняка потребуется написать всю структуру графического интерфейса с нуля.

Хотя очевидно, что это возможно сделать, это не кажется реалистичным выбором, если оставить в стороне альтернативу, заключающуюся в том, чтобы ваше приложение работало как в портретной, так и в альбомной ориентации.

person David Heffernan    schedule 14.12.2014

У вас нет шансов с искусственным ландшафтным подходом.

У вашей проблемы есть три решения:

  1. Лучший — заставить ваше приложение работать с любой комбинацией размера экрана/ориентации. Это путь Windows.

  2. Если ваше приложение «должно» работать в ландшафтном режиме, сообщите пользователям, когда вы обнаружите неправильную ориентацию, что приложение работает только в ландшафтном режиме. Покажите либо окно сообщения, либо специальную форму с сообщением, которое нельзя пропустить, пока вы прячете другие свои формы, или что-то в этом роде.

  3. Заблокируйте устройство в ландшафтном режиме, как описано в Как чтобы предотвратить автоматический поворот экрана на планшете? Но вы должны знать, что это не тот способ, которым Windows предназначена для использования в режиме рабочего стола.

person Dalija Prasnikar    schedule 14.12.2014

VCL не был создан для этого, поэтому я действительно не вижу, чтобы это произошло без серьезной работы над уровнем представления RTL.

Были созданы скины, которые были способны на это, но они, по сути, исправили RTL и взяли на себя рендеринг. Данные о повороте хранились в таблице поиска для каждого элемента управления, который нужно было устанавливать отдельно от фактического класса.

Если бы Delphi поддерживала частичные классы, как это делает Smart Pascal, то, возможно (если бы архитектура позволяла это) это можно было бы добавить в постфикс. Но на момент написания VCL просто не был создан для этого. Я пишу библиотеку анимации, пока печатаю это, поэтому я изучил это.

person Jon Lennart Aasenden    schedule 09.09.2018

Один из способов, который может сработать для вас, — это использовать метод PaintTo для различных элементов управления. Попросите их нарисовать свое полностью нарисованное изображение на растровом изображении, а затем повернуть растровое изображение на 90 градусов, чтобы получить эффект портрета и пейзажа. Затем нарисуйте это изображение на холсте вашей формы в его методе OnPaint (вы хотели бы сделать фактические элементы управления невидимыми в портретном режиме, показывая только ваши нарисованные и повернутые растровые изображения).

Однако есть некоторые элементы управления (например, TRichEdit), метод PaintTo которых работает неправильно. Так что это может иметь ограниченную пользу для вас. Другой способ — сделать снимок экрана всей клиентской области формы на рабочем столе, а затем повернуть и отобразить его. это работает даже с TRichEdit...

person Al The Developer    schedule 13.12.2014
comment
вот URL-адрес отличного кода поворота изображения: ссылка - person Al The Developer; 13.12.2014
comment
Я только что понял, что вам также придется выполнять поиск щелчком мыши в портретном режиме и отправлять его в различные элементы управления, что является серьезной работой и очень сложной с элементами управления типом редактирования. Так что это безнадежный комментарий, вероятно, основан на этом. Это все еще может быть выполнимо, но это потребует серьезной работы. вы можете попробовать найти сторонние элементы управления vcl, которые поддерживают ротацию; я считаю, что есть несколько там. - person Al The Developer; 13.12.2014
comment
Спасибо за советы. Возможно, я найду нужные сторонние элементы управления vcl, которые мне помогут. - person 0xFF; 13.12.2014
comment
Не уверен, почему кто-то проголосовал за это, на самом деле это единственный реальный способ решить эту проблему. Та же самая техника использовалась различными двигателями скининга на протяжении многих лет. Хотя можно сказать, что это непрактический ответ, он действительно перечисляет факты и использует некоторую сложность, связанную с добавлением информации о вращении и угле в VCL. Я проголосовал за это, и другие должны. - person Jon Lennart Aasenden; 09.09.2018