Windows USER
Windows USER — подсистема управления окнами и пользовательским интерфейсом операционной системы Windows, одна из трех исторически первых компонент этой ОС.
Краткое описание
правитьРеализует объект «окно» (HWND), списки окон, в том числе по порядку наложения, и управление регионами отсечения[неизвестный термин] окон, имеет богатый набор вызовов по созданию и управлению окнами. Также реализует отрисовку стандартной рамки окна (DefWindowProc) и несколько стандартных элементов пользовательского интерфейса (кнопки, чекбоксы, радио-кнопки, полосы прокрутки, списки, комбобоксы и диалоговые окна с потомками[неизвестный термин] внутри).
При создании окна (два этапа: RegisterClass+CreateWindow, при использовании стандартных элементов UI не нужен первый этап) указывается: координаты, строка (заголовок, или строка рядом с кнопкой), флаги стиля и окно-родитель. В вызове RegisterClass также указывается «оконная процедура» (WNDPROC).
Управление размерами и порядком наложения уже созданного окна производится специальными вызовами. Что же касается управления, зависимого от разновидности окна (например, взвод/сброс чекбокса, или добавление строк в список) — оно осуществляется вызовом SendMessage, где указываются 2 кода сообщения (например, WM_COMMAND+LB_ADDSTRING) и параметр.
WNDPROC представляет собой функцию, реализованную в приложении, которую USER вызывает при наступлении различных событий в жизни окна (для стандартных элементов UI функция реализована в самом USER или же в DLL, где реализован объект, такой, как COMCTL32.DLL). В WNDPROC передается HWND, код сообщения (WM_xxx
) и 2 параметра.
Разработчик WNDPROC обязан пропустить все неизвестные ему коды сообщений в DefWindowProc.
Основные сообщения:
WM_PAINT
. «Перерисуй себя».WNDPROC
обязана вызвать BeginPaint, получить HDC, и перерисовать окно (или его «грязную» часть) вызовами GDI.WM_CREATE
. Одно из первых сообщений, посылаемых окну (аналог конструктора).WM_DESTROY
. Одно из последних сообщений, посылаемых окну (аналог деструктора).WM_MOUSEMOVE
,WM_LBUTTONDOWN
и иные — над окном провели мышью или же ткнули в него мышью.WM_KEYDOWN
иWM_CHAR
— окно имеет «фокус ввода» и была нажата клавиша клавиатуры. Все клавиши приходят вWM_KEYDOWN
в виде «кодов виртуальных клавиш», которые есть скан-коды (они же — порядковые номера — Esc 1, F1 2 и так далее) клавиш некоей стандартной клавиатуры. ВWM_CHAR
приходят только те нажатия клавиш, которые означают символ (F1, стрелки, PgUp/Dn — не приходят).WM_SETFOCUS
— изменение окна, имеющего «фокус ввода» (одно на экране). Используется для рисования пунктирной рамочки вокруг чекбоксов и так далее.
Ресурсы
правитьUSER активно использует т. н. ресурсы — данные только для чтения, встроенные в EXE/DLL файл специальным образом на этапе построения.
Сами по себе ресурсы не есть часть USER и могут использоваться и без него (например, stringtable — таблицы строк для локализации приложения на разные языки), однако некоторые типы ресурсов используются USER автоматически (например, описания меню и диалоговых окон, в которых перечислены, например, все внутренние органы управления на данном диалоге и их координаты и строки).
При разработке программы ресурсы помещаются в текстовый файл с суффиксом .rc, написанный на некоем несложном языке. При этом давным-давно есть средства визуального редактирования описаний диалогов и меню.
При построении программы компилятор RC.EXE компилирует .rc в бинарный файл .res, который потом вшивается в EXE/DLL файл программой LINK.
При создании окна можно указать handle ресурса, где расположено описание верхнего меню окна — и USER создаст и отрисует меню автоматически, и пошлёт WM_COMMAND с кодом пункта меню окну, когда пункт выбран.
Обёртки
правитьНаиболее популярной Си++ обёрткой вокруг USER долгое время являлась MFC — используется по сей день. Также популярна обёртка WTL.
Замена
правитьВся технология USER, которой около 25 лет, постепенно заменяется на Windows Presentation Foundation (WPF), в которой, например, язык ресурсов заменен на куда более богатый XAML, а объектом, которому могут приходить события, может являться любой элемент векторной графики или даже окно с фильмом, показываемым через DirectShow.
Реализация
правитьwin32k.sys (до NT 4.0 в csrss.exe) (нижние уровни, в том числе списки окон и их регионы отсечения) и user32.dll (доступные приложениям вызовы, DefWindowProc и стандартные элементы).
Критика
правитьВ разделе не хватает ссылок на источники (см. рекомендации по поиску). |
По некоторым утверждениям (от тех, кто видел нелегальный исходный код), исходный код USER написан в чудовищном стиле, и содержит в себе мелкие правки для поддержки конкретных приложений, таких, как PowerPoint.
По тем же утверждениям, этот код никогда не переписывался заново за 25 лет и, возможно, это нереальная задача с точки зрения сохранения совместимости для приложений.
Помимо этого, есть и соображения, не требующие информации из нелегального кода.
Использование WNDPROC с оператором switch на все коды сообщений выглядит крайне некрасиво (эта проблема решена во всех Си++ обертках).
Существует концепция client и non-client area в окне — внутренность окна и рамка (обычно стандартная). Это приводит к наличию двух наборов кодов сообщений для внутренности и рамки — отрисовка, клавиатура, мышь и т. д. Кроме того, нет архитектурного разделения рамки и внутренности, что приводит к сложности в реализации архитектурных принципов MVC.
Однако уже в MFC проблема решена: создается отдельное окно-внутренность, которое автоматически перемещается при перемещении рамки и в котором и рисуется все то, что хочет нарисовать приложение. Окно-внутренность называется view, и в этой архитектуре MVC уже легко реализуема. Такое view можно, например, повторно использовать по технологии OLE во вложенном документе.
Интересные факты
правитьВенгерская нотация впервые применена в USER — изобретатель нотации Чарлз Симони был главным разработчиком этой компоненты.
Примерные аналоги
правитьВерхние уровни технологии X11, используемой в UNIX-подобных ОС, таких, как Linux, а также нижние уровни технологий KDE и Gnome (в этих же ОС).
См. также
правитьПримечания
правитьЛитература
править- Petzold, Charles (1998). Programming Windows Fifth Edition, Microsoft Press, ISBN 978-1-57231-995-0
- Chen, Raymond (2007). The Old New Thing, Addison-Wesley Professional, ISBN 978-0-321-44030-3
Ссылки
править- Windows Controls (Windows) (англ.)
Для улучшения этой статьи желательно:
|