Окна
Z-порядок
Понятие Z-order или Z-порядок
обозначает положение окна относительно
других перекрывающихмя окон. Название Z-order
возникло из следующих соображений: если
провести из экрана монитора ось координат,
перпендикулярную поверхности монитора, то
положение на этой воображаемой оси и
принимается за его Z-порядок. Окно с самым
высоким Z-порядком перекрывает все
остальные (т.е. лежит поверх всех), а с самым
низким – перекрвается всеми остальными
окнами. Когда вы переключаетесь с одного
окна на другое, вы меняете Z-порядок окон. Вы
можете увидеть весь Z-список, если нажмете
Alt+Tab и будете удерживать:
Как вы можете видеть на этом
рисунке, самый высокий Z-порядок имеет окно
браузера Опера, затем идет Delphi. Есть ряд
окон, которые всегда остаются поверх всех
остальных, они называются Top Most окна, так
как эти окна всегда находятся вверху Z-списка.
Список функций
Функция ChildWindowFromPoint
function ChildWindowFromPoint(hWndParent: HWND; Point: TPoint): HWND;
Возвращает описатель дочернего
окна, находящегося в данной точке экрана
для заданного окна. Если дочернее окно
невидимо или недоступно, то функция
возвращает его описатель в любом случае.
Если точка находится вне родительского
окна, то возвращается нуль. Если точка
находится внутри родительского окна, но вне
любого дочернего, то возвращается
описатель родительского окна.
-
hWndParent
-
Описатель родительского окна.
-
Point
-
Координата точки экрана типа TPoint(определение
типа смотри ниже)
Наверх
Функция CloseWindow
function CloseWindow(hWnd: HWND): BOOL; stdcall;
Минимизирует, но не уничтожает
окно.
- hWnd
- Описатель минимизируемого окна.
Наверх
Функция CreateWindowEx
function CreateWindowEx(dwExStyle: DWORD; lpClassName: PChar; lpWindowName:
PChar; dwStyle: DWORD; X, Y, nWidth, nHeight: Integer; hWndParent: HWND; hMenu:
HMENU; hInstance: HINST; lpParam: Pointer): HWND;
Создает окно с заданными
свойствами. Делает все то, что делает CreateWindow,
кроме того, позволяет создавать окна с
дополнительными стилями. Параметры жтой
функции со второго по последний полностью
идентичны аналогичным параметрам функции CreateWindow.
- dwExStyle
- определяет расширенный стиль окна,
может быть комбинацией (при помощи
оператора or) cледующих флагов:
- WS_EX_ACCEPTFILES
- на окно можно перетаскивать файлы из
Проводника, когда пользователь
опускает на окно с таким стилем файлы,
посылается сообщение WM_DROPFILES;
- WS_EX_APPWINDOW
- на панели задач для окна с таким
стилем появляется кнопка;
- WS_EX_CLIENTEDGE
- вокруг клиенсткой части будет рамка,
причем клиентская часть будет вдавлена
внутрь;
- WS_EX_CONTEXTHELP
- в заголовке окна появится кнопка
контекстной помощи, это флаг не может
использоваться одновременно с WS_MAXIMIZEBOX
и WS_MINIMIZEBOX;
- WS_EX_CONTROLPARENT
-
- WS_EX_DLGMODALFRAME
-
- WS_EX_LEFT
-
- WS_EX_LEFTSCROLLBAR
-
- WS_EX_LTRREADING
-
- WS_EX_MDICHILD
-
- WS_EX_NOINHERITLAYOUT
-
- WS_EX_NOPARENTNOTIFY
-
- WS_EX_OVERLAPPEDWINDOW
-
- WS_EX_PALETTEWINDOW
-
- WS_EX_RIGHT
-
- WS_EX_RIGHTSCROLLBAR
-
- WS_EX_RTLREADING
-
- WS_EX_STATICEDGE
-
- WS_EX_TOOLWINDOW
- создается окно с маленьким заголовком,
как у панели инструментов;
- WS_EX_TOPMOST
- создаваемое окно будет находиться
поверх остальных;
- WS_EX_TRANSPARENT
-
- WS_EX_WINDOWEDGE
-
Определения других констант вы сможете
найти в справке по win32api.
- lpClassName
- Имя класса окна. Вы может создавать свои
классы при помощи функции RegisterClassEx
или использовать предопределённые: edit,
button, static, scrollbar, combobox и другие;
- lpWindowName
- текст, который появится в заголовке окна
(если окно с заголовком), на кнопке (если
класс окна button), в поле ввода текста (если
класс окна edit);
- dwStyle
- список основных стилей окна. Содержит
несколько следующих констант,
соединённых оператором or:
- WS_BORDER
- окно будет иметь тонкую рамку;
- WS_CAPTION
- окно будет иметь заголовок;
- WS_CHILD или WS_CHILDWINDOW
- окно будет дочерним, то есть целиком
располагаться внутри некоторого
другого окна
- WS_CLIPCHILDREN
- площадь занимаемая дочерними окнами
не будет перерисовываться;
- WS_CLIPSIBLINGS
- перерисовка одного дочернего окна не
влияет на другие;
- WS_DISABLED
- окно создается недоступным, его можно
разблокировать при помощи функции EnableWindow;
- WS_DLGFRAME
- создается окно с рамкой как у
диалоговых окон;
- WS_GROUP
- для дочернего окна (со стилем WS_CHILD)
определяет первый элемент в группе, при
нажатии на Tab именно он получит фокус,
группа простирается до следующего
дочернего окна с тем же стилем, внутри
группы можно перемещаться при помощи
клавиш управления курсором;
- WS_HSCROLL
- создается окно с горизонтальной
полосой прокрутки;
- WS_ICONIC или WS_MINIMIZE
- создаваемое окно изначально
минимизированно;
- WS_MAXIMIZE
- создаваемое окно изначально
максимизировано;
- WS_MAXIMIZEBOX
- создаваемое окно имеет кнопку
максимизации;
- WS_MINIMIZEBOX
- создаваемое окно имеет кнопку
минимизации;
- WS_OVERLAPPED
- создается перекрывающееся окно, имеет
заголовок и рамку;
- WS_OVERLAPPEDWINDOW
- комбинация флагов WS_OVERLAPPED, WS_CAPTION,
WS_SYSMENU, WS_THICKFRAME, WS_MINIMIZEBOX и WS_MAXIMIZEBOX;
- WS_POPUP
- создается окно не имеющее изначально
рамки и заголовка, не может
использоваться со стилем WS_CHILD;
- WS_SIZEBOX или WS_THICKFRAME
- создается окно, размер которого можно
изменять;
- WS_SYSMENU
- создается окно со значком системного
меню, должен употребляться с флагом WS_CAPTION;
- WS_TABSTOP
- создается дочернее окно, которое
может получать фокус ввода при нажатии
на Tab;
- WS_TILEDWINDOW
- комбинация флагов WS_OVERLAPPED, WS_CAPTION,
WS_SYSMENU, WS_THICKFRAME, WS_MINIMIZEBOX и WS_MAXIMIZEBOX;
- WS_VISIBLE
- создается окно, которое изначально
видимо. Если вы не укажете это флаг
для окна, то вы его никогла не увидите (если
только не воспользуетесь функцией ShowWindow)!
- WS_VSCROLL
- создаваемое окно будет иметь
вертикальную полосу прокрутки.
- X
- горизонтальная координата верхнего
левого угла окна; если вы хотите
предоставить windows возможность
расположить окно по умолчанию, укажите
здесь CW_USEDEFAULT, в этом случае следующий
параметр игнорируется;
- Y
- вертикальная координата верхнего
левого угла окна;
- nWidth
- ширина окна (в единицах устройства, для
монитора – в пикселах), если вы хотите
предоставить Windows выбрать положение окна,
то выставите здесь CW_USEDEFAULT, в этом
случае следующий параметр игнорируется;
- nHeight
- высота окна (в единицах устройства, для
монитора – в пикселах);
- hWndParent
- описатель родительского окна, если окно
создается со стилем WS_CHILD, то здесь
обязательно долден стоять корректный
описатель;
- для дочернего окна (с флагом стиля WS_CHILD)
определяет идентификатор этого
дочернего окна, для обычного окна
определяет описатель главного меню окна (если
равен нулю, то используется меню из
определения класса окна);
-
- hInstance
- описатель приложения, с которым окно
связывается (для Windows NT/2000/XP игнорируется);
- lpParam
- указатель на что-нибудь, он передается в
сообщении WM_CREATE при создании окна, и в
нем могут быть переправлены какие-либо
данные для копии окна.
Наверх
Функция DestroyWindow
function DestroyWindow(hWnd: HWND): BOOL;
Уничтожает окно. Также
уничтожаются все дочерние окна. Можно
уничтожить только окно из текужего потока,
то есть, уничтожить окно, созданное чужим
приложением, при помощи этой функции нельзя.
- hWnd
- Описатель уничтожаемого окна.
Наверх
Функция EnableWindow
function EnableWindow(hWnd: HWND; bEnable: BOOL): BOOL;
Устанавливает доступность окна(окно
недоступно, если оно не отвечает на события
мыши, клавиатуры и т.д.). Аналог в Delphi
свойство Enabled компонентов. EnableWindow
возвращает True, если всё прошло успешно и False
в противном случае.
- hWnd
- Описатель окна.
- bEnable
- Булево значение, определяющее
доступность окна.
Пример:
...
EnableWindow(wndButton,false);
//сделать кнопку с описателем wndButton недоступной
...
|
Наверх
Функция FindWindow
function FindWindow(className,WindowName : PChar) : HWND;
Функция возвращает описатель окна,
удовлетворяющий запросу (0 -если такого окна
не найдено).
- ClassName
- Имя класса, по которому призводится
поиск среди ВСЕХ окон системы.
- WindowName
- Заголовок окна
Один из параметров может быть равен nil,
тогда поиск ведется по другому параметру.
Пример:
...
Var Hwnd1 : HWND;
Begin
Hwnd1:=FindWindow('TForm1',nil);//Поиск окна с именем класса TForm
end;
...
|
Наверх
Функция GetClassLong
function GetClassLong(hWnd: HWND; nIndex: Integer): Integer;
Эта функция возвращает 32-разрядное
целое, взятое из определенного поля записи TWndClassEx
указанного окна.
- hWnd
- Описатель окна
- nIndex
- Константа, определяющая что будет
возвращено. Должна быть одна из следующих:
- GCL_MENUNAME
- Возвращает указатель на строку,
содержащую имя меню класса,
определенного в файле ресурсов
связанного с некоторой программой.
- GCL_HBRBACKGROUND
- Возвращает описатель (HBRUSH) кисти фона,
ассоциированной с классом
- GCL_HCURSOR
- Возвращает описатель (HCURSOR) курсора,
фссоциированного с классом
- GCL_HICON
- Возвращает описатель (HICON) пиктограммы,
ассоциированной с классом
- GCL_HMODULE
- Возвращает описатель процесса (HMODULE),
зарегистртровавшего класс.
- GCL_CBWNDEXTRA
- Возвращает размер памяти (в байтах),
выделенной под хранение
дополнительных данных ДАННОГО ОКНА.
Описание как использвать эту память,
смотри в описании функции GetWindowLong
- GCL_CBCLSEXTRA
- Возвращает размер памяти (в байтах),
выделенной под хранение
дополнительных данных класса.
- GCL_WNDPROC
- Возвращает адрес оконной процедуры,
связанной с классом.
- GCL_STYLE
- Возвращает стиль класса (наличие того
или иного стиля проверяется побитовой
операцией And с помощью констант
типа cs_XXX )
- GCL_HICONSM
- Возвращает описатель маленькой
пиктограммы, связанной с классом.
Обратите внимание: в случае, когда
функция возвращает указатель, необходимо
приведение типов (Integer -> Pointer). Делать это
можно так:
...
var p : Pointer;
Begin
p:=Pointer(GetClassLong(wnd,GCL_WNDPROC));
//Делайте затем с p что хотите (если сможете...)
End;
...
|
Наверх
\Функция GetDesktopWindow
function GetDesktopWindow: HWND
Функция возвращает описатель окна
Рабочего Стола (Desktop). Без параметров.
Наверх
GetParent
function GetParent(hWnd: HWND): HWND;
Возвращает описатель
родительского окна для окна hWnd.
- hWnd
- Описатель окна
Функция GetWindow
function GetWindow(Wnd : HWND; Param) : HWND
Функция возвращает описатель окна
удовлетворяющий запросу.
- Wnd
- Описатель какого-либо начального окна
- Param
- Принимает одно из следующих значений-констант:
- gw_Owner
- Возвращается описатель окна-предка (0
— если нет предка).
- gwHWNDFirst
- Возвращает описатель первого окна (относительно
Wnd).
- gw_HWNDNext
- Возвращает описатель следующего окна
(окна перебираются без повторений, т.е.
если вы не меняли параметр Wnd функции,
повторно описатели не возвращаются)
- gw_Child
- Возвращает описатель первого
дочернего окна.
Пример:
...
var s:string; Han, Child : HWND;
Begin
han:=GetWindow(wnd,GW_HWNDFIRST);{получаем описатель первого окна
относительно окна с описателеи wnd}
End;
...
|
Наверх
Функция GetWindowLong
function GetWindowLong(hWnd: HWND; nIndex: Integer): Longint;
Возвращает информацию о некотором окне в
виде 32-битного целого.
- hWnd
- Описатель окна
- nIndex
- Константа,определяющая, что будет
возвращено. Должна быть одна их следующих:
- GWL_WNDPROC
- Возвращает адрес оконной процедуры,
связанной с данным окном. Полученный
адрес (после соответсвующих приведений
типов) может использоваться в функции CallWindowProc.
Данное значение обычно используют,
если хотят заменить существующую
оконную процедуру на свою собственную,
при этом, чтобы не потерять
работоспособности окна, обычно и
используют CallWindowProc.
- GWL_HINSTANCE
- Возвращает описатель приложения,
заданный при создании окна функцией CreateWindowEx.
- GWL_HWNDPARENT
- Возвращает описатель (HWND)
родительского окна
- GWL_STYLE
- Возвращает стиль окна. Конкркетные
значения стилей узнаются при помощи
побитовой операции And и констант WS_XXX
- GWL_EXSTYLE
- Возвращает расширенный стиль окна.
Конкркетные значения стилей узнаются
при помощи побитовой операции And и
констант WS_EX_XXX
- GWL_USERDATA
- Возвращает 32-битное целое,
ассоциированное с окном (это последний
параметр в вызове CreateWindow или CreateWindowEx)
- GWL_ID
- Возвращает идентификатор окна (он не
имеет ничего общего с описателем окна!),
задаваемый параметром hMenu для дочерних
окон при вызове CreateWindow или CreateWindowEx
Обратите внимание: в случае, когда
функция возвращает указатель, необходимо
приведение типов (Integer -> Pointer). Делать это
можно так:
...
var p : Pointer;
Begin
p:=Pointer(GetWindowLong(wnd,GWL_WNDPROC));
//Делайте затем с p что хотите (если сможете...)
End;
...
|
Наверх
Функция GetWindowText
function GetWindowText(hWnd: HWND; lpString: PChar; nMaxCount: Integer):
Integer;
Функция возвращает текст окна. Для
формы это будет заголовок, для кнопки —
надпись на кнопке, для поля ввода – текст
поля.
- hWnd
- Описатель того окна, текст которого
нужно получить.
- lpString
- Переменная, в которую будет помещен
результат
- nMaxCount
Максимальная длина текста, если текст
длиннее, то он обрезается.
Пример:
...
var Buff : Array[0..127] of char; s : String;
begin
GetWindowText(wnd,Buff,SizeOf(Buff));
s: = Buff;
...
end
...
|
Наверх
Функция IsWindow
function IsWindow(hWnd: HWND): BOOL; Возвращает True,
если окно с заданным описателем
существует и False в противном случае.
- Hwnd
- Описатель нужного окна
Наверх
Функция IsWindowEnabled
function IsWindowEnabled(hWnd: HWND): BOOL;
Возвращает для заданного окна: True,
если окно доступно и False в противном случае.
- hWnd
- Описатель окна.
Наверх
Функция IsWindowVisible
function IsWindowVisible(hWnd: HWND): BOOL;
Возвращает True если данное окно
видимо.
- hWnd
- Описатель окна.
Окно может быть скрыто при помощи
функции ShowWindow
Наверх
Функция MoveWindow
MoveWindow(hWnd: HWND; X, Y, nWidth, nHeight: Integer; bRepaint: BOOL):
BOOL;
Перемещает окно в новую позицию.
- hWnd
- Описатель перемещаемого окна.
- X, Y, nWidth, nHeight
- Соответственно: новые координаты X,Y;
новая ширина, высота.
- bRepaint
- Булево значение, показывающее будет ли
окно перерисовано заново.
См. также SetWindowPos
Наверх
Функция SetClassLong
function SetClassLong(hWnd: HWND; nIndex: Integer; dwNewLong: Longint):
Integer;
Парная функция функции GetClassLong.
Устанавливает в нужное поле
соответствующее значение.
Функция возвращает старое значение поля,
чтобы его потом можно было исправить или
же возврашается ноль, если что-то пошло не
так как надо.
- hWnd
- Описатель окна
- nIndex
- Одна из констант GCL_XXX из функции GetClassLong.
В зависимости от значения этого поля
будет изменнено нужное поле.
Обратите внимание:при установке
полей-указателей необходимо приведение
типа Pointer к типу Integer.
...
var p : Pointer;
l : Integer;
Begin
...
l:=SetClassLong(wnd,GCL_WNDPROC,Integer(p));
//p — может быть и адресом любого объекта pr: @pr
End;
...
|
Наверх
Функция SetWindowLong
function SetWindowLong(hWnd: HWND; nIndex: Integer; dwNewLong: Longint):
Longint;
Парная к функции GetWindowLong.
Изменяет аттрибуты определенного окна.
Функция возвращает старое значение
свойства, если вызов прошел удачно или
нуль в противном случае.
- hWnd
- Описатель окна
- nIndex
- Константа, определяющая, какое
свойство будет изменено. Должна быть
одной из констант GWL_XXX из описания
функции GetWindowLong
- dwNewLong
- Новое значение свойства, определяемого
константой nIndex
Обратите внимание:при установке
полей-указателей необходимо приведение
типа Pointer к типу Integer.
...
var p : Pointer;
l : Integer;
Begin
...
l:=SetWindowLong(wnd,GCL_WNDPROC,Integer(p));
//p — может быть и адресом любого объекта pr : @pr
End;
...
|
Наверх
SetWindowPos
function SetWindowPos(hWnd: HWND; hWndInsertAfter: HWND; X, Y, cx, cy:
Integer; uFlags: UINT): BOOL; stdcall;
Устанавливает окно в новую
позицию
- hWnd
- Оптсатель окна
- hWndInsertAfter
- Описатель окна, перед которым в списке Z-Order
будет вставлено окно hWnd, или одна из
следующих констант:
- HWND_BOTTOM
- Поместить окно на дно списка Z-Order
- HWND_TOP
- Поместить окно на верх списка Z-Order
- HWND_TOPMOST
- Поместить окно поверх всех окон.
- HWND_NOTOPMOST
- Убрать окно с позиции «поверх всех
окон»
- X, Y, cx, cy
Соответственно — новые горизонт. , верт.
позиции окна (X, Y), а также новая
ширина
и высота (cx, cy)
- uFlags
- Одна или несколько (разделенных OR)
следующих констант:
- SWP_NOSIZE
- Не изменять размер окна после
перемещения (cx, cy игнорируются)
- SWP_NOZORDER
- Не изменять положение окна в списке
Z-Order
- SWP_SHOWWINDOW
- Сделать окно видимым после
перемещения
- SWP_HIDEWINDOW
- Спрятать окно после перемещения
- SWP_NOACTIVATE
- Не передавать фокус окну после
перемещения
- SWP_NOMOVE
- Не перемещать окно (игнорируется X,
Y)
- SWP_ASYNCWINDOWPOS
-
- SWP_DEFERERASE
-
- SWP_DRAWFRAME
-
- SWP_FRAMECHANGED
-
- SWP_NOCOPYBITS
-
- SWP_NOOWNERZORDER
-
- SWP_NOREDRAW
-
- SWP_NOSENDCHANGING
-
См. также MoveWindow
Наверх
Функция SetWindowText
function SetWindowText(hWnd: HWND; lpString: PChar): BOOL;
Устанавливает текст окна.
- hWnd
- Описатель того окна, текст которого
нужно установить
- lpString
- Строка, содержащая устанавливаемый
текст.
Пример:
...
begin
SetWindowText(wndButton,'New Text');{установить надпись на кнопке
с описателем wndButton "New Text"}
end;
...
|
Наверх
Функция ShowWindow
function ShowWindow(hWnd: HWND; nCmdShow: Integer): BOOL;
Показывает или прячет окно.
- hWnd
- Описатель нужного окна
- nCmdShow
- Константа, определяющая, что будет
сделано с окном:
- SW_HIDE
- окно будет скрыто;
- SW_SHOWNORMAL
- окно будет показано и активировано,
если окно было минимияировано или
максимизировано, то оно будет
восстановлено в исходную позицию и
размер;
- SW_SHOWMINIMIZED
- активизирует и сворачивает (минимизирует)
окно;
- SW_SHOWMAXIMIZED
- активизирует и максимизирует окно;
- SW_MAXIMIZE
- максимизирует окно;
- SW_SHOWNOACTIVATE
- то же самое, что SW_SHOWNORMAL, только
окно не активизируется;
- SW_SHOW
- отображает окно в его текущей
позиции;
- SW_MINIMIZE
- минимизирует окно и активизирует
следующее по Z-списку;
- SW_SHOWMINNOACTIVE
- то же самое, что и SW_SHOWMINIMIZED,
только окно не активизируется;
- SW_SHOWNA
- то же самое, что SW_SHOW, только окно
не активизируется;
- SW_RESTORE
- восстанавливает окно из
максимизированного или
минимизированного состояния;
- SW_SHOWDEFAULT
- отображает окно так, как оно было
отображено при старте
соответствующего приложения;
- SW_MAXIMIZE
- максимизирует окно.
Пример:
...
Begin
ShowWindow(Application.Handle,sw_hide);//Будет скрыт значок приложения
на панели задач
ShowWindow(form1.Handle,sw_hide);//Будет скрыта форма Form1
End;
...
|
Наверх
Функция WindowFromPoint
WindowFromPoint(Point: TPoint): HWND;
Возвращает описатель окна,
находящегося в данной точке экрана. Если
окно невидимо или недоступно, то функция
возвращает нуль, даже если точка находится
внутри окна. Если точка находится над
окном типа static, то возвращается
описатель окна под этим окном типа static.
Чтобы получить описатель дочернего окна
из точки, приложение может использовать
функцию ChildWindowFromPoint
- Point
- Координата точки экрана типа TPoint(определение
типа смотри ниже)
Тип TPoint
-
-
type TPoint = Record
x: Longint;
y: Longint;
end;
|
Наверх