Для перемещения и изменения размеров окна hwnd вызывают функцию MoveWindow. Ей передают новые координаты окна.
Функция MoveWindow объявлена следующим образом:
1 2 3 4 5 6 7 | BOOL MoveWindow( HWND hwnd, int x, //новая координата левого края окна int у, //новая координата верхнего края окна int nWidth, //новая ширина окна int nHeight, //новая высота окна BOOL bRepaint //флажок перекрашивания окна ); |
Если bRepaint = TRUE, немедленно после перемещения перерисовываются те части экрана, на которых отразилось перемещение окна. Иначе окно перерисовывает себя только после обработки всех поступивших к моменту перемещения сообщений. При успешном выполнении функция возвращает ненулевое значение, иначе — NULL.
Функция SetWindowPos изменяет координаты окна hwnd на экране и его расположение по отношению к другим окнам:
1 2 3 4 5 6 7 8 | BOOL SetWindowPos( HWND hwnd, HWND hWndlnsertAfter, //дескриптор порядка размещения int х, //новая координата левого края int у, //новая координата верхнего края int сх, //новая ширина int су, //новая высота UINT uFlags //флажок позиционирования ); |
В случае успешного выполнения она возвращает ненулевое значение. Параметр hWndlnsertAfter может быть дескриптором предшествующего окна или равным одному из следующих значений:
Значение | Пояснение |
---|---|
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. Она помещает поток, который создал заданное окно, на передний план и активизирует это окно. Синтаксис этой функции:
1 | BOOL SetForegroundWindow (HWND hwnd ); |
В случае успешного перемещения функция возвращает ненулевое значение, иначе — NULL.
Для перемещения окна важно знать системные метрики экрана и окна. Их получают с помощью функции GetSystemMetrics. Она возвращает метрики и текущие установки конфигурации системы. Метрики системы — это габариты (ширина и высота) отображаемых элементов Windows. Все габариты возвращаются в пикселях.
Функция GetSystemMetrics объявлена следующим образом:
1 | int GetSystemMetrics (int nlndex); |
Параметр nlndex указывает на возвращаемую метрику системы или установку конфигурации. Ниже приводится таблица некоторых имен для этого параметра:
Имя | Возвращаемая характеристика |
---|---|
SM_CXMIN | Минимальная ширина окна |
SM_CYMIN | Минимальная высота окна |
SM_CXSCREEN | Ширина экрана |
SM_CYSCREEN | Высота экрана |
SM_CYCAPTION | Высота заголовка |
SM_CYMENU | Высота полосы меню |
Например, следующий оператор определяет ширину экрана:
1 | int w=GetSystemMetrics(SM_CXSCREEN); |
Следующая функция позволяет получить координаты обрамляющего окно hwnd прямоугольника:
1 | BOOL GetWindowRect( HWND hwnd, LPRECT IpRect); |
Параметр IpRect указывает на структуру типа
1 2 3 4 5 6 | RECT: typedef struct { LONG left; //левый край LONG top; //верхний край LONG right; //правый край LONG bottom; //нижний край } RECT; |
Координаты прямоугольника отсчитываются от левого верхнего угла экрана в пикселях. В случае успешного выполнения функция возвращает ненулевое значение. Следующий фрагмент демонстрирует получение экранных координат прямоугольника окна:
1 2 | RECT rc; GetWindowRect(hwnd, &rс); |
Функция GetClientRect возвращает координаты прямоугольника, обрамляющего рабочую область окна:
1 | BOOL GetCIientRectf HWND hwnd, LPRECT IpRect); |
При этом прямоугольник смещен в левый верхний угол экрана. То есть rc.left=rc.top=0, а значения полей right и bottom равны соответственно ширине и высоте рабочей области.
0 Комментарии。