Вывод текста под углом [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;
Реклама:
Комментарии:
имя:
e-mail (не публикуется):
комментарий:
e-mail (не публикуется):
комментарий:
lf.lfEscapement = CSpinEdit1->Value*10 ; // угол поворота например: 45*00" = 450
lf.lfOrientation = 900; // ориентация в десятых долях градуса
// "под WinXP почему-то не работает :("
Неожиданно выяснилось, что не работает под 90 градусов (900) и под 270 - (2700), но вот если выставить 901 - то начинает работать! %)
Хотя на вид это не отличается от 900. Проверьте - может получится! ;-)