Что такое дочерние окна
Что такое дочерние окна
Дочернее окно (child window) имеет стиль WS_CHILD и ограничено рабочей областью его родительского окна. Прикладная программа обычно использует дочерние окна, чтобы поделить рабочую область родительского окна на функциональные области. Вы создаете дочернее окно, определяя стиль WS_CHILD в функции CreateWindowEx.
Дочернее окно должно иметь родительское окно. Родительское окно может быть перекрывающим окном, выскакивающим окном или даже другим дочерним окном. Вы определяете родительское окно, когда Вы вызываете CreateWindowEx. Если Вы определяете стиль WS_CHILD в CreateWindowEx, но не определяете родительское окно, Windows не создает окно.
Дочернее окно имеет рабочую область, но никаких других функций, если они явно не затребованы. Прикладная программа может затребовать строку заголовка, меню окна, кнопки свертывания и развертывания окна, рамку и линейки прокрутки для дочернего окна, но дочернее окно не может иметь меню. Если прикладная программа определяет дескриптор меню, или когда она регистрирует класс дочернего окна, или когда создает дочернее окно, дескриптор меню игнорируется.
Windows всегда устанавливает дочернее окно относительно верхнего левого угла рабочей области родительского окна. Никакая часть дочернего окна когда-либо не появляется снаружи рамок его родительского окна. Если прикладная программа создает дочернее окно, которое является большим чем родительское окно или устанавливает дочернее окно так, чтобы некоторые или все дочерние окна располагаются вне рамок родителя, Windows отсекает дочернее окно; то есть часть снаружи рабочей области родительского окна не отображается. Действия, которые воздействуют на родительское окно, могут также воздействовать на дочернее окно, следующим образом.
Windows автоматически не закрепляет дочернее окно с рабочей областью родительского окна. Это означает, что родительское окно делает прорисовку поверх дочернего окна, если оно выполняет какое-либо рисование, в том же самом месте, где дочернее окно. Однако, Windows скрепляет дочернее окно с рабочей областью родительского окна, если родительское окно имеет стиль WS_CLIPCHILDREN. Если дочернее окно закреплено, родительское окно не может рисовать поверх его.
Дочернее окно может накладываться на другие дочерние окна в той же самой рабочей области. Дочернее окно, которое разделяет то же самое родительское окно с одним или большим количеством других дочерних окон, называется сестринским окном (sibling window). Сестринские окна могут рисовать в рабочей области друг друга, если одно из дочерних окон не имеет стиля WS_CLIPSIBLINGS. Если дочернее окно имеет этот стиль, любая часть его сестринского окна, которое находится внутри дочернего окна, закрепляется.
Если окно имеет стиль WS_CLIPCHILDREN или WS_CLIPSIBLINGS, происходит небольшая потеря в эффективности. Каждое окно занимает системные ресурсы, так что прикладная программа не должна использовать дочерние окна беспорядочно. Для самой лучшей эффективности, прикладная программа, которой нужно логически поделить свое главное окно, должна сделать это в оконной процедуре главного окна скорее, чем используемые дочерние окна.
Взаимоотношение с родительским окном
Прикладная программа может изменять родительское окно существующего дочернего окна, вызывая функцию SetParent. В этом случае, Windows удаляет дочернее окно из рабочей области старого родительского окна и перемещает его в рабочую область нового родительского окна. Если SetParent определяет значение дескриптора ПУСТО (NULL), окно рабочего стола становится новым родительским окном. В этом случае, дочернее окно рисуется в самом главном окне, вне рамок любого другого окна. Функция GetParent восстанавливает дескриптор родительского окна для дочернего окна.
Родительское окно уступает часть своей рабочей области дочернему окну, и дочернее окно принимает всю вводимую информацию для этой области. Класс окна не должен быть тот же самый для каждого из дочерних окон родительского окна. Это означает, что прикладная программа может заполнять родительское окно дочерними окнами, которые выглядят поразному и выполняют различные задачи. Например, диалоговое окно может содержать много типов элементов управления, каждое из них дочернее окно, которое принимает различные типы данных от пользователя.
Дочернее окно имеет только одно родительское окно, но родитель может иметь любое число дочерних окон. Каждое дочернее окно, в свою очередь, может иметь дочерние окна. В этой цепочке окон, каждое дочернее окно называется порожденным окном первоначального родительского окна. Прикладная программа использует функцию IsChild, чтобы обнаружить, является ли данное окно дочерним окном или порожденным окном данного родительского окна.
Функция EnumChildWindows перечисляет дочерние окна родительского окна. Затем, EnumChildWindows передает дескриптор каждого дочернего окна в определенную прикладной программой функцию повторного вызова. Порожденные окна данного родительского окна также перечисляются.
Windows передает входящие сообщения дочернего окна непосредственно в дочернее окно; сообщения не передаются через родительское окно. Единственная исключительная ситуация является той, если дочернее окно было заблокировано функцией EnableWindow. В этом случае, Windows передает любые входные сообщения, которые пошли бы в дочернее окно в родительское окно. Это разрешает родительскому окну проверять входящие сообщения и, в случае необходимости, допускать их к дочернему окну.
Дочернее окно может иметь уникальный целочисленный идентификатор. Идентификаторы дочернего окна важны при работе с окнами элементов управления. Прикладная программа направляет действие элементов управления, посылая ему сообщения. Прикладная программа использует идентификаторы элементов управления дочернего окна, чтобы направлять сообщения в элемент управления. Кроме того, элемент управления посылает уведомительные сообщения своему родительскому окну. Уведомительное сообщение включает в себя идентификатор элемента управления дочернего окна, который родитель используют для определения, какому элементу управления послано сообщение. Прикладная программа определяет идентификатор дочернего окна для других типов дочерних окон, путем установки значения параметра hmenu функции CreateWindowEx скорее, чем дескриптор меню.
Лекция 6
Дочерние окна
Класс кнопок
Всем кнопкам, которые пользователь видит на экране, соответствует один предопределенный класс окна » button «. Windows поддерживает 10 стандартных стилией кнопок. Любую из них можно создать при помощи вызова функции CreateWindow с определением следующих параметров:
Текст окна » Моя кнопка»
Стиль окна WS_CHILD|WS_VISIBLE|BS_
Родительское окно hwnd
Идентификатор дочернего окна (HMENU) i
Описатель программы hInstance
Дополнительный параметр NULL
Кратко остановимся на особенностях некоторых кнопок.
Нажимаемая кнопка является самой широко используемой. Она представляет собой прямоугольник, внутри которого задан текст. При нажатии на кнопку (клик мыши на поверхности кнопки), она перерисовывается в виде нажатого состояния, а при отпускании мыши переходит в первоначальное состояние. При отпускании мыши кнопка посылает родительскому окну сообщение WM_COMMAND с кодом уведомления BN_CLICKED. Вы можете имитировать нажатие кнопки, посылая окну сообщение WM_SETSTATE. Так, строка программы:
приводит к нажатию кнопки, а строка
возвращает кнопку к своему нормальному состоянию.
Флажки
Флажки представляют собой маленькие квадратные окна с текстом; текст обычно размещается справа от флажка. Флажки, как правило, действуют как двухпозиционные переключатели: один щелчок вызывает появление контрольной метки (птички); другой щелчок приводит к исчезновению контрольной метки. Часть флажки объединяют в группы, чтобы сконцентрироваться на опциях какого-то одного объекта. В последнем случае состояния одних из кнопок могут зависеть от состояний других. При использовании стиля BS_CHECKBOX программа должна сама устанавливать и снимать контрольную метку, посылая окну кнопки сообщение BM_SETCHECK и 1 или 0 в параметре wParam. В случае стиля BS_AUTOCHECKBOX флажок сам включает и выключает себя. Оба окна посылают традиционное для кнопок сообщение WM_COMMAND родительскому окну при щелчке мыши на поверхности кнопки.
Можно также получить текущее состояние флажка послав в кнопку сообщение BM_GETCHECK:
int Result = (int) SendMessage(hwndButton, BM_GETCHACK, 0, 0);
Переключатели
Переключатели похожи на флажки, но форма метки у них не квадратная, а круглая. Жирная точка внутри кружка показывает, что переключатель помечен. Переключатель имеет стиль окна BS_RADIOBUTTON, BS_AUTORADIOBUTTON, но последний используется только в окнах диалога. В окнах диалога группы переключателей, как правило, используются для идентификации нескольких взаимоисключающих опций. В отличие от флажков, его состояние не изменится. Взаимодействия переключателей с родительским окном аналогично флажкам.
Кнопки, определяемые пользователем.
Класс статических дочерних окон
Статическое окно имеет предопределенный класс с именем «static». Данное окно не получает сообщений от мыши и клавиатуры: оно как бы прозрачно для сообщений и сообщения, адресованные статическому окну переправляются родительскому окну (расположенному под ним). Существует 12 стилей статического окна.
Существует девять стилей, позволяющих рисовать прямоугольники и рамки SS_BLACKRECT, SS_GRAYRECT, SS_WHITERECT рисуют закрашенные прямоугольники, SS_BLACKFRAME, SS_GRAYFRAME, SS_WHITEFRAME прямоугольные рамки без закрашивания, SS_ETCHEDHORZ, SS_ETCHEDVERT, SS_ETCHEDFRAME рамки с тенью, состоящей из серого и белого цветов). Текст во всех этих случаях игнорируется.
Класс полос прокрутки
Полосы прокрутки или полосы скроллинга могут быть автоматически добавлены к окну, если вы укажете в стиле окна идентификаторы горизонтальной WS_VSCROLL и вертикальной WS_HSCROLL полос прокрутки. Однако вы в любой момент можете создать свое дочернее окно прокрутки, используя предопределенный класс окна » scrollbar » и один из двух стилей для полос прокрутки: SBS_VERTS для вертикальной и SBS_HORZ для горизонтальной полос прокрутки. Пользователь сам определяет положение полосы скроллинга внутри родительского окна и его размеры через соответствующие параметры функции CreateWindow при создании или MoveWindow при дальнейшей работе.
Вы можете установить диапазон и положение полосы прокрутки при помощи функций:
SetScrollRange(hwndScroll, SB_CTL, iMin, iMax, bRedraw);
SetScrollPos(hwndScroll, SB_CTL, iPos, bRedraw);
где параметры iMin и iMax устанавливают соответственно минимальное (при котором отметка полосы прокрутки устанавливаются либо в крайнее верхнее для вертикальной полосы прокрутки, либо в крайнее левое положение для горизонтальной) и максимальное значение, bRedraw устанавливается в TRUE если необходима перерисовка полосы скроллинга и в FALSE в обратном случае, iPos определяет текущее положение полосы скроллинга (и лежит в диапазоне от iMax до iMax ). Следует отметить, что если вы используете полосы прокрутки, созданные с помощью стилей окна, то непосредственного описателя полосы прокрутки hwndScroll вы не имеете. Для их управления вы должны использовать описатель окна, которому принадлежат полосы прокрутки:
SetScrollRange(hwnd, SB_VERT, iMin, iMax, bRedraw);
SetScrollPos(hwndScroll, SB_HORZ, iPos, bRedraw);
при этом вы явно указываете к какой из двух полос прокрутки (вертикальной или горизонтальной) вы обращаетесь.
Класс редактирования
Когда используется класс » edit » при создании дочернего окна, тем самым создается прямоугольник заданного размера и положения на родительском окне, в котором содержится редактируемый текст. Когда данное дочернее окно имеет фокус ввода, вы можете набирать текст, двигать каретку, выбирать (отмечать) группы символов, используя либо мышь, либо клавиатуру, копировать текст и вставлять текст, находящийся в Clipboard.
Одним из простейших применений окон редактирования является простое однострочное окно ввода данных, которое, например, используется в окнах открытия и сохранения файлов для указания имени файла.
При создании указывается стиль окна редактирования (присутствие параметра WM_CHILD обязательно), который может использовать следующие значения: ES_LEFT, ES_RIGHT, ES_CENTER для выравнивания редактируемого текста соответственно по левому или правому краю, либо по центру; ES_MULTILINE для создания многострочного окна редактирования; ES_AUTOHSCROOL и ES_AUTOVSCROOL для включения соответственно горизонтальной и вертикальной полосы прокрутки.
EN_SETFOCUS окно получило фокус ввода;
EN_KILLFOCUS окно потеряло фокус ввода;
EN_CHANGE содержимое окна будет меняться;
EN_UPDATE содержимое окна изменилось;
EN_ERRSPACE произошло переполнение буфера ввода;
EN_MAXTEXT произошло переполнение буфера ввода при вставке;
EN_HSCROLL на горизонтальной полосе прокрутки был щелчок мыши;
EN_VSCROLL на вертикальной полосе прокрутки был щелчок мыши;
Поместить либо прочитать текст из окна редактирования можно при помощи функций SetWindowText и GetWindowText.
Существует множество сообщений, которые родительское окно может послать в окно редактирования. Приведем некоторые из них, которые позволяют выполнять работу с текстом, содержащимся в окне редактирования.
Вы можете выделить текст, указав начальное и конечное положение выделения:
SendMessage(hwndEdit, EM_SETSEL, iStart, iEnd);
а также получить начальное и конечное положение текущего выделения:
SendMessage(hwndEdit, EM_GETSEL, (wParam) &iStart, (lParam) &iEnd);
Длину строки можно получить используя номер строки в окне редактирования:
int iLength = SendMessage(hwndEdit, EM_LINELENGTH, iLine, 0);
а также скопировать саму строку в буфер:
int iLength = SendMessage(hwndEdit, EM_GETLINE, (LPARAM) szBuffer);
Класс окна списка
Окно списка ( list box ) позволяет работать со списком набором текстовых строк, прокручиваемым в прямоугольном окне. Программа может добавлять и удалять строки в списке путем посылки сообщений оконной процедуре списка. Окно списка, в свою очередь, посылает сообщения WM_COMMAND своему родительскому окну.
Чаще всего списки используются в окнах диалога, например, при открытии файла в окне списка отображаются имена файлов текущего каталога. Список позволяет выбирать один пункт списка или несколько. Если окно списка имеет фокус ввода, то один из пунктов списка выводится окруженным штриховой линией. Такая индикация не означает, что данный пункт выбран. Выбранный пункт индицируется световым выделением.
Дочернее окно списка создается с помощью вызова функции CreateWindow, с использованием имени » listbox » в качестве класса окна и WS_CHILD в качестве идентификатора стиля. Кроме этого, окно списка имеет ряд предопределенных стилей:
LBS_NOTIFY инициирует посылку сообщений от списка родительскому окну;
LBS_SORT дает возможность сортировки элементов списка;
LBS_MULTIPLESEL дает возможность выбора сразу нескольких пунктов списка
Самой естественной операцией для окна списка является добавление строк. Это выполняется путем посылки сообщения в окно списка:
SendMessage(hwndList, LB_INSERTSTRING, iIndex, (LPARAM) szString);
SendMessage(hwndList, LB_ADDSTRING,0, (LPARAM) szString);
Удалить строку из списка можно путем посылки сообщения:
SendMessage(hwndList, LB_DELETESTRING, iIndex, 0);
Полностью очистить список:
Для получения информации от списка также можно использовать ряд сообщений. Так, количество строк и выбранный текущий элемент вы можете узнать:
int iCount = SendMessage(hwndList, LB_GETCOUNT,0,0);
int iIndex= SendMessage(hwndList, LB_GETCURSEL,0, 0);
Вы можете определить длину строки любого элемента, а также скопировать эту строку:
iLength = SendMessage(hwndList, LB_GETTEXTLEN, iIndex, 0);
iLength = SendMessage(hwndList, LB_GETTEXT, LB_GETTEXT, (LPARAM) szBuffer);
Кроме этого вы можете сами устанавливать выделяемый пункт списка:
SendMessage(hwndList, LB_SETCURSEL, iIndex, 0);
Данные функции работают для списка с одним выбором. Для списка с множественным выбором нужно использовать сообщения LB_SETSEL, LB_GETSEL:
SendMessage(hwndList, LB_SETSEL, wParam, iIndex);
int iSelect = SendMessage(hwndList, LB_GETSEL, iIndex, 0);
где iSelect не равно 0, если пункт выбран, и равно 0 в противном случае.
Окно списка посылает родительскому окну сообщения WM_COMMAND. lParam является описателем дочернего окна, младшее слово wParam определяет идентификатор дочернего окна, а в старшем слове содержится код уведомления:
LBN_ERRSPASE показывает, что превышен объем памяти, выделенный для списка;
LBN_SELCHANGE изменен текущий выбор;
LBN_DBCLK был двойной щелчок мыши на окне списка;
LBN_SELCANSEL отмена выделения;
LBN_SELFOCUS окно списка получило фокус ввода;
Сведения об интерфейсе нескольких документов
Каждый документ в приложении с многодокументным интерфейсом (MDI) отображается в отдельном дочернем окне в клиентской области главного окна приложения. К типичным приложениям MDI относятся приложения для обработки текстов, позволяющие пользователю работать с несколькими текстовыми документами и приложениями электронных таблиц, которые позволяют пользователю работать с несколькими диаграммами и электронными таблицами. Дополнительные сведения см. в следующих статьях.
Фрейм, клиент и дочерние Windows
Приложение MDI имеет три вида окон: окно фрейма, окно клиента MDI, а также ряд дочерних окон. Окно фрейма похоже на главное окно приложения: оно имеет границу изменения размера, строку заголовка, меню окна, кнопку сворачивания и кнопку развернуть. Приложение должно зарегистрировать класс окна для фрейма окна и предоставить процедуру окна для ее поддержки.
Приложение MDI не отображает выходные данные в клиентской области окна фрейма. Вместо этого отображается окно клиента MDI. Клиентское окно MDI — это специальный тип дочернего окна, принадлежащего предварительно зарегистрированному классу окна мдиклиент. Окно клиента является дочерним по отношению к окну фрейма; Он выступает в качестве фона для дочерних окон. Он также обеспечивает поддержку создания дочерних окон и управления ими. Например, приложение MDI может создавать, активировать или разворачивание дочерних окон, отправляя сообщения в окно клиента MDI.
Когда пользователь открывает или создает документ, окно клиента создает дочернее окно для документа. Окно клиента — это родительское окно всех дочерних окон MDI в приложении. У каждого дочернего окна есть граница размеров, строка заголовка, меню окна, Кнопка сворачивания и кнопка развертывания. Так как дочернее окно обрезается, оно ограничено окном клиента и не может находиться за пределами.
Приложение MDI может поддерживать более одного вида документов. Например, обычное приложение электронной таблицы позволяет пользователю работать с диаграммами и электронными таблицами. Для каждого поддерживаемого типа документа приложение MDI должно зарегистрировать класс дочернего окна и предоставить процедуру окна для поддержки окон, принадлежащих этому классу. Дополнительные сведения о классах окон см. в разделе классы окон. Дополнительные сведения о процедурах окна см. в разделе процедуры окна.
Ниже приведено типичное приложение MDI. Он называется Мултипад.
Создание дочернего окна
Чтобы уничтожить дочернее окно, приложение MDI отправляет сообщение WM _ мдидестрой в окно клиента MDI.
Активация дочернего окна
Любое количество дочерних окон может отображаться в клиентском окне в любое время, но только один из них может быть активным. Активное дочернее окно позиционируется перед всеми остальными дочерними окнами, и его граница выделяется.
Пользователь может активировать неактивное дочернее окно, щелкнув его. Приложение MDI активирует дочернее окно, отправляя сообщение WM _ мдиактивате в окно клиента MDI. По мере того как клиентское окно обрабатывает это сообщение, оно отправляет сообщение WM _ мдиактивате в процедуру окна дочернего окна, чтобы активировать его, а также в процедуру окна дочернего окна, которое деактивируется.
Чтобы предотвратить активацию дочернего окна, обрабатывайте сообщение WM _ нкактивате до дочернего окна, возвращая значение false.
Система отслеживает расположение каждого дочернего окна в стеке перекрывающихся окон. Этот стек называется Z-порядком. Пользователь может активировать следующее дочернее окно в Z порядке, нажав кнопку Далее в меню окно в активном окне. Приложение активирует следующее (или предыдущее) дочернее окно в Z-порядке, отправляя сообщение WM _ мдинекст в окно клиента.
Чтобы получить маркер активного дочернего окна, приложение MDI отправляет сообщение WM _ мдижетактиве в окно клиента.
Несколько меню документов
Окно фрейма приложения MDI должно включать строку меню с меню «окно». Меню окно должно включать элементы, которые упорядочивают дочерние окна в окне клиента или закрывают все дочерние окна. Меню окна типичного приложения MDI может включать элементы, приведенные в следующей таблице.
| Элемент меню | Назначение |
|---|---|
| Tile | Упорядочивает дочерние окна в формате мозаики, чтобы каждый из них полностью появился в окне клиента. |
| Cascade | Упорядочивает дочерние окна в формате Cascade. Дочерние окна перекрываются друг с другом, но отображается заголовок каждого из них. |
| Упорядочить значки | Упорядочивает значки элементов с минимальными дочерними окнами в нижней части окна клиента. |
| Закрыть все | Закрывает все дочерние окна. |
При создании дочернего окна система автоматически добавляет новый пункт меню в меню окно. Текст пункта меню совпадает с текстом в строке меню нового дочернего окна. Щелкнув пункт меню, пользователь может активировать соответствующее дочернее окно. При уничтожении дочернего окна система автоматически удаляет соответствующий пункт меню из меню окно.
Если приложение MDI поддерживает несколько типов дочерних окон, настройте строку меню, отражающую операции, связанные с активным окном. Для этого предоставьте отдельные ресурсы меню для каждого типа дочернего окна, которое поддерживает приложение. При активации нового типа дочернего окна приложение должно отправить сообщение WM _ мдисетмену в клиентское окно, передав ему маркер соответствующего меню.
Если дочернего окна не существует, строка меню должна содержать только элементы, используемые для создания или открытия документа.
Когда пользователь проходит через меню приложения MDI с помощью клавиш курсора, клавиши ведут себя иначе, чем при переходе пользователя по типичным меню приложения. В приложении MDI управление передается из меню окна приложения в меню окно активного дочернего окна, а затем к первому элементу в строке меню.
Несколько ускорителей документов
Сочетания клавиш в меню окно для дочернего окна MDI отличаются от сочетаний для дочерних окон, не являющихся дочерними MDI. В дочернем окне MDI сочетание клавиш ALT + – (минус) открывает меню окно, сочетание клавиш CTRL + F4 закрывает активное дочернее окно, а сочетание клавиш CTRL + F6 активирует следующее дочернее окно.
Размер и расположение дочернего окна
При мозаичном заполнении дочерних окон система отображает все дочерние окна целиком — пересекается ни с одной из окон. При необходимости все окна будут иметь размер в окне клиента. Чтобы упорядочить дочерние окна в формате плитки, приложение MDI отправляет сообщение WM _ мдитиле в окно клиента. Как правило, приложение отправляет это сообщение, когда пользователь щелкает плитку в меню окно.
Приложение MDI должно иметь разные значки для каждого типа дочернего окна, которое он поддерживает. Приложение задает значок при регистрации класса дочернего окна. При сворачивании дочернего окна система автоматически отображает значок дочернего окна в нижней части окна клиента. Приложение MDI направляет систему на размещение значков дочерних окон, отправляя сообщение WM _ мдииконарранже в окно клиента. Как правило, приложение отправляет это сообщение, когда пользователь нажимает кнопку Упорядочить значки в меню окно.
Windows заголовка значка
Так как дочерние окна MDI могут быть сведены, приложение MDI должно избегать обработки окон заголовков значков, как если бы они были обычными дочерними окнами MDI. Окна с названиями значков отображаются, когда приложение перечисляет дочерние окна клиента MDI. Окна заголовков значков отличаются от других дочерних окон тем, что они принадлежат дочернему окну MDI.
Чтобы определить, является ли дочернее окно окном заголовка значка, используйте функцию «с помощью функции»- окна «с _ индексом владельца GW. Окна, не являющиеся заголовками, возвращают значение NULL. Обратите внимание, что этот тест недостаточен для окон верхнего уровня, так как меню и диалоговые окна являются собственностью Windows.
Данные дочернего окна
Поскольку количество дочерних окон зависит от того, сколько документов открывается пользователем, приложение MDI должно иметь возможность связывать данные (например, имя текущего файла) с каждым дочерним окном. Это можно сделать двумя способами.
Структура окна
Чтобы сохранить большой объем данных для дочернего окна, приложение может выделить память для структуры данных, а затем сохранить этот обработчик в памяти, содержащей структуру, в дополнительное пространство, связанное с дочерним окном.
Свойства окна
Приложение MDI может также хранить данные отдельных документов с помощью свойств окна. Данные по документу — это данные, относящиеся к типу документа, содержащегося в конкретном дочернем окне. Свойства отличаются от дополнительного пространства в структуре окна тем, что при регистрации класса окна не требуется выделять дополнительное пространство. Окно может иметь любое количество свойств. Кроме того, когда для доступа к дополнительному пространству в структурах окон используются смещения, свойства называются именами строк. Дополнительные сведения о свойствах окна см. в разделе Свойства окна.
