Windows


Справочная система к Borland C++ 5.02 (только раздел о Win API), перевод Трубецкого А.
Этот раздел сайта постоянно обновляется (по мере появления новых переводов)
На главную

Предыдущая
Далее

Рамка окна
Компоненты неклиентской области окна
Начальное состояние
Родительские и дочерние стили
Дополнительные стили
Окно, принадлежащее другому окну
Заблокированное окно
Окна переднего плана и фоновые окна
Активное окно
Видимость
Свернутые, развернутые и восстановленные окна
Размер и позиция окна
Размер окна
Позиция окна
Размер и позиция по умолчанию
Отслеживание размера окна

18. Рамка окна
Win32 API поддерживает следующие стили рамки окна:
Стиль
Описание
WS_BORDER
Создает окно, рамка которого является тонкой линией
WS_DLGFRAME
Создает окно с двойной рамкой. Этот стиль обычно используется для диалоговых окон. Окна этого стиля не могут иметь заголовок
WS_EX_DLGMODALFRAME
Создает окно с двойной рамкой. В отличие от стиля WS_DLGFRAME, приложение может сочетать данный стиль со стилем WS_CAPTION, чтобы создать заголовок окна.
WS_EX_STATICEDGE
Создает окно с трехмерной границей. Обычно используется для окон, которые не принимают ввод от пользователя
WS_THICKFRAME
Создает окно с рамкой, которая позволяет изменять размер окна

Окно стиля WS_OVERLAPPED или WS_POPUPWINDOW по умолчанию имеет стиль WS_BORDER. Для создания рамки другого стиля для перекрывающегося окна можно объединить любой другой стиль со стилями WS_OVERLAPPED или WS_POPUPWINDOW.

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


19. Компоненты неклиентской области окна
Неклиентская область окна может содержать заголовок, системное меню, кнопки свертывания и развертывания, рамку, позволяющую изменять размер окна, и полосы прокрутки. Приложение может создавать окно с одним или несколькими из этих компонентов, определяя следующие стили в функции CreateWindowEx():
Стиль
Описание
WS_CAPTION
Создает окно, которое имеет заголовок (включает стиль WS_BORDER)
WS_HSCROLL
Создает окно, которое имеет горизонтальную полосу прокрутки
WS_MAXIMIZEBOX
Создает окно, которое имеет кнопку развертывания. Этот стиль не может сочетаться со стилем WS_EX_CONTEXTHELP
WS_MINIMIZEBOX
Создает окно, которое имеет кнопку свертывания. Этот стиль не может сочетаться со стилем WS_EX_CONTEXTHELP
WS_SYSMENU
Создает окно, которое имеет системное меню. При этом можно также определить стиль WS_CAPTION
WS_VSCROLL
Создает окно, которое имеет вертикальную полосу прокрутки


20. Начальное состояние
Перечисленные ниже стили указывают, в каком сосотоянии будет отображено созданное окно. Оно может быть доступным или недоступным, видимым или невидимым, свернутым или развернутым:
Стиль Описание
WS_DISABLED
Создает окно, которое изначально является недоступным. Такое окно не может принимать входные
данные от пользователя
WS_MAXIMIZE
Создает окно, которое изначально является развернутым
WS_MINIMIZE
Создает окно, которое изначально является свернутым
WS_VISIBLE
Создает окно, которое изначально является видимым


21. Родительские и дочерние стили
Перечисленные ниже стили указывают, что дочерние окна будут отсекаться от своего родителя или сестринских окон, т.е. никакое другое окно не сможет рисовать на поверхности данного дочернего окна:
Стиль Описание
WS_CLIPCHILDREN
Исключает область, занятую дочерними окнами, во время рисования в пределах родительского окна. Используйте этот стиль при создании родительского окна.
WS_CLIPSIBLINGS
Отсекает дочерние окна друг от друга, то есть когда определенное дочернее окно получает сообщение WM_PAINT, стиль WS_CLIPSIBLINGS отсекает все другие дочерние окна, которые перекрывают данное дочернее окно, от той области дочернего окна, которая будет обновлена. Если стиль WS_CLIPSIBLINGS не определен и дочерние окна перекрывают друг друга, то можно при рисовании в клиентской области одного дочернего окна рисовать и в клиентской области соседнего дочернего окна.


