Функция SetWindowPos (winuser.h)
Изменяет размер, положение и порядок Z дочернего, всплывающего окна или окна верхнего уровня. Эти окна упорядочены в соответствии с их внешним видом на экране. Самое верхнее окно получает наивысший ранг и является первым окном в порядке Z.
Синтаксис
BOOL SetWindowPos(
[in] HWND hWnd,
[in, optional] HWND hWndInsertAfter,
[in] int X,
[in] int Y,
[in] int cx,
[in] int cy,
[in] UINT uFlags
);
Параметры
[in] hWnd
Тип: HWND
Дескриптор окна.
[in, optional] hWndInsertAfter
Тип: HWND
Дескриптор окна перед расположенным окном в порядке Z. Этот параметр должен быть дескриптором окна или одним из следующих значений.
Дополнительные сведения об использовании этого параметра см. в следующем разделе Примечаний.
[in] X
Тип: int
Новое положение левой части окна в клиентских координатах.
[in] Y
Тип: int
Новое положение верхней части окна в клиентских координатах.
[in] cx
Тип: int
Новая ширина окна (в пикселях).
[in] cy
Тип: int
Новая высота окна (в пикселях).
[in] uFlags
Тип: UINT
Флаги определения размера и расположения окна. Этот параметр может быть сочетанием следующих значений.
Значение | Значение |
---|---|
|
Если вызывающий поток и поток, которому принадлежит окно, присоединены к разным входным очередям, система отправляет запрос потоку, которому принадлежит окно. Это предотвращает блокировку выполнения вызывающего потока, пока другие потоки обрабатывают запрос. |
|
Предотвращает создание сообщения WM_SYNCPAINT . |
|
Рисует рамку (определенную в описании класса окна) вокруг окна. |
|
Применяет новые стили кадров, заданные с помощью функции SetWindowLong . Отправляет WM_NCCALCSIZE сообщение в окно, даже если размер окна не изменяется. Если этот флаг не указан, WM_NCCALCSIZE отправляется только при изменении размера окна. |
|
Скрывает окно. |
|
Не активирует окно. Если этот флаг не установлен, окно активируется и перемещается в верхнюю часть верхней или не верхней группы (в зависимости от параметра hWndInsertAfter ). |
|
Удаляет все содержимое клиентской области. Если этот флаг не указан, допустимое содержимое клиентской области сохраняется и копируется обратно в клиентную область после изменения размера окна. |
|
Сохраняет текущую позицию (игнорирует параметры X и Y ). |
|
Не изменяет положение окна-владельца в порядке Z. |
|
Не перерисовывает изменения. Если этот флаг установлен, перерисовка не выполняется. Это относится к клиентской области, неклиентской области (включая строку заголовка и полосы прокрутки) и любой части родительского окна, обнаруженной в результате перемещения окна. Если этот флаг установлен, приложение должно явно сделать недействительными или перерисовывать все части окна и родительского окна, требующие перерисовки. |
|
То же, что и флаг SWP_NOOWNERZORDER . |
|
Запрещает окну получать сообщение WM_WINDOWPOSCHANGING . |
|
Сохраняет текущий размер (игнорирует параметры cx и cy ). |
|
Сохраняет текущий порядок Z (игнорирует параметр hWndInsertAfter ). |
|
Отображает окно . |
Возвращаемое значение
Тип: BOOL
Если функция выполняется успешно, возвращается ненулевое значение.
Если функция выполняется неудачно, возвращается нулевое значение. Дополнительные сведения об ошибке можно получить, вызвав GetLastError.
Комментарии
В рамках перепроектирования Vista все службы были перемещены из интерактивного рабочего стола в сеанс 0. Операции hwnd и диспетчера окон эффективны только внутри сеанса, и межсеансовые попытки управления hwnd завершатся ошибкой. Дополнительные сведения см. в разделе История разработчика Windows Vista: поваренная книга по совместимости приложений.
Если вы изменили определенные данные окна с помощью SetWindowLong, необходимо вызвать Метод SetWindowPos , чтобы изменения вступили в силу. Используйте следующую комбинацию для uFlags: SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED
.
Окно можно сделать самым верхним окном, задав для параметра hWndInsertAfterзначение HWND_TOPMOST и убедив, что флаг SWP_NOZORDER не установлен, или задав положение окна в порядке Z, чтобы оно располагалось над любыми существующими верхними окнами. Если окно, отличное от верхнего, делается самым верхним, его собственные окна также делаются самыми верхними. Его владельцы, однако, не меняются.
Если не указан ни флаг SWP_NOACTIVATE , ни флаг SWP_NOZORDER (то есть, когда приложение запрашивает одновременную активацию окна и его положение в порядке Z), значение, указанное в hWndInsertAfter , используется только в следующих случаях.
- В hWndInsertAfter не указан ни флаг HWND_TOPMOST, ни HWND_NOTOPMOST.
- Окно, определенное hWnd, не является активным окном.
Если самое верхнее окно перемещается в нижнюю часть (HWND_BOTTOM) порядка Z или после любого не самого верхнего окна, оно больше не является самым верхним. Когда самое верхнее окно становится не самым верхним, его владельцы и принадлежащие ей окна также делаются не самыми верхними окнами.
Не самое верхнее окно может принадлежать самому верхнему окну, но обратное не может произойти. Любое окно (например, диалоговое окно), принадлежащее самому верхнему окну, само по себе становится самым верхним, чтобы все принадлежащие окна оставались выше владельца.
Если приложение не находится на переднем плане и должно находиться на переднем плане, оно должно вызывать функцию SetForegroundWindow .
Чтобы использовать SetWindowPos для переноса окна в верхнюю часть, процесс, которому принадлежит окно, должен иметь разрешение SetForegroundWindow .
Примеры
Пример см. в разделе Инициализация диалогового окна.
Требования
Требование | Значение |
---|---|
Минимальная версия клиента | Windows 2000 Professional [только классические приложения] |
Минимальная версия сервера | Windows 2000 Server [только классические приложения] |
Целевая платформа | Windows |
Header | winuser.h (включая Windows.h) |
Библиотека | User32.lib |
DLL | User32.dll |
Набор API | ext-ms-win-ntuser-window-l1-1-0 (представлено в Windows 8) |
См. также раздел
Основные понятия
Справочные материалы