Размер системного шрифта.

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4159
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Размер системного шрифта.

Сообщение Mikle » 13.01.2004 (Вт) 14:14

Недавно написал программу, отладил - красота. Потом запустил на другом компьютере - все контролы сползли размер формы другой...
Причена - другой размер фонтов в свойствах системы. Самое неприятное - меняется не все. Например размер картинки остается прежним (PictureBox изменил размер, а свойство Picture, естественно, осталась пиксел в пиксел).
Вижу два способа борьбы:
1. При запуске проверять ScreenTwipPerPixelX (...Y) и соответственно масштабировать все картинки. Не подходит, так как картинки при этом искажаются. Кроме того не все контролы могут менять размер.
2. Менять размеры не картинок, а всех контролов и шрифтов... но это сводит на нет все преимущества визуального программирования.
Как с этим бороться? Как мне кажется, причина в том, что размеры формы хранятся в твипах, а не пикселах.


vbskb_font vbskb_size vbskb_fontsize

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4159
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 18.01.2004 (Вс) 15:44

Нашел вариант:
Код: Выделить всё
Dim c As Control
  On Local Error Resume Next
  Me.Width = 604 * Screen.TwipsPerPixelX
  Me.Height = 404 * Screen.TwipsPerPixelY
  For Each c In Controls
    c.FontSize = c.FontSize * Screen.TwipsPerPixelX / 15
    c.Left = c.Left * Screen.TwipsPerPixelX / 15
    c.Width = c.Width * Screen.TwipsPerPixelX / 15
    c.Top = c.Top * Screen.TwipsPerPixelY / 15
    c.Height = c.Height * Screen.TwipsPerPixelY / 15
  Next c

это вставляю в Form_Load.
Третья и четвертая строки явно указавают размер формы в пикселах.
15 - это Screen.TwipsPerPixel на момент редактирования. Некорректно масштабирует Label с AutoSize=True. Не очень точно шрифты, но жить можно. :wink:

Юстас
Бывалый
Бывалый
 
Сообщения: 200
Зарегистрирован: 24.10.2003 (Пт) 5:05

Сообщение Юстас » 18.01.2004 (Вс) 20:56

Если обратить внимание на одну неточность в вопросе, то многое станет понятно.
>причина в том, что размеры формы хранятся в твипах, а не пикселах.

Причина не в этом, а в том, что не надо мешать в кучу твипы и пикселы.

Твип - единица измерения длины(как см, м, дюйм и т.д.)
Пиксель - единица измерения разрешающей способности устройства отображения (в данном случае монитора)
Если это учитывать, то всё становится на свои места.[/u]

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4159
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 19.01.2004 (Пн) 14:25

По-моему я не смешиваю, а противопоставляю. Кстати твип настолько же отличен от метрических единиц, как и пиксел.
А чтобы убедиться, что размеры формы хранятся в твипах, достаточно открыть .frm файл блокнотом.
Задавая вопрос, я надеялся, что есть какая-нибудь опция в настройках бейсика, либо команда (типа Option Explicit или Option Base).

Юстас
Бывалый
Бывалый
 
Сообщения: 200
Зарегистрирован: 24.10.2003 (Пт) 5:05

Сообщение Юстас » 19.01.2004 (Пн) 17:18

Твип - не метрическая, (так же как и дюйм, ярд и т.д.) но всё таки [u]мера длины[/u]
и равен он 1/1440 дюйма. При любой погоде и в любое время суток.
А пиксел мерой длины не является. Иначе как понять - сегодня монитор 800 пикселей, а завтра - 1024. Он что вытягивается в ширину, что-ли, твой монитор??? Пиксель величина переменная и поэтому мерой длины быть не может.
Что касается размеров шрифтов, то для точного сохранения их размеров я делаю так : (ctl.Font.Size=ctl.Font.Size/15)*ScreenTwipsPerPixel (если проект начал разрабатываться при обычном размере системного шрифта - 96 точек)
Причём именно Font.Size а не FontSize. Разница принципиальная. И ещё один момент. Если начал разрабатывать проект при одном значении размера системного шрифта, то не изменяй размеров шрифтов контролов, если вдруг переключился на другой размер системного шрифта, иначе всё поползет. Например, TextBox с Font Verdana 8, созданый при системном шрифте 96 точек/дюйм и высотой к примеру 300 твип, при попытке даже просто посмотреть размер этой самой верданы в IDE при системном шрифте 120 точек/дюйм, даже не изменяя его, автоматом вырастет в пропорции 120/96. А высота самого TextBox изменится под новый размер шрифта, при том, что его длина останется прежней, отсюда и сползание контролов и потеря части информации, отображаемой в TextBox. Если возникла необходимость переключиться на другой размер системного шрифта, то никак нельзя даже касаться курсором свойства Font в окошке просмотра свойств того или иного контрола.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4159
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 19.01.2004 (Пн) 18:25

