Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.03.2019, 01:59   #1
dalx
 
Регистрация: 22.12.2008
Сообщений: 2
По умолчанию WinAPI SetTextJustification+TextOutW. Баг или фича?

Доброго времени суток.

Делаю как-то так. Положим есть текст:
'111 222 333' - три слова. два пробела.

Вызываю:
SetTextJustification(HDC, 20, 2) - мол надо 'дорастянуть' на 20 и пробела - 2

Рисую:
TextOutW(HDC, 0, 0, Text, TextLength)

Всё, вроде как, и ничего. Работает как надо. Но... Стоит добавить в текст (к одному из слов, вместо одного из них, не суть) юникодный символ (не берусь сказать - какие именно так себя ведут, но отловил в частности на таких: ▲▼ #25B2 #25BC) чудным образом TextOutW забывает про Justify текста. Причём такое поведение характерно для Windows 7 и выше. В старичке XP - всё работает корректно.

Если быть конкретнее. Код (сорри, прример не Сишный, но сути это не меняет. тут, вроде, обсуждения активнее )

Код:
const
  s1 = WideString('111 222 333');
  s2 = WideString('111 22') + #$25B2 + WideString(' 333');
var
  h:HDC;
  r:TRect;
  w,ww:Integer;
  sz:TSize;
begin
Self.Font.Name := 'Arial'; //на всякий случай. в WinXP не все шрифты имеют нужный глиф
Self.Font.Size := 12;
 
h := Self.Canvas.Handle;
 
r := Rect(2, 2, 152, 40); //хочу "вписать" в этот прямоугольник
Self.Canvas.FillRect(r);
 
SetTextJustification(h, 0, 0); //на всякий случай сбрасываю
 
//первая строка без символа
GetTextExtentPoint32W(h, s1, Length(s1), sz);
SetTextJustification(h, r.Right-r.Left-sz.cx, 2);
TextOutW(h, r.Left, r.Top, s1, Length(s1));
SetTextJustification(h, 0, 0);
 
//первая строка с символом
GetTextExtentPoint32W(h, s2, Length(s2), sz);
SetTextJustification(h, r.Right-r.Left-sz.cx, 2);
TextOutW(h, r.Left, r.Top+20, s2, Length(s2));
SetTextJustification(h, 0, 0);
 
//поверх - прямоугольник для наглядности
Self.Canvas.Brush.Style := bsClear;
Self.Canvas.Rectangle(r);
end;
Во вложении пример того, как это смотрится в WinXP и в Win7 (Win8, Win10 - аналогично). Иные шрифты (из "обиходных") ведут себя аналогично.

WinXP_7.png

Где то всё же я косячу? Или...?
dalx вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
WinApi Сеня# C# (си шарп) 4 26.03.2015 17:17
Различие кода mfc и WinApi(mfc ручками набили, а WinApi автоматически с генерировался!! нужно явное отличие, не могу найти) Артём1991 Помощь студентам 0 25.03.2012 17:13
Баг или фича? (programmersforum) Сtrl О форуме и сайтах клуба 7 05.09.2011 21:20
Youtube: это не баг, это фича Ivan_32 Свободное общение 10 10.02.2011 20:36
Бага или фича функции Replace Function (VBA)? Alkaline Microsoft Office Excel 3 27.12.2007 11:26