Изменение размеров и расположения окна
С помощью функции WinSetWindowPos приложение может изменить расположение или размеры созданного ранее окна. Прототип этой функции приведен ниже:
BOOL WinSetWindowPos ( HWND hwnd, // идентификатор окна HWND hwndInsertBehind,// относительный // порядок расположения LONG x, // координата по оси X LONG y, // координата по оси Y LONG cx, // ширина окна LONG cy, // высота окна ULONG fl); // индикатор изменения позиции
Через параметр hwnd функции передается идентификатор окна, размеры или расположение которого будут изменяться.
Параметр hwndInsertBehind задает новое расположение окна по оси Z (если в параметре fl, описанном ниже, указан флаг SWP _ZORDER ).
Сделаем пояснение относительно оси Z .
Ось Z направлена перпендикулярно к плоскости экрана в направлении от экрана к глазам пользователя.
Если на экране отображается несколько перекрывающих друг друга окон, можно считать, что все эти окна имеют разные координаты вдоль оси Z. Так как экран плоский, пользователь видит не объемное изображение, а плоскую проекцию этих окон на поверхность экрана. При этом некоторые окна могут полностью или частично закрывать другие.
С помощью функции WinSetWindowPos приложение может выдвигать некоторые окна на передний план или наоборот, отодвигать на задний. Для этого в качестве значения для параметра hwndInsertBehind следует указывать константы HWND_TOP и HWND_BOTTOM , соответственно.
Что касается параметров x и y, то они задают новые значения для координат дочернего окна по соответствующим координатным осям, связанным с родительским окном (если в параметре fl указан флаг SWP _MOVE ). По умолчанию начало системы координат находится в левом нижнем углу окна, ось X направлена слева направо, а ось Y - снизу вверх. В качестве единицы измерения, опять же по умолчанию, используется пиксел - минимальный элемент изображения при выбранном видеорежиме.
Параметры cx и cy задают, соответственно, новые значения для ширины и высоты окна в пикселах (если в параметре fl указан флаг SWP _SIZE ).
Параметр fl указывается как набор флагов, объединенных при помощи логической операции ИЛИ.
Он определяет, какие операции выполняет функция WinSetWindowPos . Ниже мы привели возможные значения флагов с кратким описанием.
Флаг | Описание |
SWP _SIZE | Изменение размеров окна |
SWP _MOVE | Изменение расположения окна по осям X и Y |
SWP _ZORDER | Изменение расположения окна по оси Z |
SWP _SHOW | Отображение окна |
SWP _HIDE | Скрытие окна |
SWP _NOREDRAW | Если указан этот флаг, не выполняется перерисовка изменившихся областей окна |
SWP _NOADJUST | Если указан этот флаг, перед перемещением окна или перед изменением его размеров в функцию окна не передается сообщение WM_ADJUSTWINDOWPOS |
SWP _ACTIVATE | Активизация окна (действует только для окна Frame Window ). Если не указан флаг SWP _ZORDER и параметр hwndInsertBehind не равен HWND_BOTTOM , активизированное окно "всплывает" наверх по оси Z |
SWP _DEACTIVATE | Блокирование окна (действует только для окна Frame Window ). Если не указан флаг SWP _ZORDER и параметр hwndInsertBehind не равен HWND_TOP , активизированное окно отодвигается на задний план по оси Z |
SWP _MINIMIZE | Минимизация окна. Этот флаг несовместим с флагами SWP _MAXIMIZE и SWP_RESTORE |
SWP _MAXIMIZE | Максимизация окна. Этот флаг несовместим с флагами SWP _MINIMIZE и SWP_RESTORE |
SWP _RESTORE | Восстановление размеров окна. Этот флаг несовместим с флагами SWP _MINIMIZE и SWP_MAXIMIZE |
Заметим, что если не указан флаг SWP _NOADJUST, в функцию окна перед выполнением перемещения или изменения размеров передается сообщение WM_ADJUSTWINDOWPOS . Первый параметр этого сообщения содержит указатель на структуру типа SWP, показанную ниже:
typedef struct _SWP { ULONG fl; LONG cy; LONG cx; LONG y; LONG x; HWND hwndInsertBehind; HWND hwnd; ULONG ulReserved1; // зарезервировано ULONG ulReserved2; // зарезервировано } SWP ; typedef SWP *PSWP;
Обработчик сообщения может изменить поля x, y, cx, cy или hwndInsertBehind, внеся коррективы в изменения размеров или расположения окна.