Что такое окно?

Что такое окно?

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

Снимок экрана: окно приложения

Этот тип окна называется окном приложения или окном main. Обычно он имеет рамку с заголовком строки, кнопками Свернуть и Развернуть , а также другими стандартными элементами пользовательского интерфейса. Кадр называется неклиентской областью окна, так называемой, потому что операционная система управляет этой частью окна. Область в кадре является клиентской областью. Это часть окна, которым управляет программа.

Вот еще один тип окна:

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

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

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

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

Родительские окна и окна владельца

В случае элемента управления пользовательского интерфейса окно элемента управления считается дочерним элементом окна приложения. Окно приложения является родительским для окна управления. Родительское окно предоставляет систему координат, используемую для размещения дочернего окна. Наличие родительского окна влияет на внешний вид окна; например, дочернее окно обрезается таким образом, что ни часть дочернего окна не может отображаться за пределами его родительского окна.

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

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

Снимок экрана приложения с диалоговым окном

Окну приложения принадлежит диалоговое окно, а диалоговое окно является родительским для обоих окон кнопок. На следующей схеме показаны эти связи:

Иллюстрация, показывающая отношения

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

Windows — это объекты( они имеют как код, так и данные), но не являются классами C++. Вместо этого программа ссылается на окно с помощью значения, называемого дескриптором. Дескриптор является непрозрачным типом. По сути, это просто число, которое операционная система использует для идентификации объекта. Вы можете представить windows как большую таблицу всех созданных окон. Эта таблица используется для поиска окон по их дескрипторам. (Не важно, работает ли это внутренне.) Тип данных для дескрипторов окна — HWND, который обычно произносится как "aitch-wind". Дескриптора окна возвращаются функциями, создающими окна: CreateWindow и CreateWindowEx.

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

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

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

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

Экранные и оконные координаты

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

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

иллюстрация, показывающая координаты экрана, окна и клиента

Следующая

WinMain: точка входа приложения