- •Уп. 1. Создание оконных приложений Win32
- •1. Определения
- •2. Класс окон
- •2.1. Описание используемых классом окон ресурсов
- •2.2. Пример регистрации класса окон
- •2.3. Функция окна
- •3. Создание окон
- •4. Главная функция приложения
- •5. Создание приложения Win32
- •1.6. Вспомогательные функции создания окон
- •1.6.1. Функции поиска и определения состояния окон
- •1.6.2. Функции перемещения окон
- •1.6.3. Сообщения приложения для пользователя
- •7. Примеры создания окон
- •7.1. Проверка наличия предыдущего экземпляра
- •7.2. Расположение окон черепицей
- •Контрольные вопросы
- •Упражнения
- •Приложение 1
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 равны соответственно ширине и высоте рабочей области.
