Масштабирование окон в зависимости от разрешения монитора
- В ранней стадии создания приложения решите для себя хотите ли вы
позволить форме масштабироваться. Преимущество немасштабируемой формы в том,
что ничего не меняется во время выполнения. В этом же заключается и
недостаток (ваша форма может бать слишком маленькой или слишком большой в
некоторых случаях).
- Если вы не собираетесь делать форму масштабируемой, установите свойство
Scaled=False и дальше не читайте. В противном случае Scaled=True.
- Установите AutoScroll=False. AutoScroll = True означает не менять размер
окна формы при выполнении что не очень хорошо выглядит, когда содержимое
формы меняет размер.
- Установите шрифты формы на TrueType, например Arial. Если такого шрифта
не окажется на пользовательском компьютере, то Windows выберет
альтернативный шрифт из того же семейства. Этот шрифт может не совпадать по
размеру, что вызовет проблемы.
- Установите свойство Position в любое значение, отличное от poDesigned.
poDesigned оставляет форму там, где она была во время дизайна, и, например,
при разрешении 1280x1024 форма окажется в левом верхнем углу и совершенно за
экраном при 800x600.
- Оставляйте по-крайней мере 4 точки между компонентами, чтобы при смене
положения границы на одну позицию компоненты не "наезжали" друг на друга.
Для однострочных меток (TLabel) с выравниванием alLeft или alRight
установите AutoSize=True. Иначе AutoSize=False.
- Убедитесь, что достаточно пустого места у TLabel для изменения ширины
шрифта - 25% пустого места многовато, зато безопасно. При AutoSize=False
убедитесь, что ширина метки правильная, при AutoSize=True убедитесь, что
есть ссвободное место для роста метки.
- Для многострочных меток (word-wrapped labels), оставьте хотя бы одну
пустую строку снизу.
- Будьте осторожны при открытии проекта в среде Delphi при разных
разрешениях. Свойство PixelsPerInch меняется при открытии формы. Лучше
тестировать приложения при разных разрешениях, запуская готовый
скомпилированный проект, а редактировать его при одном разрешении. Иначе это
вызовет проблемы с размерами.
- Не изменяйте свойство PixelsPerInch!
- В общем, нет необходимости тестировать приложение для каждого разрешения
в отдельности, но стоит проверить его на 800x600 с маленькими и большими
шрифтами и на более высоком разрешении перед продажей.
- Уделите пристальное внимание принципиально однострочным компонентам типа
TDBLookupCombo. Многострочные компоненты всегда показывают только целые
строки, а TEdit покажет урезанную снизу строку. Каждый компонент лучше
сделать на несколько точек больше.
Масштабирование размера шрифтов
Когда программы написанные в Delphi работают на системах с установленными
маленькими шрифтами, получается странный вид формы. К примеру, расположенные на
форме компоненты Label становятся малы для размещения указанного теста, обрезая
его в правой или нижней части. StringGrid не осуществляет положенного
выравнивания и т.д. Следующий код масштабирует как размер формы, так и размер
шрифтов. Вызывая его в FormCreate можно добиться не плохих результатов.
Приведенная ниже программа масштабирует форму так, чтобы она выглядела
одинаково внезависимости от размера экрана и пикселей на дюйм. Расположенный
ниже участок кода проверяет, отличается ли размер экрана во время выполнения от
размера во время проектирования. Если да, Scaled устанавливается в True и
компоненты снова масштабируются так, чтобы они выводились в той же позиции
экрана, что и во время проектирования.
Так же необходимо проверить, отличается ли размер шрифта во времы выполнения
от размера во время проектирования. Если во время выполнения PixelsPerInch формы
отличается от PixelsPerInch во время проектирования, шрифты снова масштабируются
так, чтобы форма не отличалась от той, которая была во время разработки.
Масштабирование производится исходя из коэффициента, получаемого путем деления
значения font.height во время проектирования на font.height во время выполнения.
Font.size в этом случае работать не будет, так как это может дать результат
больший, чем текущие размеры компонентов, при этом текст может оказаться за
границами области компонента. Например, форма создана при размерах экрана
800x600 с установленными маленькими шрифтами, имеющими размер font.size=8. Когда
вы запускаете в системе с 800x600 и большими шрифтами, font.size также будет
равен 8, но текст будет больше чем при работе в системе с маленькими шрифтами.
Данное масштабирование позволяет иметь один и тот же размер шрифтов при
различных установках системы.
ВАЖНО! : Установите в Инспекторе Объектов свойство Scaled TForm в FALSE.
interface
uses
Forms, Controls;
procedure geAutoScale(MForm: TForm);
implementation
type
TFooClass = class(TControl); //необходимо выяснить защищенность
procedure geAutoScale(MForm: TForm);
const
cScreenWidth: integer = 800;
сScreenHeight: integer = 600;
cPixelsPerInch: integer = 96;
cFontHeight: integer = -11; //В режиме проектирование значение из Font.Height
var
i: integer;
begin
if (Screen.width <> cScreenWidth) or (Screen.PixelsPerInch <> cPixelsPerInch) then
begin
MForm.scaled:= true;
MForm.height:= MForm.height * screen.Height div cScreenHeight;
MForm.width:= MForm.width * screen.width div cScreenWidth;
MForm.ScaleBy(screen.width, cScreenWidth);
end;
if (Screen.PixelsPerInch <> cPixelsPerInch) then
begin
for i:= MForm.ControlCount - 1 downto 0 do
TFooClass(MForm.Controls[i]).Font.Height:=
(MForm.Font.Height div cFontHeight) *
TFooClass(MForm.Controls[i]).Font.Height;
end;
end;
end.
|