Режим экрана 800*600.
В Debug набираю:
? Screen.TwipsPerPixelX
получаю: 15

Меняю на 640*480
В Debug набираю:
? Screen.TwipsPerPixelX
получаю: 15

размер твипа изменился. Не спорю, при печати на принтере он действительно равен 1/1440 дюйма.
На счет Font.Size и FontSize, если не трудно, объясни разницу.
А проект я и не пытаюсь поочередно разрабатывать в разных режимах
TwipsPerPixel. Мне нужно, чтобы он, будучи откомпилирован, не зависел от этого параметра.

Юстас
Бывалый
Бывалый
 
Сообщения: 200
Зарегистрирован: 24.10.2003 (Пт) 5:05

Сообщение Юстас » 20.01.2004 (Вт) 1:06

Стоп, не надо путать помидоры с яйцами

В Debug набираю:
? Screen.TwipsPerPixelX
получаю: 15

ИМЕННО:TwipsPerPixelX заметь, не Twip а TwipsPerPixelX. Количество твип осталось прежним. Изменяется количество пикселей с 800 до 640 и заодно TwipsPerPixelX. А если сделаешь Debug.Print Me.Width, то оно будет одинаковым, независимо от разрешения экрана. Грубый пример: Если взять лист бумаги А4, то его ширина 210 мм. Если ты будешь его рассматривать в лупу, то естественно он уйдет за пределы видимости окуляра, но тем не менее, его ширина останется 210 мм. Так же и с формой (или любым контролом). Изменяя разрешение экрана с 800 до 640, ты смотришь на форму как-будто через лупу. И чтобы вернуть форме привычный глазу размер (при том, что фактические размеры формы остались прежними), приходится масштабировать, т.е. удалять объект от окуляра.

Теперь, по поводу FontSize и Font.Size
Совершенно разные понятия, хотя и пишется почти одинаково. Когда у меня была такая же проблема, сначала попробовал FontSize. Но ничего хорошего не вышло. Потом попробовал Font.Size и всё стало на место. В чём разница, я так и не понял, возможно это как-то связано с понятием TextHeight - не знаю. Просто опытным путём нашёл нужное решение и пользуюсь им.
Кстати, TextHeight тоже проблему не решает. И например, когда при смене размера системного шрифта с 96 на 120 точек у меня всё вылезало за пределы текстовых полей и кнопок, то с коррекцией Font.Size размеры совершенно одинаковы. Хотя TwipsPerPixelX изменился с 15 до 12.
В общем пользуюсь такой же функцией по ресайзу контролов, как ты написал, только дополненой ресайзом шрифтов. Единственный контрол, который почему-то не хочет слушаться - это комбобокс. Приходится устанавливать его позиции отдельно, вне цикла, и привязывать к каким-либо ориентирам на форме (другие контролы, край формы и т.д.)
А компилированый файл всё равно будет зависеть от TwipsPerPixelX, и чтобы сохранять размеры, приходится масштабировать, либо не пользоваться лупой :)))

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4159
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 20.01.2004 (Вт) 14:23

А если сделаешь Debug.Print Me.Width, то оно будет одинаковым, независимо от разрешения экрана

Я имел ввиду несколько другое.
screen.Width при изменении видеорежима либо размера системных шрифтов меняется, хотя монитор как был 15', так и остался. Но если рассматривать его как лупу - все стало на свои места.
В общем пользуюсь такой же функцией по ресайзу контролов, как ты написал, только дополненой ресайзом шрифтов.

...А я надеялся...
Благодарю за участие.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот и гости: 7

������ �����������   TopList