По наклонной

Источник: codingclub

Многие текстовые редакторы и даже некоторые электронные таблицы - не буду говорить какие, сами догадайтесь - позволяют вводить текст не только горизонтально, но и под некоторым углом. Привыкнув к подобной свободе действий, пользователь Дельфи с недоумением убеждается, что привычная вольница невозможна: текст везде, где можно его разместить - например, метка или канва формы - располагается параллельно земной поверхности. Однако такое впечатление обманчиво. Я попытаюсь рассказать, каким образом можно получать наклонный текст в Делфях. Правда, я не знаю, зачем это может быть нужно, кроме как для хохмы ради.

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

Теперь подробнее. Изменение фонта с обычного на наклонный можно привязывать к разным событиям. То ли вы рассматриваемую процедуру навесите на кнопочку, и все случится по нажатию, то ли вы прикрепите в событие OnShow формы, и изменение фонта произойдет сразу же, как только форма появится на экране, - дело хозяйское, не важно. Тот кусок кода, который с последующими комментариями я приведу ниже, я прицепила на кнопочку (Button4), принадлежащую форме Form1.

procedure TForm1.Button4Click(Sender: TObject);
var
 LgFnt : TLogFont;
 Fnt  : TFont;
begin
 Form1.Canvas.Font.Name := 'Arial';
 Form1.Canvas.Font.Size := 18;
 Fnt := TFont.Create;
 Fnt.Assign(Form1.Canvas.Font);
 GetObject(Fnt.Handle, sizeof(LgFnt), @LgFnt);
 LgFnt.lfEscapement := 180;
 LgFnt.lfOrientation := 180;
 if fsBold in Fnt.Style then
 LgFnt.lfWeight     := FW_BOLD
  else
  LgFnt.lfWeight     := FW_NORMAL;
  LgFnt.lfItalic      := Byte(fsItalic in Fnt.Style);
  LgFnt.lfUnderline    := Byte(fsUnderline in Fnt.Style);
  LgFnt.lfStrikeOut    := Byte(fsStrikeOut in Fnt.Style);
  LgFnt.lfCharSet     := DEFAULT_CHARSET;
  StrPCopy(LgFnt.lfFaceName, Fnt.Name);
  LgFnt.lfQuality     := DEFAULT_QUALITY;
  LgFnt.lfOutPrecision   := OUT_DEFAULT_PRECIS;
  LgFnt.lfClipPrecision  := CLIP_DEFAULT_PRECIS;
  case Fnt.Pitch of
   fpVariable : LgFnt.lfPitchAndFamily := VARIABLE_PITCH;
   fpFixed  : LgFnt.lfPitchAndFamily := FIXED_PITCH;
  else
   LgFnt.lfPitchAndFamily := DEFAULT_PITCH;
  end;
 Fnt.Handle := CreateFontIndirect(LgFnt);
 Form1.Canvas.Font.Assign(Fnt);
 Form1.Canvas.Font.color:=clNavy;
 Fnt.Free;
 Form1.Canvas.TextOut(30,60,'Super!');
end;
 
Вначале мы объявляем переменные типа Tfont и TlogFont. Если первая понятна и знакома (тип шрифта), то тип номер два нам в диковинку.

В теле самой процедуры вначале устанавливается текущий шрифт формы - наименование и размер. Обращаю внимание на наименование шрифта - оный должен быть не иначе как True Type. Затем создаем объект типа шрифта и присваиваем ему значение - при помощи команды Assign требуем, чтобы новый шрифт был таким же, как и текущий шрифт формы.

Теперь начинаем заполнять структуру типа TlogFont. Величины lfEscapement и lfOrientation должны быть равны между собой и равны углу отклонения от базовой линии фонта. Измеряется угол в десятых долях градуса. После установки угла перерисовываем параметры из основного фонта формы в тот, который мы заполняем. В принципе, эти операторы можно и пропустить, просто привожу их на тот случай, если кому вдруг пригодится. В операторе IF определяем, жирный у нас будет шрифт или нет. Вариантов, на самом деле, куда больше - тонкий, очень жирный и т. д. Параметры lfItalic и lfUnderline, по-моему, понятны - они описывают наклонность и подчеркнутость. LfStrikeOut - это перечеркнутость. LfCharSet'ов имеется великое множество - от нашего русского до арабского и еврейского. Правда, последние доступны только в Винде 2000 и NT.

После указания параметров мы создаем шрифт с помощью функции CreateFontIndirect, специально предназначенной для создания шрифта согласно заранее установленным свойствам - структуре, которую мы только что заполнили. Эта функция возвращает хэндл фонта, который мы немедленно присваиваем хэндлу нашей переменной типа Tfont. Потом при помощи команды Assign мы утверждаем, что шрифт канвы формы будет таким же, как фонт, только что созданный нами, и окрашиваем его в выбранный цвет - команда color. Переменную Fnt освобождаем - она вспомогательная и, наконец, при помощи функции TextOut выводим надпись «Super!» в точке канвы формы с координатами (30,60). Эта функция даже в хелпе по Делфи есть.

 


Страница сайта http://www.interface.ru
Оригинал находится по адресу http://www.interface.ru/home.asp?artId=3151