вторник, 23 февраля 2010 г.

Какие ещё эффекты имеет флаг DS_SHELLFONT на страницы свойств?

Это перевод What other effects does DS_SHELLFONT have on property sheet pages? Автор: Реймонд Чен.

Как только вы изобретёте новый флаг, вы можете использовать его, чтобы исправить старые баги, без ломания обратной совместимости (прим.пер.: как мы помним, не все баги могут быть исправлены, потому что тогда перестанут работать программы).

Одной из ошибок прошлого было то, что размеры страницы свойств брались относительно шрифта "MS Sans Serif", даже если страница использовала другой шрифт (прим.пер.: речь идёт о диалогах на WinAPI).
DLG_SAMPLE DIALOGEX 32, 32, 212, 188
CAPTION "Caption"
FONT "Lucida Sans Unicode"
...
Этот пример диалогового шаблона говорит, что он имеет длину 212dlu и высоту 188dlu (dlu - диалоговых единиц). Если шаблон диалога использовался для автономного диалога, то эти значения DLU вычислялись бы относительно шрифта диалога, а именно - Lucida Sans Unicode.

Однако, если диалоговый шаблон использовался в странице свойств, то ранние версии Windows интерпретировали значения 212 и 188 относительно шрифта фрейма диалога свойств (обычно - MS Sans Serif), а не относительно шрифта, ассоциированного с самой страницей. Многие люди обошли это проблему, указывая "исправленные" (pre-adjusted) размеры, так что когда Windows измеряла диалог относительно MS Sans Serif, то поправки к размерам отменяли баг.

Другими словами, предположим, что Lucida Sans Unicode на 25% шире чем MS Sans Serif (я беру от балды). Тогда чтобы получить диалог шириной в 212dlu относительно Lucida Sans Unicode, диалоговый шаблон должен указывать ширину в 212dlu + 25% = 265dlu.

Поскольку люди опираются на это поведение (и уже написали несчётное множество программ), вы не можете изменить его. Если вы "исправите" его, то все эти уже написанные диалоги будут иметь неверный размер (так что ваше "исправление" в действительности будет привнесением нового бага).

Ах, но теперь у нас есть новый флаг - DS_SHELLFONT. Начиная с Windows 2000, если вы указываете в стиле диалога DS_SHELLFONT в вашем шаблоне типа DIALOGEX, то диалоговые размеры будут высчитываться относительно шрифта шаблона (что вы и хотели изначально), а не шрифта фрейма. Если же вы опустите этот флаг (как и делают старые/уже написанные программы), то все вычисления размеров будут выполняться по старой модели, баг-к-багу совместимой с предыдущими версиями системы.

Примечание переводчика: а вот ещё по теме от Джоэля Спольски. Купите книгу, если хотите читать на русском ;) Она того стоит.

Комментариев нет:

Отправить комментарий

Можно использовать некоторые HTML-теги, например:

<b>Жирный</b>
<i>Курсив</i>
<a href="http://www.example.com/">Ссылка</a>

Вам необязательно регистрироваться для комментирования - для этого просто выберите из списка "Анонимный" (для анонимного комментария) или "Имя/URL" (для указания вашего имени и ссылки на сайт). Все прочие варианты потребуют от вас входа в вашу учётку (поддерживается OpenID).

Пожалуйста, по возможности используйте "Имя/URL" вместо "Анонимный". URL можно просто не указывать.

Ваше сообщение может быть помечено как спам спам-фильтром - не волнуйтесь, оно появится после проверки администратором.