22. Дополнительные стили
Перечисленные ниже стили могут быть определены параметром dwExStyle функции CreateWindowEx():
Стиль Описание
WS_EX_ACCEPTFILES
Означает, что окно способно принимать файлы, перемещенные с помощью мыши (с использованием технологии drag-drop)
WS_EX_CONTEXTHELP
Помещает кнопку с вопросительным знаком в область заголовка окна. Когда пользователь нажимает эту кнопку, курсор превращается в стрелку с вопросительным знаком. Если затем пользователь кликает на дочернее окно, оно получает сообщение WM_HELP. Дочернее окно должно передать это сообщение функции окна родителя, которая вызывает функцию WinHelp(), используя команду HELP_WM_HELP. Функция WinHelp() запускает приложение Windows Help (WINHELP.EXE). Приложение Windows Help отображает временное окно, которое обычно содержит справку для дочернего окна. Стиль WS_EX_CONTEXTHELP несовместим со стилями WS_MAXIMIZEBOX и WS_MINIMIZEBOX.
WS_EX_CONTROLPARENT
Позволяет пользователю переходить с одного дочернего окна на другое с помощью клавиши TAB.
WS_EX_DLGMODALFRAME
Создает окно с двойной рамкой. В отличие от стиля WS_DLGFRAME этот стиль позволяет приложению также определить стиль WS_CAPTION, чтобы создать заголовок окна.
WS_EX_NOPARENTNOTIFY
Определяет, что когда дочернее создается или уничтожается, оно не будет посылать своему родителю сообщение WM_PARENTNOTIFY.
WS_EX_TOPMOST
Создает приоритетное окно, т.е.определяет, что окно должно быть помещено поверх всех окон, которые не являются приоритетными, и оставаться поверх неприоритетных окон даже в том случае, если оно неактивно или заблокировано.
WS_EX_TOOLWINDOW
Создает окно панели инструментов (tool window); то есть предполагается, что окно будет использоваться в качестве перемещаемой панели инструментов. Окно панели инструментов имеет более короткий заголовок, чем у обычного окна, и его заголовок отображается шрифтом меньшего размера. Окно панели инструментов не отображается на панели задач или в окне, которое появляется, когда пользователь нажимает ALT+TAB.


23. Окно, принадлежащее другому окну
Перекрывающееся или временное окно может принадлежать другому перекрывающемуся или временному окну. Если окно принадлежит другому окну, это накладывает на него некоторые ограничения:
  1. Находящееся в собственности окно всегда находится выше своего владельца в Z-порядке.
  2. Windows автоматически уничтожает находящееся в собственности окно, если уничтожается его владелец.
  3. Находящееся в собственности окно скрывается, когда сворачивается его владелец.
Только перекрывающиеся и временные окна могут владеть другими окнами; дочернее окно не может владеть другим окном. Приложение создает находящееся в собственности окно, определяя дескриптор его владельца в качестве параметра hwndParent функции CreateWindowEx(), когда оно создает окно стиля WS_OVERLAPPED или WS_POPUP. Параметр hwndParent должен идентифицировать перекрывающееся или временное окно. Если hwndParent идентифицирует дочернее окно, Windows назначает владельцем родителя данного дочернего окна. После создания находящегося в собственности окна, приложение не может передавать владение этим окном другому окну.

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

Приложение может использовать функцию GetWindow() с флагом GW_OWNER, чтобы получить дескриптор владельца окна.


24. Заблокированное окно
Окно может быть заблокировано. Заблокированное окно (disabled window) не получает входных данных от клавиатуры или мыши, но оно может получать сообщения от других окон, приложений или от Windows. Приложение обычно блокирует окно, чтобы запретить пользователю его использовать. Например, приложение может заблокировать какую-либо кнопку в диалоговом окне, чтобы запретить пользователю нажимать на нее. Приложение может в любое время активировать (enable) заблокированное окно; активирование окна позволяет ему получать входные данные.

