Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
УП01_Окна_Создание приложения Win32.doc
Скачиваний:
4
Добавлен:
01.03.2025
Размер:
486 Кб
Скачать

1.6. Вспомогательные функции создания окон

Windows API содержит множество функций, связанных с созданием окон. Это функции поиска, определения состояния, перемещения окон, а также обмена сообщениями с пользователем.

1.6.1. Функции поиска и определения состояния окон

Часто требуется определить, существует ли окно для некоторого дескриптора. На этот вопрос отвечает функция IsWindow:

BOOL IsWindow( HWND hwnd );

Если окно с дескриптором hwnd существует, функция возвращает ненулевое значение, иначе – нуль.

Если нужно определить, имеет ли заданное окно фокус ввода, вызывают функцию IsWindowEnabled:

BOOL IsWindowEnabled( HWND hwnd );

Если окно hwnd активно, функция возвращает ненулевое значение, иначе – нуль.

Для передачи или отнятия фокуса ввода у окна вызывают функцию EnableWindow:

BOOL EnableWindow( HWND hwnd, BOOL bEnable);

При bEnable = TRUE фокус ввода передают окну hwnd, иначе – блокируют это окно.

Если окно ранее было неактивно, возвращаемое значение отлично от нуля. Если окно было активно, возвращаемое значение – нуль.

Фокус ввода окну hwnd передают с помощью функции SetFocus:

SetFocus(hwnd);

Следующая функция возвращает ненулевое значение, если окно hwnd свернуто в пиктограмму:

BOOL IsIconic(HWND hwnd);

Функция FindWindow у операционной системы запрашивает дескриптор окна (не дочернего) класса lpClassName с заголовком lpWindowName. Эта функция объявлена следующим образом:

HWND FindWindow( LPCTSTR lpClassName, LPCTSTR lpWindowName);

Если lpWindowName = NULL, то заголовок искомого окна может быть любым. Если lpClassName = NULL, искомое окно может принадлежать к любому классу. Рекомендуется указывать данные как можно более подробнее. Если такое окно найдено, функция возвращает его дескриптор, иначе – NULL.

1.6.2. Функции перемещения окон

Для перемещения и изменения размеров окна hwnd вызывают функцию MoveWindow. Ей передают новые координаты окна.

Функция MoveWindow объявлена следующим образом:

BOOL MoveWindow( HWND hwnd,

int x, //новая координата левого края окна

int У, //новая координата верхнего края окна

int nWidth, //новая ширина окна

int nHeight, //новая высота окна

BOOL bRepaint //флажок перекрашивания окна

);

Если bRepaint = TRUE, немедленно после перемещения перерисовываются те части экрана, на которых отразилось перемещение окна. Иначе окно перерисовывает себя только после обработки всех поступивших к моменту перемещения сообщений. При успешном выполнении функция возвращает ненулевое значение, иначе – нуль.

Функция SetWindowPos изменяет координаты окна hwnd на экране и его расположение по отношению к другим окнам:

BOOL SetWindowPos( HWND hwnd,

HWND hWndInsertAfter, //дескриптор порядка размещения

int x, //новая координата левого края

int у, //новая координата верхнего края

int сх, //новая ширина

int су, //новая высота

UINT uFlags //флажок позиционирования

);

В случае успешного выполнения она возвращает ненулевое значение. Параметр hWndInsertAfter может быть дескриптором предшествующего окна или равным одному из следующих значений:

Значение

Пояснение

HWND_BOTTOM

Помещает окно ниже других окон

HWND_NOTOPMOST

Помещает временное или дочернее окно выше временных и дочерних, но ниже перекрывающихся окон

HWND_TOP

Помещает окно выше всех окон

HWND_TOPMOST

То же, что HWND_NOTOPMOST, но окно сохраняет позицию после потери активности

Параметр uFlags может быть комбинацией значений из нижеследующей таблицы:

Значение

Пояснение

SWP_DRAWFRAME

Вокруг окна рисовать заданную в классе окна рамку

SWP_FRAMECHANGED

Функции окна посылать сообщение об изменении размеров, даже если размер окна не изменяется

SWP_HIDEWINDOW

Скрыть окно

SWP_NOACTIVATE

Отменить активность окна

SWP_NOCOPYBITS

Стереть содержимое рабочей области

SWP_NOMOVE

Сохранить текущую позицию

SWP_NOOWNERZORDER или SWP_NOREPOSITION

Не изменять расположение окна относительно других окон

SWP_NOREDRAW

Не перерисовывать содержимое окна

SWP_NOSENDCHANGING

Не сообщать об изменении позиции

SWP_NOSIZE

Сохранить текущий размер

SWP_NOZORDER

Не менять расположение

SWP_SHOWWINDOW

Показать окно

При одновременной работе нескольких приложений одно из них можно вывести на передний план и передать его окну фокус ввода.

Для этих целей используют функцию SetForegroundWindow. Она помещает поток, который создал заданное окно, на передний план и активизирует это окно. Синтаксис этой функции:

BOOL SetForegroundWindow (HWND hwnd );

В случае успешного перемещения функция возвращает ненулевое значение, иначе – нуль.

Для перемещения окна важно знать системные метрики экрана и окна. Их получают с помощью функции GetSystemMetrics. Она возвращает метрики и текущие установки конфигурации системы. Метрики системы – это габариты (ширина и высота) отображаемых элементов Windows. Все габариты возвращаются в пикселях.

Функция GetSystemMetrics объявлена следующим образом:

int GetSystemMetrics (int nIndex);

Параметр nIndex указывает на возвращаемую метрику системы или установку конфигурации. Ниже приводится таблица некоторых имен для этого параметра:

Имя

Возвращаемая характеристика

SM_CXMIN

Минимальная ширина окна

SM_CYMIN

Минимальная высота окна

SM_CXSCREEN

Ширина экрана

SM_CYSCREEN

Высота экрана

SM_CYCAPTION

Высота заголовка

SM_CYMENU

Высота полосы меню

Например, следующий оператор определяет ширину экрана:

int w=GetSystemMetrics(SM_CXSCREEN);

Следующая функция позволяет получить координаты обрамляющего окно hwnd прямоугольника:

BOOL GetWindowRect( HWND hwnd, LPRECT lpRect);

Параметр lpRect указывает на структуру типа RECT:

typedef struct

{ LONG left; //левый край

LONG top; //верхний край

LONG right; //правый край

LONG bottom; //нижний край

} RECT;

Координаты прямоугольника отсчитываются от левого верхнего угла экрана в пикселях. В случае успешного выполнения функция возвращает ненулевое значение. Следующий фрагмент демонстрирует получение экранных координат прямоугольника окна:

RECT rc;

GetWindowRect(hwnd, &rc);

Функция GetClientRect возвращает координаты прямоугольника, обрамляющего рабочую область окна:

BOOL GetClientRect( HWND hwnd, LPRECT lpRect);

При этом прямоугольник смещен в левый верхний угол экрана. То есть rc.left = rc.top = 0, а значения полей right и bottom равны соответственно ширине и высоте рабочей области.