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

Делаю как-то так. Положим есть текст:
Код: 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
WinAPI SetTextJustification+TextOutW. Баг или фича?
    #39786750
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
WinAPI SetTextJustification+TextOutW. Баг или фича?
    #39787013
dalx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
WinAPI SetTextJustification+TextOutW. Баг или фича?
    #39787676
Tactical Nuclear Penguin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dalxГде то всё же я косячу? Или...?

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

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

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

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


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