По умолчанию окно создается активным. Однако приложение может определить стиль WS_DISABLED, чтобы заблокировать новое окно. Приложение может активировать или заблокировать существующее окно с помощью функции EnableWindow(). Windows посылает окну сообщение WM_ENABLE, когда изменяется состояние его активности (enabled state). Приложение может определить, является ли окно активным, используя функцию IsWindowEnabled().

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

Только одно окно в один момент времени может получать ввод с клавиатуры; говорят, что это окно имеет фокус клавиатуры (keyboard focus). Если приложение использует функцию EnableWindow(), чтобы блокировать окно, которое имеет фокус клавиатуры, то это окно не только становится заблокированным, но и теряет фокус клавиатуры. В этом случае EnableWindow() устанавливает фокус клавиатуры в NULL, и это означает, что никакое окно не имеет фокуса. Если дочернее окно (или другое окно-потомок) имеет фокус клавиатуры, оно теряет фокус, когда родительское окно блокируется.


25. Окна переднего плана и фоновые окна
Каждый процесс может иметь несколько потоков выполнения, и каждый поток может создавать окна. Поток, создавший окно, с которым пользователь работает в данный момент, называется потоком переднего плана (foreground thread), а данное окно называется окном переднего плана (foreground window). Все другие потоки называются фоновыми (background threads), а окна, созданные фоновыми потоками, называются фоновыми окнами (background windows).

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

Пользователь выбирает окно переднего плана щелчком мыши или с помощью комбинаций клавиш ALT+TAB или ALT+ESC. Приложение может выбрать окно переднего плана, используя функцию SetForegroundWindow(). Если новое окно переднего плана является окном верхнего уровня * (top-level window), Windows активизирует его; в противном случае, Windows активизирует связанное с данным окном окно верхнего уровня. Приложение может получить дескриптор окна переднего плана с помощью функции GetForegroundWindow(). Чтобы проверить, является ли окно Вашего приложения активным, сравните дескриптор, возвращенный функцией GetForegroundWindow() с дескриптором окна Вашего приложения.

*- окно называется окном верхнего уровня, если оно не имеет родителя или его родителем является окно рабочего стола.


26. Активное окно
Активное окно (active window) - это окно верхнего уровня, с которым пользователь работает в данный момент. Чтобы пользователь мог легко определить активное окно, Windows помещает его на вершину Z-порядка и изменяет цвет его заголовка и рамки на цвет, который определен системой для активного окна. Только окно верхнего уровня может быть активным окном. Когда пользователь работает с дочерним окном, Windows активизирует родительское окно верхнего уровня, связанное с этим дочерним окном.

Только одно окно верхнего уровня может быть активным в каждый момент времени. Пользователь может активизировать окно верхнего уровня щелчком мыши (щелкнув на само окно или на одно из его дочерних окон) или с помощью комбинаций клавиш ALT+ESC или ALT+TAB. Приложение активизирует окно верхнего уровня, используя функцию SetActiveWindow(). Ряд других функций может заставить Windows активизировать другое окно верхнего уровня. К этим функциям относятся: SetWindowPos(), DeferWindowPos(), SetWindowPlacement() и DestroyWindow(). Хотя приложение может активизировать другое окно верхнего уровня в любое время, оно должно делать это только в ответ на действия пользователя, чтобы избежать путаницы. Приложение использует функцию GetActiveWindow(), чтобы получить дескриптор активного окна.

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


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

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

Приложение может выяснить, является ли окно видимым, используя функцию IsWindowVisible(). Приложение может сделать окно видимым или скрыть его с помощью функций ShowWindow(), SetWindowPos(), DeferWindowPos() или SetWindowPlacement(). Эти функции изменяют видимость окна, устанавливая или удаляя стиль WS_VISIBLE. Они также посылают окну сообщение WM_SHOWWINDOW перед перед тем как скрыть его или сделать видимым.

