Ура!!! Покопался в WinApi и разобрался, как проще сделать вывод в вьюшку повернутого текста. Проще оказалось создать новый шрифт, как советовал Александр Ильин, лишь с отличием, что для создания использован CreateFontW а не CreateFontIndirect.
Привожу функцию и результат работы. Всем огромное спасибо за участие в обсуждении!
Код:
PROCEDURE DrawStringA(f: Views.Frame; x,y: INTEGER; angle: INTEGER; col: Ports.Color; s: ARRAY OF CHAR; font: Fonts.Font);
VAR n, a, res: INTEGER; dc: WinApi.HANDLE; ind: WinApi.BOOL;
NewFont: WinApi.HFONT; df: HostFonts.DevFont; pt: HostPorts.Port;
fsize : WinApi.SIZE;
BEGIN
pt := f.rider(HostPorts.Rider).port;
dc := pt.dc;
res := WinApi.SaveDC(dc);
res := WinApi.SetBkMode(dc, WinApi.TRANSPARENT);
res := WinApi.SetTextColor(dc, col);
(* Вычисляем длину строки *)
a := LEN(s) - 1; n := 0;
WHILE (n < a) & (s[n] # 0X) DO
INC(n)
END;
IF angle MOD 360 = 0 THEN
(* Если угол поворота кратен 360, то использовать обычный шрифт *)
df := font(HostFonts.Font).dev;
res := WinApi.SelectObject(dc,df.id);
res := WinApi.TextOutW(dc, x, y, s, n);
res := WinApi.RestoreDC(dc, -1)
ELSE
(* Иначе, создать новый шрифт *)
NewFont := WinApi.CreateFontW(-((font.size + pt.unit DIV 2) DIV pt.unit), 0, angle*10, angle*10, Fonts.normal, 0, 0, 0, 0, 7, 2, 1, 38, font.typeface);
(* Вычислить ширину строки (для сдвига по Y) *)
ind := WinApi.GetTextExtentPoint32W(dc, s, n, fsize);
(* Выбрать шрифт *)
res := WinApi.SelectObject(dc, NewFont);
(* Вывести текст *)
res := WinApi.TextOutW(dc, x, y + fsize.cx DIV 2, s, n);
res := WinApi.RestoreDC(dc, -1);
(* Удалить шрифт *)
ind := WinApi.DeleteObject(NewFont);
END
END DrawStringA;
...
(* пример использования выдернутый из контекста *)
DrawStringA(f, I(l/f.dot-30), I((t+(h DIV 2))/f.dot), 90, Ports.black, temp, font);
Вложение:
Комментарий к файлу: итог, пример использования функции для вывода повернутого текста
Уы.gif [ 11.45 КБ | Просмотров: 17432 ]