Разработка сайтов и программного обеспечения, системное администрирование, обучение программированию и работе с СУБД MySQL

in english

Вывод текста под углом [C++Builder/Delphi]

Главная Статьи Вывод текста под углом

Иногда задают вопрос: "Как выдать текст под наклоном?". Вот ответ:

Пример, демонстрирующий вывод текста под углом. Для просмотра понадобится форма, кнопка и компонент CSpinEdit1. Чтобы вывести под любым углом текст необходимо использовать TrueType Fonts (например "Arial").

C++Builder Example

Обработчик события OnClick:

 LOGFONT lf;                         // определяем структуру шрифта
 Canvas->Brush->Style = bsClear;     // устан прозрачный стиль кисти
 ZeroMemory(&lf, sizeof(LOGFONT));   //очищаем память
  lf.lfHeight = 20;                  // высота шрифта (размер подбирается системой)
  lf.lfEscapement = CSpinEdit1->Value*10 ; // угол поворота например: 45*00" = 450
  lf.lfOrientation = 900;              // ориентация  в десятых долях градуса
                                       // под WinXP почему-то не работает :(
  lf.lfCharSet = DEFAULT_CHARSET;       // набор символов
  strcpy(lf.lfFaceName, "Times New Roman");       // шрифт
  Canvas->Font->Handle = CreateFontIndirect(&lf); // создаем из структуры хэндл 
					     // и устанавливаем его текущим
  Canvas->TextOut(300, 300, "--------      Rotated text "+
  IntToStr(lf.lfEscapement));           // выводим текст на холст (канву)

На экран вывдится текст под углом указанном в компоненте CSpinEdit1

Delphi Example
 var
  LogFont : TLogFont;

 ...
  GetObject(Canvas.Font.Handle, SizeOf(TLogFont), @LogFont);
  { Вывести текст 1/10 градуса против часовой стрелки }
  LogFont.lfEscapement := CSpinEdit1.Value*10; 
  Canvas.Font.Handle := CreateFontIndirect(LogFont);
  Canvas.TextOut(300, 300, " Rotated text ");

Краткое описание cтруктуры LOGFONT

typedef struct tagLOGFONT { // lf  
   LONG lfHeight;           // высота
   LONG lfWidth;            // ширина
   LONG lfEscapement;       // угол
   LONG lfOrientation;      // ориентация
   LONG lfWeight;           // вес 300-норма 700-жирный
                                FW_DONTCARE	0
                                FW_THIN	100
                                FW_EXTRALIGHT	200
                                FW_ULTRALIGHT	200
                                FW_LIGHT	300
                                FW_NORMAL	400
                                FW_REGULAR	400
                                FW_MEDIUM	500
                                FW_SEMIBOLD	600
                                FW_DEMIBOLD	600
                                FW_BOLD	700
                                FW_EXTRABOLD	800
                                FW_ULTRABOLD	800
                                FW_HEAVY	900
                                FW_BLACK	900
   BYTE lfItalic;           // курсив         true/false
   BYTE lfUnderline;        // подчеркивание  true/false
   BYTE lfStrikeOut;        // перечеркивание true/false
   BYTE lfCharSet;          // набор символов
                                ANSI_CHARSET
                                DEFAULT_CHARSET - по умолчанию
                                SYMBOL_CHARSET
                                SHIFTJIS_CHARSET
                                GB2312_CHARSET
                                HANGEUL_CHARSET
                                CHINESEBIG5_CHARSET
                                OEM_CHARSET
                               Windows 95 only:
                                  JOHAB_CHARSET
                                  HEBREW_CHARSET
                                  ARABIC_CHARSET
                                  GREEK_CHARSET
                                  TURKISH_CHARSET
                                  THAI_CHARSET
                                  EASTEUROPE_CHARSET
                                  RUSSIAN_CHARSET
                                  MAC_CHARSET
                                  BALTIC_CHARSET
   BYTE lfOutPrecision;     // отчетливость, четкость вывода
                                 OUT_CHARACTER_PRECIS
                                 OUT_DEFAULT_PRECIS - по умолчанию
                                 OUT_DEVICE_PRECIS
                                 OUT_OUTLINE_PRECIS
                                 OUT_RASTER_PRECIS
                                 OUT_STRING_PRECIS
                                 OUT_STROKE_PRECIS
                                 OUT_TT_ONLY_PRECIS
                                 OUT_TT_PRECIS
   BYTE lfClipPrecision;    // как будет выполнятся обрезка строки
                                 CLIP_DEFAULT_PRECIS - по умолчанию
                                 CLIP_CHARACTER_PRECIS
                                 CLIP_STROKE_PRECIS
                                 CLIP_MASK
                                 CLIP_EMBEDDED
                                 CLIP_LH_ANGLES
                                 CLIP_TT_ALWAYS
   BYTE lfQuality;          // качество 
                                 DRAFT_QUALITY   - черновое 
                                 PROOF_QUALITY   - улучшенное
                                 DEFAULT_QUALITY - по умолчанию	
   BYTE lfPitchAndFamily;   // 2 младших бита определяют ширину символа
                                 DEFAULT_PITCH  - по умолчанию
                                 FIXED_PITCH    - фиксир ширина
                                 VARIABLE_PITCH - переменная ширина
                               биты с 4 до 7 определяют начертание 
                                 FF_DECORATIVE
                                 FF_DONTCARE
                                 FF_MODERN
                                 FF_ROMAN
                                 FF_SCRIPT
                                 FF_SWISS
   TCHAR lfFaceName[LF_FACESIZE];  // Строка с названием шрифта длиной не 
                                      более 32 символов  (включая конец 
                                      строки 0x00 (�) )
} LOGFONT; 

Реклама:

Метки: C++ Builder, исходник.

Комментарии:

Виталий:
Спасибо большое автору за статью, очень пригодилось. :)
Лаврентий:
У меня была такая же проблема, но под Win 7:
lf.lfEscapement = CSpinEdit1->Value*10 ; // угол поворота например: 45*00" = 450
lf.lfOrientation = 900; // ориентация в десятых долях градуса
// "под WinXP почему-то не работает :("
Неожиданно выяснилось, что не работает под 90 градусов (900) и под 270 - (2700), но вот если выставить 901 - то начинает работать! %)
Хотя на вид это не отличается от 900. Проверьте - может получится! ;-)
имя:

e-mail (не публикуется):

комментарий:

© Ткачев Филипп, 2005—2017
Программист, веб-разработка и прикладное ПО.
Все права защищены.