Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Программирование Новый топик    Ответить
 WinAPI SetTextJustification+TextOutW. Баг или фича?  [new]
dalx
Member

Откуда:
Сообщений: 43
Доброго времени суток.

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

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

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

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

Сталкивался ль кто с таким? Есть внятные решения? Быть может я чего-то не то делаю?
15 мар 19, 08:17    [21833244]     Ответить | Цитировать Сообщить модератору
 Re: WinAPI SetTextJustification+TextOutW. Баг или фича?  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 47076
MSDN
The GetTextExtentPoint32 function is always used with the SetTextJustification function. Sometimes the GetTextExtentPoint32 function takes justification into account when computing the width of a specified line before justification, and sometimes it does not. For more details on this, see GetTextExtentPoint32.
15 мар 19, 14:27    [21833874]     Ответить | Цитировать Сообщить модератору
 Re: WinAPI SetTextJustification+TextOutW. Баг или фича?  [new]
dalx
Member

Откуда:
Сообщений: 43
Dimitry Sibiryakov,

Эмм... Причём тут это? Вопрос не в том, что бы вычислить ширину с учётом установленного выравнивания. Это уже следующий момент.

Если быть конкретнее. Код

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 - аналогично). Иные шрифты (из "обиходных") ведут себя аналогично.

Где то всё же я косячу? Или...?

К сообщению приложен файл. Размер - 10Kb
15 мар 19, 20:10    [21834306]     Ответить | Цитировать Сообщить модератору
 Re: WinAPI SetTextJustification+TextOutW. Баг или фича?  [new]
Tactical Nuclear Penguin
Member

Откуда: холодно тут
Сообщений: 2662
dalx
Где то всё же я косячу? Или...?


не надо рисовать на канвасе формы!
возьми TImage например и на его канвасе рисуй
и не забудь фонт назначить канвасу
и все будет ок
18 мар 19, 12:24    [21835783]     Ответить | Цитировать Сообщить модератору
 Re: WinAPI SetTextJustification+TextOutW. Баг или фича?  [new]
dalx
Member

Откуда:
Сообщений: 43
Tactical Nuclear Penguin,

не суть на чём рисовать. приведённый код - лишь пример. маленький кусок из большого кода иллюстрирующая проблему.
18 мар 19, 19:25    [21836472]     Ответить | Цитировать Сообщить модератору
 Re: WinAPI SetTextJustification+TextOutW. Баг или фича?  [new]
Tactical Nuclear Penguin
Member

Откуда: холодно тут
Сообщений: 2662
dalx
Tactical Nuclear Penguin,

не суть на чём рисовать. приведённый код - лишь пример. маленький кусок из большого кода иллюстрирующая проблему.


по крайней мере он работает на TImage
вчера, 03:07    [21836711]     Ответить | Цитировать Сообщить модератору
Все форумы / Программирование Ответить