Окна

Z-порядок

Понятие Z-order или Z-порядок обозначает положение окна относительно других перекрывающихмя окон. Название Z-order возникло из следующих соображений: если провести из экрана монитора ось координат, перпендикулярную поверхности монитора, то положение на этой воображаемой оси и принимается за его Z-порядок. Окно с самым высоким Z-порядком перекрывает все остальные (т.е. лежит поверх всех), а с самым низким – перекрвается всеми остальными окнами. Когда вы переключаетесь с одного окна на другое, вы меняете Z-порядок окон. Вы можете увидеть весь Z-список, если нажмете Alt+Tab и будете удерживать:

список окон по 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;

Наверх

Хостинг от uCoz