Учебное пособие: Работа с окнами приложений

void GetCursorPos( lpPoint );

Также можно ограничить зону перемещения курсора с помощью функции

void ClipCursor( lpRect );

Еще одна функция,

HCURSOR SetCursor( hCursor );

используется для задания хендла курсора, отображаемого в данный момент. Однако использовать ее надо осторожно, так как курсор является разделяемым ресурсом. Если Вы используете эту функцию, то Вы должны восстанавливать предыдущий курсор перед тем, как он покинет пределы внутренней области окна, или окно потеряет активность. Перед использованием этой функции надо убедиться, что хендл курсора, определенный для класса окон равен 0, что бы система не восстанавливала его прежний вид при каждом перемещении. Эту функцию удобно применять только в случае “захвата” курсора.

В некоторых случаях бывает удобно применять так называемый “захват” курсора. “Захваченый” курсор может перемещаться по всему окну, но сообщения от мыши поступают только в то окно, которое захватило курсор. При окно не получает сообщений WM_NCHITTEST, WM_NCMOUSEMOVE и пр., а получает сообщения как бы от внутренней области окна. Конечно, делать такое нужно на небольшое время, например для реализации механизма “Перенести и положить” (Drag And Drop). Только одно окно может захватывать курсор в данное время.

Для “захватывания” курсора предназначены следующие функции:

HWND SetCapture( hWnd );

void ReleaseCapture( void );

Функция SetCapture возвращает хендл предыдущего окна, использовавшего “захват” в это время, либо NULL.

Разновидности окон: дочерние, родительские, используемые (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 при создании дочернего окна.

К-во Просмотров: 345
Бесплатно скачать Учебное пособие: Работа с окнами приложений