Поворот компонентов VCL в Delphi XE2
Теперь я адаптирую свое приложение для планшетных ПК. Я спрашиваю, как я могу исправить форму, когда экран был повернут. Хорошие люди говорят, что я должен адаптировать свое приложение для книжной ориентации, и они правы.
Некоторые формы очень специфичны, и их очень трудно (возможно, невозможно) перепроектировать для портретной ориентации. Поэтому я думаю, что могу создать иллюзию, что мое приложение работает только в горизонтальной ориентации.
Вот почему мне нужно повернуть стандартные компоненты VCL в Delphi XE2. Например, для стандартной заметки мне нужно написать текст не только слева направо (или справа налево), но и сверху вниз (и снизу вверх).
Также мне нужно повернуть кнопку. Сейчас я использую стандартные TButton и TRxSpeedButton.
Я думаю достаточно, чтобы повернуть текст для TButton, но я не знаю, как я могу это сделать?
В случае TRxSpeedButton я использую глифы. В теории, может быть, я могу переопределить холст и изменить рис. Другой способ - создать 2 кнопки (одну для портретной ориентации, одну для альбомной ориентации. У каждой будет свой особый глиф) и изменить их видимость. Но мне не нравится второй вариант, потому что в этом случае exe-файл будет очень пухлым, я не люблю пухлый exe))
Спасибо за советы.
4 ответа
У вас нет реальных шансов сделать это с помощью стандартных элементов управления VCL. Элементы управления VCL не имеют режима, который позволяет им поворачиваться на 90 градусов. Я не вижу легкой перспективы сделать так, чтобы любой элемент управления, отображающий текст, поворачивался. Это просто вывод текста. Как насчет ввода текста? Существует также проблема теней и 3D-эффектов, которые основаны на определенной ориентации. У этого списка нет конца.
На мой взгляд, если вы хотите, чтобы это работало хорошо, вам почти наверняка понадобится написать весь графический интерфейс с нуля.
Несмотря на то, что это очевидно, сделать это не представляется реалистичным, если отбросить альтернативу заставить ваше приложение работать как в портретной, так и в альбомной ориентации.
У вас нет шансов с подходом поддельного ландшафта.
Есть три решения для вашей проблемы:
Лучший вариант - заставить ваше приложение работать с любой комбинацией размеров экрана и ориентации. Это способ Windows.
Если ваше приложение "должно" работать в ландшафтном режиме, сообщите пользователям, когда вы обнаружите неправильную ориентацию, это приложение работает только в ландшафтном режиме. Покажите либо окно сообщения, либо специальную форму с сообщением, которое нельзя пропустить, пока вы скрываете другие формы, или что-то в этом роде.
Блокировка устройства в ландшафтном режиме, как описано в разделе Как предотвратить автоматическое вращение экрана на планшете? Но вы должны знать, что Windows не предназначена для использования в режиме рабочего стола.
VCL не был создан для этого, поэтому я не вижу, чтобы это происходило без большой работы, проделанной на уровне представления RTL.
Были скины движков, которые были способны на это, но они по сути исправили RTL и взяли на себя рендеринг. Данные ротации содержались в таблице соответствия для каждого элемента управления, который вы должны были установить отдельно от фактического класса.
Если бы Delphi поддерживал частичные классы, как это делает Smart Pascal, то, возможно (если архитектура это позволяла), это можно было бы исправить. Но на момент написания VCL просто не для этого. Я пишу библиотеку твининга, когда набираю это, поэтому я изучил это.
Один из способов, который может сработать для вас, - это использовать PaintTo
метод различных контролей. Попросите их нарисовать полностью нарисованное изображение на растровом изображении, а затем поверните растровое изображение на 90 градусов, чтобы получить эффект портрета и ландшафта. Затем нарисуйте это изображение на холсте вашей формы в его OnPaint
метод (вы хотели бы сделать фактические элементы управления невидимыми в портретном режиме, показывая только ваши нарисованные и повернутые растровые изображения.)
Есть несколько элементов управления (например, TRichEdit
) чья PaintTo
Метод не работает правильно, хотя. Так что это может иметь ограниченное применение для вас. Другой способ - захватить снимок экрана всей клиентской области формы на рабочем столе, а затем повернуть и отобразить его. это работает даже с TRichEdit
...