Четверг, 02.05.2024
Королевство Delphi
Главное меню
Статьи
Наш опрос
Нужен форум на сайте?
Всего ответов: 90
Статистика
Онлайн всего: 1
Гостей: 1
Пользователей: 0
Форма входа
Главная » Статьи » Система » Текст

Защита приложений от крупных шрифтов

Вы когда-нибудь проверяли как будет выглядеть написанная вами с такой любовью программа с системе с крупными шрифтами? Согласитесь, это неприглядное зрелище. Наползающие друг на друга метки и поля редактирования, надписи, которые заканчиваются где то за пределами формы и т.п. После этого появляется неконтролируемая неприязнь к пользователям, которые предпочитают режим крупных шрифтов. Но это их право. И ваша проблема.

Вы наверняка задавались вопросом о том, как избежать искажений. И находили в сети одни и те же рецепты: использовать шрифты TrueType и отключать свойство Scaled у форм. Рецепт, предлагающий использовать только шрифты TrueType + Scaled = False для форм - верен. Однако тут есть некоторые неудобства.
Дело в том, что ни один из стандартных TrueType шрифтов не сравнится по качеству отображения с MS Sans Serif, который по умолчанию используется в вашем приложении. Самый близкий - Arial все же имеет довольно заметные отличия и проигрывает MS Sans Serif по читаемости.

Искажений форм так же полностью избежать не удастся. Особенно это может повлиять на компоновку сложных форм, а также при использовании в интерфейсе изображений и прочих немасштабируемых элементов. Иногда хочется просто запретить масштабирование и защитить программу от влияния крупных шрифтов. Но использовать MS Sans Serif в этом случае нельзя, так как в режиме крупных шрифтов система "сдвигает" их на 2 пункта вверх и шрифт 8pt MS Sans Serif выглядит как 10pt MS Sans Serif при мелких шрифтах.

Для справки: В режиме стандартных размеров шрифтов в качестве системного используется, в основном, MS Sans Serif - рубленый шрифт без засечек. Он имеет размеры 8pt, 10pt, 12pt, 14pt, 18pt и 24pt. В основном используется размер 8pt. В режиме крупных шрифтов система увеличивает все шрифты на 120%. ( С 96 pixels per inch до 120 pixels per inch). Шрифт MS Sans Serif имеет всего 6 размеров. Поэтому 8pt становится 10pt, 10pt - 12pt и т.д. Шрифт 8pt MS Sans Serif выглядит как 10pt MS Sans Serif при мелких шрифтах. Шрифты же TrueType могут имеют произвольные размеры и шаг изменения равен 1pt. Поэтому при крупных шрифтах размеры TrueType и не-TrueType шрифтов изменяются по разному.

Предлагаемое решение способно защитить программу от влияния режима крупных шрифтов и не отказываться от шрифта MS Sans Serif при разработке программы. Подход состоит в том, чтобы заменять все шрифты MS Sans Serif на Arial при запуске программы при крупных шрифтах. Создавать программу, естественно, следует при мелких шрифтах.

Можно написать невизуальный компонент и добавить его на каждую форму. Компонент при загрузке проверяет режим и при обнаружении режима "Big Fonts" "обходит" все визуальные компоненты для замены шрифта. Также компонент заботится о том, чтобы свойство Scaled у форм было отключено.

unit glSmallFontsDefence; 
 
interface 
 
uses 
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs; 
 
type 
 TglSmallFontsDefence = class(TComponent) 
 private 
 procedure UpdateFonts(Control: TWinControl); 
 { Private declarations } 
 protected 
 procedure Loaded; override; 
 public 
 constructor Create(AOwner: TComponent); override; 
 published 
 { Published declarations } 
 end; 
 
procedure Register; 
 
implementation 

function IsSmallFonts: boolean;{Значение функции TRUE если мелкий шрифт} 
var DC: HDC; 
begin 
 DC:=GetDC(0); 
 Result:=(GetDeviceCaps(DC, LOGPIXELSX) = 96); 
 { В случае крупного шрифта будет 120} 
 ReleaseDC(0, DC); 
end; 
 
procedure Register; 
begin 
 RegisterComponents('Gl Components', [TglSmallFontsDefence]); 
end; 
 
{ TglSmallFontsDefence } 
 
constructor TglSmallFontsDefence.Create(AOwner: TComponent); 
begin 
 inherited; 
 if (Owner is TForm) then (Owner as TForm).Scaled := false; 
end; 
 
procedure TglSmallFontsDefence.Loaded; 
begin 
 inherited; 
 if (Owner is TForm) then (Owner as TForm).Scaled := false; 
 if csDesigning in ComponentState then 
 begin 
 if not IsSmallFonts then 
 ShowMessage('Проектирование приложения в режиме крупных' +
 ' шрифтов недопустимо!'#13#10+
 'Компонент TglSmallFontsDefence отказывается' +
 ' работать в таких условиях.'); 
 end else 
 UpdateFonts((Owner as TForm)); 
end; 
 
procedure TglSmallFontsDefence.UpdateFonts(Control: TWinControl); 
var 
 i: integer; 
 procedure UpdateFont(Font: TFont); 
 begin 
 if CompareText(Font.Name, 'MS Sans Serif') <> 0 then exit; 
 Font.Name := 'Arial'; 
 end; 
begin 
 if IsSmallFonts then exit; 
 UpdateFont(TShowFont(Control).Font); 
 with Control do 
 for i:=0 to ControlCount-1 do 
 begin 
 UpdateFont(TShowFont(Controls[i]).Font); 
 if Controls[i] is TWinControl then UpdateFonts(Controls[i] as TWinControl); 
 end; 
 
end; 
 
 
end.

Вы можете добавить свойство Options типа перечисления, в котором задать опции исключения некоторых классов компонентов. К примеру, можно добавить возможность отключать замену шрифтов для потомков TCustomGrid. Очень часто пользователи используют режим крупных шрифтов, чтобы улучшить читаемость таблиц данных (TDBGrid). Тогда не надо лишать их этой возможности.

Автор: Андрей Чудин

Получить ссылку на материал

Категория: Текст | Добавил: Барон (20.12.2011)
Просмотров: 1701 | Теги: Шрифт, защита | Рейтинг: 0.0/0
[ Пожертвования для сайта ] [ Пожаловаться на материал ]

Если вам помог материал сайта кликните по оплаченной рекламе размещенной в центре

Поиск
Категории раздела
ActiveX [10]
CORBA и COM [16]
Kol и MCK [23]
WinAPI [28]
Компоненты [27]
Работа с Bluetooth [4]
Железо [8]
Текст [18]
Разное [98]
Королевство Delphi © 2010-2024
Яндекс цитирования