Форум программистов, компьютерный форум, киберфорум
C++: WinAPI
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/3: Рейтинг темы: голосов - 3, средняя оценка - 5.00
4 / 4 / 1
Регистрация: 28.06.2015
Сообщений: 13
1

WinAPI SetTextJustification+TextOutW. Баг или фича?

16.03.2019, 01:36. Просмотров 505. Ответов 6
Метки нет (Все метки)


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

Делаю как-то так. Положим есть текст:
'111 222 333' - три слова. два пробела.
Вызываю:
SetTextJustification(HDC, 20, 2) - мол надо 'дорастянуть' на 20 и пробела - 2
Рисую:
TextOutW(HDC, 0, 0, Text, TextLength)
Всё, вроде как, и ничего. Работает как надо. Но... Стоит добавить в текст (к одному из слов, вместо одного из них, не суть) юникодный символ (не берусь сказать - какие именно так себя ведут, но отловил в частности на таких: ▲▼ #25B2 #25BC) чудным образом TextOutW забывает про Justify текста. Причём такое поведение характерно для Windows 7 и выше. В старичке XP - всё работает корректно.

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

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

Название: WinXP_7.png
Просмотров: 49

Размер: 10.1 Кб

Где то всё же я косячу? Или...?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.03.2019, 01:36
Ответы с готовыми решениями:

Баг asio? или баг TCP стека?
всем привет. повстречался с очень странным багом. и не могу определить кто бажит, asio, или...

MP3 плеер на WinAPI (чудный баг)
Друзья, есть такая не большая проблемка: При проигрывании 3-5 песен приложение перестает нормально...

Баг или фича
решил проверить на своем VS 2008 присвоение в сравнении написал char buf; char *buf1;...

Баг или фича ? =)
Thread threads = new Thread; for (int i = 0; i < threads.Length; i++) {...

6
Модератор
Эксперт CЭксперт С++
4287 / 3848 / 705
Регистрация: 07.10.2015
Сообщений: 7,887
16.03.2019, 14:30 2
dalx, Даже не знаю, что и сказать...
Сделал на С++ на Win7 64бит. Все нормально... (Был зеленый фон окна, так и оставил, зато видно, где текст)
Название: Win7img.png
Просмотров: 40

Размер: 5.9 Кб
0
Модератор
Эксперт CЭксперт С++
4287 / 3848 / 705
Регистрация: 07.10.2015
Сообщений: 7,887
16.03.2019, 15:06 3
Font не менял...

Добавлено через 12 минут
dalx, Хм, выбрал фонт Arial, стало криво

Добавлено через 18 минут
dalx, создал фонт Arial по-другому, задал такие параметры:
C++
1
LOGFONT     myfont = { 12, 0, 0, 0, 500, 0, 0, 0, 1, 1, 1, 0, 0, L"Arial" };
Заработало! Похоже, все дело в настройках фонта. Дальше ищите самостоятельно. Delphi я не пользуюсь.
1
Модератор
Эксперт CЭксперт С++
4287 / 3848 / 705
Регистрация: 07.10.2015
Сообщений: 7,887
16.03.2019, 15:09 4
Название: Win7img2.png
Просмотров: 40

Размер: 11.4 Кб
0
4 / 4 / 1
Регистрация: 28.06.2015
Сообщений: 13
17.03.2019, 06:56  [ТС] 5
благодарю за ваш ответ. но...
пробовал так же пересоздавать шрифт. ошибка сохраняется. возможно, всё же, что-то из настроек и влияет. но что - пока так и не ясно. хотя, по идее - что у вас, что у меня - всё вызывается через winapi.
пока для себя сделал промежуточное решение с собственной процедурой "растягивания" текста. работает чуть медленнее, но - везде корректно. но всё же б - надо разобраться...
0
Модератор
Эксперт CЭксперт С++
4287 / 3848 / 705
Регистрация: 07.10.2015
Сообщений: 7,887
18.03.2019, 12:24 6
dalx, попробуйте задать параметр фонта lfCharSet = OEM_CHARSET = 255
0
4 / 4 / 1
Регистрация: 28.06.2015
Сообщений: 13
18.03.2019, 19:53  [ТС] 7
...lfCharSet = OEM_CHARSET = 255
нет. к сожалению - не помогло...
я сделал селекторы для всех параметров и гонял разные комбинации всякого . без результатов.

ощущение, что при появлении этих символов в строке ось то ли применяет при отрисовке иные параметры (или иной шрифт с иными параметрами). в частности - начинает считать, что брейк-символ (тот, что надо растянуть. он указан в самом шрифте) надо брать иной. так, как я понял в шрифте calibri - определён иной символ, а не пробел. и SetTextJustification со стандартными пробелами в принципе не растягивается. так что видимо своя функция будет вернее. хотя и пришлось повозиться с её реализацией в рамках всего проекта.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.03.2019, 19:53

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Баг или фича?
Как известно -1^2=1 и math.pow(-1,2) выдает верный результат, но -1 ** 2 выдает -1

Баг или фича?
Всем привет. Вот какая интересная штука происходит с жизненным циклом активити. Если выходить из...

Баг или фича?
Здраствуйте. Читая главу о локализации книги Гослинга, Арнольда, Холмса "Язык программирования Java...

Баг или фича дебаггера?
Делаем библиотеку, например, testlib. Option Public Option Declare test Sub test() Dim a As...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.