среда, 4 марта 2009 г.

Почему диалоговые окна создаются невидимыми?

Это перевод Why are dialog boxes initially created hidden? Автор: Реймонд Чен.

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

Перемотайте время назад, в старые дни (мы говорим о временах Windows 1.0) видео-карты были медленными, процессоры были медленными и память была медленная. Вы могли выбрать пункт меню, запускающий диалог, и ждать секунду или две, пока диалог не загрузится с дискеты (жёсткие диски были только для богатеньких). А потом вам ещё нужно было дождаться окончания прорисовки.

Чтобы сэкономить ценные секунды, диалоговые окна создавались скрытыми, а весь начальный ввод (т.е. то, что вы понажимали, пока диалог грузился) обрабатывался до показа окна. Диалоговое окно отображалось на экране только когда заканчивалась обработка начального ввода. И если вы печатали быстро, то вы могли успеть вбить все команды и нажать Enter до того как диалог показался. В этом случае диалог не показывался вовсе! Вот это эффективность.

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

Вообще-то даже сегодня это поведение бывает полезным: если бы диалоговые окна показывались изначально видимыми, то пользователь видел бы, как создаются все элементы управления, как обрабатывается WM_INITDIALOG (обработчик которого обычно изменяет значения по-умолчанию на реальные, скрывает и показывает контролы и т.п.). Это было бы и некрасиво и сбивало бы с толку ("как это все флажки показываются установленными, а потом неожиданно меняются, причём до того, как я по ним успеваю щёлкнуть").

Примечание переводчика:
(*) Речь идёт о системных диалогах, формируемых шаблоном, а вовсе не о диалогах в Delphi (где это обычные окна). Впрочем, в какой-то мере сказанное справедливо и в этом случае тоже.

2 комментария:

  1. > если бы диалоговые окна показывались изначально видимыми, то пользователь видел бы, как создаётся все элементы управления, как отрабатывает WM_INITDIALOG (которая обычно изменяет значения по-умолчанию на реальные, скрывает и показывает контролы и т.п.). Это было бы и некрасиво и сбивало бы с толку ("как это все флажки показываются установленными, а потом неожиданно меняются, причём до того, как я по ним успеваю щёлкнуть").

    У меня на работе давно висит в списке неисправленных багов похожее поведение mdi-форм. Когда форма сначала появляется в середине экрана, а потом "прыгает" в другую его часть(сохранение/загрузка размеров). =(((

    ОтветитьУдалить
    Ответы
    1. Да-да))) Сначала задаем параметры для окна, а только потом Form.Show;

      Удалить

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

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

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

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

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