Когда окно-владелец свернуто, Windows автоматически скрывает принадлежащие ему окна. Точно так же, когда окно-владелец восстанавливается, Windows автоматически показывает принадлежащие ему окна. В обоих случаях Windows посылает сообщение WM_SHOWWINDOW находящимся в собственности окнам перед тем как скрыть или показать их. Иногда приложению нужно скрыть находящиеся в собственности окна так, чтобы окно-владелец осталось видимым. В этом случае приложение может использовать функцию ShowOwnedPopups(). Эта функция устанавливает или удаляет стиль WS_VISIBLE для всех находящихся в собственности окон и посылает им сообщение WM_SHOWWINDOW перед тем как скрыть или показать их. Если окно-владелец скрывается, то это не изменяет состояние видимости принадлежащих ему окон.

Когда родительское окно является видимым, все его дочерние окна также являются видимыми. Точно так же, когда родительское окно скрыто, его дочерние окна также скрыты. Сворачивание родительского окна не влияет на состояние видимости дочерних окон; то есть дочерние окна сворачиваются вместе с родителем, но стиль WS_VISIBLE для них не изменяется.

Даже если окно имеет стиль WS_VISIBLE, пользователь может не увидеть его на экране, если другие окна полностью закрывают его или оно было перемещено за пределы экрана. Кроме того, видимое дочернее окно может быть отсечено по правилам его взаимоотношений с родителем. Если родитель не является видимым, дочернее окно также не будет видимым. Если родительское окно перемещено за пределы экрана, дочернее окно также будет перемещено, потому что оно отображается относительно верхнего левого угла родителя. Например, пользователь может переместить родительское окно далеко за пределы экрана так, что дочернее окно не будет видно, не смотря на то, что и дочернее окно, и его родитель имеют стиль WS_VISIBLE.


28. Свернутые, развернутые и восстановленные окна
Развернутое окно (maximized window) - это окно, которое имеет стиль WS_MAXIMIZE. По умолчанию Windows увеличивает развернутое окно так, чтобы оно заполнило весь экран или, если речь идет о дочернем окне, всю клиентскую область родителя. Хотя размер неразвернутого окна можно сделать таким же, как и размер развернутого окна, развернутое окно немного отличается. Windows автоматически перемещает заголовок развернутого окна наверх экрана или наверх клиентской области родительского окна. Кроме того, Windows блокирует рамку окна и позиционирующую способность заголовка (т.е. пользователь не может перемещать развернутое окно, перемещая его заголовок).

Свернутое окно (minimized window) - это окно, которое имеет стиль WS_MINIMIZE. По умолчанию Windows уменьшает свернутое окно до размера кнопки панели задач и помещает его на панель задач. Восстановленное окно (restored window) - это окно, которому возвращено состояние (размер и позиция), в котором оно находилось до сворачивания или разворачивания.

Если приложение определяет стиль WS_MAXIMIZE или WS_MINIMIZE в функции CreateWindowEx(), окно создается соответственно развернутым или свернутым. После создания окна, приложение может использовать функцию CloseWindow(), чтобы свернуть окно. Функция ArrangeIconicWindows() упорядочивает значки на рабочем столе. С помощью этой функции можно также упорядочить свернутые дочерние окна в родительском окне. Функция OpenIcon() позволяет восстановить свернутое окно.

С помощью функции ShowWindow() можно свернуть, развернуть или восстановить окно. Эта функция также позволяет устанавливать состояние видимости и активности окна. Функция SetWindowPlacement() обладает такими же возможностями, что и ShowWindow(), но кроме этого она может изменять позицию по умолчанию для свернутого, развернутого и восстановленного окна.

Функции IsZoomed() и IsIconic() соответственно определяют, развернуто или свернуто данное окно. Функция GetWindowPlacement() возвращает позицию окна, а также определяет его состояние видимости.

Когда Windows получает команду развернуть или восстановить свернутое окно, система посылает окну сообщение WM_QUERYOPEN. Если функция окна возвращает FALSE, Windows игнорирует полученную команду.

