Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Разновидности окон: дочерние, родительские, используемые (owned)

 

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

Окно создается с помощью функции

HWND CreateWindow(

lpszClassName, lpszTitle, dwStyle,

nX, nY, nWidth, nHeight,

hwndParent, hMenu, hInstance, lpvParam

);

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

Самый общий вид окна – перекрывающиеся (overlapped). Такое окно создается, если указать стиль WS_OVERLAPPED или WS_OVERLAPPEDWINDOW при создании окна. Эти окна всегда имеют рамку (border), заголовок (title-bar) и внутреннюю область. Окна этого стиля применяются в качестве главных окон приложения, при этом настоятельно рекомендуется использовать стиль WS_OVERLAPPEDWINDOW, который описывает стандартное главное окно приложения с кнопками системного меню, максимизации и минимизации.

Близкая к перекрывающимся категория окон – всплывающие (popup) окна, задается указанием стиля WS_POPUP при создании окна. Всплывающие окна отличаются от перекрывающихся тем, что могут не иметь заголовка (title bar). В остальном их применение аналогично.

Если при создании перекрывающихся или всплывающих окон определить хендл окна – родителя, то такие окна окажутся в специфических отношениях, называемых отношениями пользователя (owner) и используемого (owned) окон.

Главная идея таких отношений связана с совместным позиционированием в Z–направлении: окно - пользователь всегда находится непосредственно под используемым окном, при перемещении одного из них в Z–направлении, другое перемещается вслед за ним. Перемещение окон в X и Y направлениях не взаимосвязано, используемые окна могут находиться вне окна‑пользователя. Кроме того, если окно‑пользователь становится невидимым или минимизируется, то используемые им окна становятся невидимыми. При уничтожении окна‑пользователя все используемые окна автоматически уничтожаются.

В Windows существует одна особенность – хотя при создании используемого окна объявляется хендл “родительского” окна, но при попытке получить хендл родительского окна (например, функцией GetParent), возвращается NULL.

Еще одна большая категория окон – дочерние (child) – окна, создаются при указании стиля WS_CHILD и хендла родительского окна (parent). Дочерние окна обязательно имеют внутреннюю область, но могут не иметь рамки и заголовка; у них не может быть меню - этот параметр функции CreateWindow задает необязательный идентификатор дочернего окна.

Отношения дочерних и родительских окон напоминают отношения пользователя и используемого, но имеют некоторые отличия:

· дочерние окна могут размещаться только во внутренней области родительского окна.

· координаты дочерних окон задаютсе относительно верхнего-левого угла внутренней области родительского окна, а не экрана.

· дочерние окна, имеющие одного родителя, называются “сестринскими” (sibling) окнами. Перекрывающие друг друга сестринские окна могут осуществлять вывод в области перекрываемого окна. Что бы четко разделить области сестринских окон Вы должны указать WS_CLIPSIBLINGS при создании дочернего окна.

· если для дочернего окна запретить получение фокуса ввода (от мыши и клавиатуры), то все соощения ввода будут направлены окну-родителю.

· родительское окно может осуществлять вывод поверх дочернего окна.

Если Вы хотите избежать этого, то Вам надо указать стиль WS_CLIPCHILDREN при создании окна‑родителя.

Зная хендл дочернего окна можно узнать хендл родителя, если воспользоваться одной из двух функций:

HWND GetParent(hwndChild);

HWND GetWindowWord(hwndChild, GWW_PARENT);

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

BOOL   EnableWindow(hWnd, bEnable);

Второй стиль, на который надо обратить внимание – WS_VISIBLE – говорит о том, что создается видимое окно. Если его не указать, то созданное окно будет невидимым. Позже окно можно делать видимым или невидимым с помощью функции:

BOOL   ShowWindow(hWnd, SW_HIDE);

BOOL   ShowWindow(hWnd, SW_SHOW);

Окна часто создают невидимыми, если при их создании (или сразу после этого) приходится менять их размер или положение. При этом все операции выполняют над невидимым окном и показывают только в его конечном состоянии. Это не только улучшает внешний вид приложения, но и ускоряет выполнение.

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

В Windows существует возможность использовать один зарегистрированный класс разными приложениями, Вы можете сами разработать собственный класс окон, которым будут пользоваться другие приложения. Сделать это достаточно просто - при регистрации класса окна Вы должны указать стиль класса CS_GLOBALCLASS. После этого все остальные приложения Windows смогут использовать окна этого класса. Единственное новшество будет связано с тем, что при завершении работы Вашего приложения Вы должны удалить объявленный класс из списка классов Windows. Сделать это можно с помощью функции

BOOL   UnregisterClass(lpszClassName, hInstance);

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

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...