Что-то странное в TEXTMETRIC - PullRequest
       0

Что-то странное в TEXTMETRIC

1 голос
/ 01 февраля 2012

Я читаю

Programming.Windows.5th.Edition, Charles Petzold

, когда я делал рисунок 4-5.SYSMETS1.C, я встретил следующие коды:

cxCaps = (tm.tmPitchAndFamily & 1 ? 3 : 2) * cxChar / 2 ;

и в книге есть объяснения:

SYSMETS1 также сохраняет среднюю ширину заглавных букв в статической переменной cxCaps,Для шрифта с фиксированной высотой cxCaps будет равно cxChar.Для шрифта переменной ширины cxCaps устанавливается равным 150 процентам cxChar.Младший бит поля tmPitchAndFamily в структуре TEXTMETRIC равен 1 для шрифта переменной ширины и 0 для шрифта с фиксированным шагом.SYSMETS1 использует этот бит для вычисления cxCaps из cxChar.

Теперь, когда для cxCaps установлено значение 150 процентов от cxChar, я думаю, это должно быть

cxCaps = (tm.tmPitchAndFamily & 1? 3.0 : 2.0 ) * cxChar / 2;

Можете ли вы объяснить это для меня? Спасибо!

Ответы [ 2 ]

2 голосов
/ 01 февраля 2012

Какие бывают типы cxChar и cxCaps?Если cxChar равно float или double, то проблем не возникает, поскольку результат умножения будет преобразован в этот тип до деления на 2, а результатом будет 1,0 или 1,5.Но cxCaps также должен иметь тип с плавающей запятой, чтобы он мог содержать значение с плавающей запятой.

РЕДАКТИРОВАТЬ

Я проверил код книги, иобнаружил, что они оба int.А также я обнаружил, что нет необходимости в переменных с плавающей запятой.
Например, предположим, что cxCahr равно 20. Если tm.tmPitchAndFamily & 1 приведет к 1, то выражение будет

cxCaps = 3 * cxChar / 2;

и cxCaps будет 30.И если результат равен 0, «cxCaps» будет «20».Так что все в порядке.Если cxChar нечетное число, то потерянное значение будет 0.5, которым можно легко пренебречь.

0 голосов
/ 01 февраля 2012

Пытается вычислить результат integer , выраженный в пикселях.Эффективный расчет (3 * cxChar) / 2, а не 3 * (cxChar / 2).Предположительно, последний дает вам паузу.

Для пропорционального шрифта он будет округлен, но никогда не будет выключен более чем на один пиксель.Это не имеет значения, поскольку значение в любом случае является лишь предположением, фактическая ширина для каждого глифа в пропорциональном шрифте различна.

Нет баллов за удобочитаемость, вы можете переписать его так:

bool proportional = tm.tmPitchAndFamily & TMPF_FIXED_PITCH;
if (proportional) cxCaps = (3 * cxChar) / 2;
else cxCaps = cxChar;

Обратите внимание, что у флага неправильное имя, возможно, причина, по которой Петцольд так написал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...