пятница, 26 февраля 2010 г.

В не оконных элементах управления нет ничего волшебного

Это перевод Windowless controls are not magic. Автор: Реймонд Чен.

Похоже, что когда люди замечают, что движок рендеринга Internet Explorer не использует HWND для экранных элементов, они думают, что Internet Explorer как-то "читерит", делает что-то "недокументированное" и имеет "нечестное преимущество".

Хотя не оконные контролы были с нами аж с 1996-го. Никакого волшебства в них нет. Заметьте, что они требуют много работы, но они не волшебные.

Примечание переводчика: не оконный элемент управления - это контрол, который не имеет выделенного для него окна (HWND). Иными словами, он не имеет никакого отношения к ОС, которая про него совсем не в курсе, а управляется (рисуется) исключительно силами приложения. Соответственно, этот элемент не может получать ввод с клавиатуры и не может быть сфокусирован. Однако, будучи помещён на реальный элемент управления (с HWND), он может использовать его для получения ввода. Короче говоря, все элементы управления внутри странички в браузере - не более чем "иллюзия". Это не настоящие элементы управления. В Delphi не оконные элементы управления создаются как компоненты, наследуемые от TGraphicControl (оконные - от TWinControl, а невизуальные - от TComponent). У TGraphicControl нет Handle (HWND), зато есть канва. К таковым относятся TLabel (сравните с TStaticText), TSpeedButton, TPaintBox, TImage, TBevel, TShape, TSplitter, TGauge, TToolButton, ActionControl-ы и некоторые элементы Ribbon-а.

Очевидно, что Internet Explorer не может создавать настоящий HWND для каждого элемента HTML страницы. Существует ограничение в 10,000 USER-объектов на процесс, но вы, скорее всего, исчерпаете кучу рабочего стола (desktop heap) задолго до достижения этого ограничения.

Команда Internet Explorer-а собралась и заново реализовала все элементы управления, которые могли понадобится web-страничкам. У них появился свой (не оконный) checkbox, свой (не оконный) listbox, не оконный edit box и т.д. В дополнение к воспроизведению всей функциональности оконных элементов управления, разработчики Internet Explorer также воспроизвели "вид" оконных элементов управления, вплоть до последнего пикселя (функции вроде DrawThemeBackground и DrawFrameControl оказались при этом неоценимо полезными).

Если я правильно помню, то единственным оконным компонентом является элемент <SELECT>.

И если вы покопаетесь, то увидите, что в некоторых местах они сделали это не совсем идеально. Например, если вы щёлкните правой кнопкой мыши по элементу ввода текста, то вы увидите, что там отсутствуют опции типа "Порядок чтения: справа налево" и "Вставить управляющий символ Unicode". Другой пример - полосы прокрутки IE не подсвечиваются, когда вы проводите по ним мышью.

Напоминаю, что я никогда не работал над Internet Explorer-м; всё, что я знаю - это то, что я узнал от других людей в его команде (например, jeffdav присоединяется к ланчу нашей команде оболочки практически каждый день). Если у вас есть вопросы о Internet Explorer, то вам лучше бы задавать их команде Internet Explorer в их общем блоге, а не у меня.

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

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

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

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

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

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

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