Resiser

Добрый день всем!
Задался целью автоматического растяжения элементов формы в зависимости от изменения размеров формы
Тема эта поднималась не раз. Пересмотрел решения которые нашел - но что-то так подходящего не нашел.
Поэтому прощу помочь разобраться - может что-то упустил. Может кому будет интересна эта тема.
1) Создавал формы, накидывал элементы. Обычно требовалось 2 элемента - журнал + карточка
Но часто пользователи стали промахиваться мышкой мимо карточки и не могут ее найти, так как карточка не modal и не ontop
Если размер карточки приближался к размером экрана - то логично и ее развернуть на весь экран.
Конечно WindowState=2 и как бы проблема решена - но некрасиво. Зато программа стала как браузер с web-страницами.
2) Начал устанавливать элементам растяжки с помощью Anchor. По ширине растянуть это еще как-то нормально - только текстовые поля стали шире. А вот поля для ввода Spinner и Date тут выглядят как-то не пропорционально. Шрифт тот же. Но при этом карточка информативно заполнена сверху густо, а внизу пусто.
3) Начал растягивать кроме ширины еще и по высоте. В первую очередь все элементы разделил на статичные и резиновые. Тоесть Grid, поля EditBox cтали растягиваться чтобы заполнить заполнить что можно. А Остальные элементы прикелеены к краям формы. Шрифт тот же - но информация растянута на весь экран - но не пропорционально.
4) Теперь решил растянуть все элементы по всей ширине экрана пропорционально. Свойство anchor позволило быстро это сделать. Теперь элементы красиво лежат на всей форме - но вот текст внутри остался мелкий. Вот тут и потребовалось увеличить шрифт.
О размере элемента и шрифта когда я его накидывал на форму знаю всё: Height, FontSize, FontName известно все
Когда форма запущина - известен элемент, а вот шрифт остался тот же
[b]Вроде задача простая: был элемент высотой 21 и шрифт 9. Растянулся по высоте до 42. Вопрос какой должен быть размер шрифта?[/b]
5) Изучил функцию FONTMETRIC в надежде найти связь между шрифтом и высотой
[code]
FONTMETRIC(1_) - Высота символа в пикселах
FONTMETRIC(2_) - Высота надстрочного элемента символа (над базовой линией) в пикселах
FONTMETRIC(3_) - Глубина подстрочного элемента символа (под базовой линией) в пикселах
FONTMETRIC(4_) - Межстрочный интервал в пикселах
FONTMETRIC(5_) - Дополнительный межстрочный интервал в пикселах*[/code]
[attachment 36197 11.png]
[code]cStyle = IIF(.FontBold,"B","")
cStyle = IIF(.FontItalic,cStyle + "I",cStyle)
cStyle = IIF(.FontOutline,cStyle + "O",cStyle)
cStyle = IIF(.FontShadow,cStyle + "S",cStyle)
cStyle = IIF(.FontStrikethru,cStyle + "-",cStyle)
cStyle = IIF(.FontUnderline,cStyle + "U",cStyle)
nFontHeight = FONTMETRIC(1, .FontName, .FontSize, cStyle )
[/code]
Можно получить размер текст в зависимости FontName, FontSise + Style
Но не понял как найти отступ от текста до края элемента.
То есть зная эти параметры можно найти высоту шрифта (пример 15).
Но как найти высоту элемента? (он должен быть 17)
Можно запросить FONTMETRIC(5_) Дополнительный межстрочный интервал - но он 0, а не 1 ?
6) [b]Задача наоборот - зная высоту элемента Height, найти размер шрифта fontSize которые по размеру даст этот размер?[/b]
Для решения этой задачи есть ряд примеров RESIZERов.
- RESIZER выполняют в виде Customs который накидывают на форму.
- При запуске формы RESIZER пробегает по всем элемента формы и запоминает оригинальные размеры Height + Widtn каждого элемента.
- А в методе RESIZE() самой формы вставляют вызов метода, который считывает текущие параметры элементов, затем вычисляет коэффициент растяжки Ratio и на его основе в такой же равномерной пропорции завышает размер шрифта FontSizeNew=FontSizeOriginal*Ratio
И этот ньюанс срабатывает пока величины маленькие, и по мере увеличения элемента этот перекос все больше бросается в глаза
[attachment 36198 33.png]
7) Если разработка формы велась на мониторе 800х600 то есть соотношение формы 4х3. То пользователи будут открыть эту форму на разных мониторах, ноутбуках и с другими соотношениями. Форма будет растягиваться более растянута по высоте, или более по ширине.
Как себя должен вести шрифт?
Дело в том что при разработке программист закладывал одни пропорции между элементом и шрифтом. А у пользователя придется выбирать:
- при более узком мониторном соотношение - шрифт будет вылезать за рамки элемента справа. Но при этом высота шрифта равномерна впишется по высоте элемента
- при более узком мониторном соотношение - шрифт будет займет всю ширину элемента чтобы было видно весь текст. Но при этом шрифт придется уменьшить по высоте.

0

Автор публикации

Пользователи не найдены
Оставить комментарий
Авторизация
*
*
Генерация пароля