Электронная библиотека книг Александра Фролова и Григория Фролова.
Shop2You.ru Создайте свой интернет-магазин
Библиотека
Братьев
Фроловых

Программирование для IBM OS/2

© Александр Фролов, Григорий Фролов
Том 4, М.: Диалог-МИФИ, 1993, 286 стр.

[Назад] [Содеожание] [Дальше]

2.2. Изменение размеров и расположения окна

С помощью функции 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

Если функция WinSetWindowPos завершилась успешно, она возвращает значение TRUE, при ошибке - FALSE.

Заметим, что если не указан флаг 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, внеся коррективы в изменения размеров или расположения окна.

[Назад] [Содеожание] [Дальше]