textpub.neocities.org . [ список статей ]

Мой перевод англоязычной статьи «What Is a Window?» с сайта компании Microsoft (ссылка на оригинал: новая, старая), автор статьи там не указан, дата публикации оригинала: 05.10.2010 г.

Содержание статьи:

Что такое «окно» в Windows?

Очевидно, окна — краеугольный камень Windows. Они настолько важны, что послужили названием для, собственно, самой операционной системы. Но что это такое? Когда мы думаем про окно в Windows, то представляем что-то вроде следующего:


Окно приложения

Такой тип окна в Windows называется окном приложения или главным окном. Обычно у него имеется рамка с панелью заголовка, кнопками Свернуть и Развернуть, и прочими стандартными элементами UI (пользовательского интерфейса) в Windows. Рамка называется неклиентской областью окна, так как этой частью окна управляет операционная система. Область окна, находящаяся внутри рамки, — клиентская область. Этой частью окна управляет наша программа.

Существует и другой тип окна:


Окно элемента управления

Новичка в программировании для Windows может удивить то, что элементы управления в пользовательском интерфейсе, такие, как кнопки и поля ввода, сами являются окнами. Главное отличие между элементом управления в UI и окном приложения — это то, что элемент управления не может существовать сам по себе. Элемент управления всегда располагается в привязке к окну приложения. Если мы переместим окно приложения, элемент управления передвинется с ним. Кроме этого элемент управления и окно приложения могут обмениваться сообщениями. (Например, окно приложения получает от кнопки сообщения о нажатиях на нее.)

Поэтому, когда вы думаете об окне, неправильно думать просто об окне приложения. Вместо этого нужно представлять окно как программный объект, который:

Окна-родители и окна-владельцы

В случае элемента управления в пользовательском интерфейсе про окно элемента управления говорят, что оно является окном-потомком окна приложения. Окно-родитель является точкой отсчета системы координат, в которой позиционируется окно-потомок. Наличие окна-родителя влияет на отображение окна-потомка; например, та часть окна-потомка, которая выходит за границы его окна-родителя, не отображается.

Кроме рассмотренной в предыдущем абзаце, между окнами может существовать связь другого рода, например, связь между окном приложения и модальным диалоговым окном. Когда приложение показывает модальное диалоговое окно, окно приложения считается окном-владельцем, а модальное диалоговое окно — подчиненным окном. Подчиненное окно всегда отображается перед его окном-владельцем. Подчиненное окно перестает отображаться, когда окно-владелец свернуто, кроме этого подчиненное окно уничтожается вместе с уничтожением окна-владельца.

Следующее изображение показывает приложение, которое вывело на экран диалоговое окно с двумя кнопками:


Окно приложения и подчиненное ему диалоговое окно

Окно приложения является окном-владельцем по отношению к диалоговому окну, которое, в свою очередь, является окном-родителем по отношению к окнам кнопок. Следующая схема показывает эти отношения:


Схема, показывающая отношения родитель/потомок и владелец/подчиненный между окнами

Дескрипторы окон

Окна являются объектами — то есть они представлены текстом программы (функции окна) и данными — но они не являются классами языка C++, поэтому к ним нельзя обращаться как к классам. Вместо этого в программе для обращения к окну используется значение, которое называют дескриптором (по-английски «handle»). Дескриптор является непрозрачным типом данных (по-английски «opaque type»). Фактически, это лишь число, которое операционная система (ОС) использует для идентификации объекта. То есть можно представить Windows как большую таблицу с дескрипторами всех окон, созданных приложениями. ОС использует эту таблицу для поиска окон по их дескрипторам. (В данном случае неважно, как в подробностях всё это устроено внутри операционной системы). Тип данных дескрипторов окон обозначается служебным словом HWND (сокращение от «handle of window», по-русски «дескриптор окна»), которое обычно произносится как «эйч-винд». Дескрипторы окон возвращаются функциями, которые создают окна: CreateWindow и CreateWindowEx (здесь и далее — функции из набора Windows API).

Для выполнения какого-либо действия над окном обычно нужно вызвать соответствующую этому действию функцию и задать ей в качестве параметра значение типа HWND. Например, чтобы переместить окно на экране с одного места в другое, нужно вызывать функцию MoveWindow:

BOOL MoveWindow(HWND hWnd, int X, int Y, int nWidth, int nHeight, BOOL bRepaint);

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

Имейте в виду, что дескрипторы — не указатели. Если hwnd является переменной, содержащей дескриптор, то попытка разыменования дескриптора написанием *hwnd приведет к ошибке.

Системы координат экрана и окон

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

В зависимости от нашей задачи мы можем отсчитывать координаты относительно экрана, относительно окна (включая рамку) или относительно клиентской области окна. Например, при размещении окна на экране мы воспользуемся системой координат экрана, но внутри окна мы будем отрисовывать объекты с помощью системы координат клиентской области окна. В каждой из этих систем координат точка отсчета (0, 0) всегда находится в верхнем левом углу области, система координат которой используется.


Иллюстрация систем координат экрана, окна и клиентской области окна

textpub.neocities.org . [ список статей ]