Windows автоматически устанавливает размер и позицию развернутого окна в соответствии с определенными системой значениями по умолчанию для развернутого окна. Чтобы изменить эти значения по умолчанию, приложение может использовать функцию SetWindowPlacement() или обрабатывать сообщение WM_GETMINMAXINFO, которое Windows отправляет окну прежде чем развернуть его. WM_GETMINMAXINFO содержит указатель на структуру MINMAXINFO, содержащую значения, которые Windows использует, чтобы устанавливать размер и позицию развернутого окна. Изменение этих значений отменяет значения по умолчанию.


29. Размер и позиция окна
Размер и позиция окна указываются через окаймляющий окно прямоугольник, координаты которого даются
относительно экрана или родительского окна. Координаты окна верхнего уровня (top-level window) даются относительно верхнего левого угла экрана, а координаты дочернего окна - относительно верхнего левого угла родительского окна. Приложение определяет начальный размер и положение окна при его создании, но может изменять эти характеристики в любой момент.


30. Размер окна
Размер окна (высота и ширина) задаются в пикселах. Окно может иметь нулевую ширину или высоту. Если приложение устанавливает в ноль высоту и ширину окна, то Windows приравнивает размер окна заданному по умолчанию минимальному размеру окна. Для того, чтобы узнать, какой минимальный размер окна задан по умолчанию, приложение может использовать функцию GetSystemMetrics() с флагами SM_CXMIN и SM_CYMIN.

Иногда возникает необходимость создать окно с клиентской областью заданного размера. Функции AdjustWindowRect() и AdjustWindowRectEx() позволяют вычислить требуемый размер окна, имеющего клиентскую область нужного размера. Приложение может передать вычисленный размер функции CreateWindowEx().

Приложение может увеличить окно до очень большого размера, однако, не следует задавать окну размер, больший, чем размер экрана. В связи с этим прежде чем устанавливать размер окна приложение должно узнать ширину и высоту экрана с помощью функции GetSystemMetrics() с флагами SM_CXSCREEN и SM_CYSCREEN.


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

Функция WindowFromPoint() позволяет получить дескриптор окна, занимающего определенную точку экрана. Аналогично функции ChildWindowFromPoint() и ChildWindowFromPointEx() позволяют получить дескриптор дочернего окна, занимающего определенную точку клиентской области родительского окна. При этом функция ChildWindowFromPointEx() может игнорировать невидимые, заблокированные и прозрачные дочерние окна, а функция ChildWindowFromPoint() не может.


32. Размер и позиция по умолчанию
Приложение может позволить Windows вычислять начальный размер или позицию окна верхнего уровня, задавая константу CW_USEDEFAULT в качестве параметра функции CreateWindowEx(). Если приложение устанавливает координаты окна как CW_USEDEFAULT, и оно не создало к этому моменту никаких других окон верхнего уровня, Windows устанавливает позицию нового окна относительно верхнего левого угла экрана. Если данное приложение уже создавало окна верхнего уровня, Windows устанавливает позицию нового окна относительно позиции последнего созданного приложением окна верхнего уровня. Если ширина и высота окна установлены как CW_USEDEFAULT, Windows самостоятельно вычисляет размер нового окна. Если приложение уже создало другие окна верхнего уровня, размер нового окна основывается на размере последнего созданного приложением окна верхнего уровня.
Если константа CW_USEDEFAULT указывается при создании дочернего или временного окна, Windows приравнивает размер окна заданному по умолчанию минимальному размеру окна.


33. Отслеживание размера окна (Tracking size)
Windows устанавливает максимальный и минимальный размер для окна, которое имеет стиль WS_THICKFRAME (такое окно имеет рамку, позволяющую изменять размер окна). То есть существуют минимальный и максимальный размеры окна (minimum tracking size, maximum tracking size), которые пользователь может установить для окна, перетаскивая его рамку с помощью мыши.

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

На главную
Предыдущая
Далее


Rambler's Top100
Хостинг от uCoz