Гость
Форумы / Программирование [игнор отключен] [закрыт для гостей] / WinAPI SetTextJustification+TextOutW. Баг или фича? / 6 сообщений из 6, страница 1 из 1
15.03.2019, 08:17
    #39786368
dalx
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WinAPI SetTextJustification+TextOutW. Баг или фича?
Доброго времени суток.

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

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

Рисую:
Код: plaintext
TextOutW(HDC, 0, 0, Text, TextLength)

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

Сталкивался ль кто с таким? Есть внятные решения? Быть может я чего-то не то делаю?
...
Рейтинг: 0 / 0
15.03.2019, 14:27
    #39786750
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WinAPI SetTextJustification+TextOutW. Баг или фича?
MSDNThe 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.
...
Рейтинг: 0 / 0
15.03.2019, 20:10
    #39787013
dalx
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WinAPI SetTextJustification+TextOutW. Баг или фича?
Dimitry Sibiryakov,

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

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

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
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 - аналогично). Иные шрифты (из "обиходных") ведут себя аналогично.

Где то всё же я косячу? Или...?
...
Рейтинг: 0 / 0
18.03.2019, 12:24
    #39787676
Tactical Nuclear Penguin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WinAPI SetTextJustification+TextOutW. Баг или фича?
dalxГде то всё же я косячу? Или...?

не надо рисовать на канвасе формы!
возьми TImage например и на его канвасе рисуй
и не забудь фонт назначить канвасу
и все будет ок
...
Рейтинг: 0 / 0
18.03.2019, 19:25
    #39788032
dalx
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WinAPI SetTextJustification+TextOutW. Баг или фича?
Tactical Nuclear Penguin,

не суть на чём рисовать. приведённый код - лишь пример. маленький кусок из большого кода иллюстрирующая проблему.
...
Рейтинг: 0 / 0
19.03.2019, 03:07
    #39788136
Tactical Nuclear Penguin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WinAPI SetTextJustification+TextOutW. Баг или фича?
dalxTactical Nuclear Penguin,

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

по крайней мере он работает на TImage
...
Рейтинг: 0 / 0
Форумы / Программирование [игнор отключен] [закрыт для гостей] / WinAPI SetTextJustification+TextOutW. Баг или фича? / 6 сообщений из 6, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]