Поделиться через


Функция 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. Этот параметр должен быть дескриптором окна или одним из следующих значений.

Значение Значение
HWND_BOTTOM
(HWND)1
Places окно в нижней части порядка Z. Если параметр hWnd определяет самое верхнее окно, оно теряет состояние верхней части и помещается в нижней части всех остальных окон.
HWND_NOTOPMOST
(HWND)-2
Places окна выше всех неверных окон (т. е. за всеми верхними окнами). Этот флаг не действует, если окно уже является окном, не самым верхним.
HWND_TOP
(HWND)0
Places окна в верхней части порядка Z.
HWND_TOPMOST
(HWND)-1
Places окна выше всех окон, не являющихся верхними. Окно сохраняет самое верхнее положение даже при отключении.
 

Дополнительные сведения об использовании этого параметра см. в следующем разделе Примечаний.

[in] X

Тип: int

Новое положение левой части окна в клиентских координатах.

[in] Y

Тип: int

Новое положение верхней части окна в клиентских координатах.

[in] cx

Тип: int

Новая ширина окна (в пикселях).

[in] cy

Тип: int

Новая высота окна (в пикселях).

[in] uFlags

Тип: UINT

Флаги определения размера и расположения окна. Этот параметр может быть сочетанием следующих значений.

Значение Значение
SWP_ASYNCWINDOWPOS
0x4000
Если вызывающий поток и поток, которому принадлежит окно, присоединены к разным входным очередям, система отправляет запрос потоку, которому принадлежит окно. Это предотвращает блокировку выполнения вызывающего потока, пока другие потоки обрабатывают запрос.
SWP_DEFERERASE
0x2000
Предотвращает создание сообщения WM_SYNCPAINT .
SWP_DRAWFRAME
0x0020
Рисует рамку (определенную в описании класса окна) вокруг окна.
SWP_FRAMECHANGED
0x0020
Применяет новые стили кадров, заданные с помощью функции SetWindowLong . Отправляет WM_NCCALCSIZE сообщение в окно, даже если размер окна не изменяется. Если этот флаг не указан, WM_NCCALCSIZE отправляется только при изменении размера окна.
SWP_HIDEWINDOW
0x0080
Скрывает окно.
SWP_NOACTIVATE
0x0010
Не активирует окно. Если этот флаг не установлен, окно активируется и перемещается в верхнюю часть верхней или не верхней группы (в зависимости от параметра hWndInsertAfter ).
SWP_NOCOPYBITS
0x0100
Удаляет все содержимое клиентской области. Если этот флаг не указан, допустимое содержимое клиентской области сохраняется и копируется обратно в клиентную область после изменения размера окна.
SWP_NOMOVE
0x0002
Сохраняет текущую позицию (игнорирует параметры X и Y ).
SWP_NOOWNERZORDER
0x0200
Не изменяет положение окна-владельца в порядке Z.
SWP_NOREDRAW
0x0008
Не перерисовывает изменения. Если этот флаг установлен, перерисовка не выполняется. Это относится к клиентской области, неклиентской области (включая строку заголовка и полосы прокрутки) и любой части родительского окна, обнаруженной в результате перемещения окна. Если этот флаг установлен, приложение должно явно сделать недействительными или перерисовывать все части окна и родительского окна, требующие перерисовки.
SWP_NOREPOSITION
0x0200
То же, что и флаг SWP_NOOWNERZORDER .
SWP_NOSENDCHANGING
0x0400
Запрещает окну получать сообщение WM_WINDOWPOSCHANGING .
SWP_NOSIZE
0x0001
Сохраняет текущий размер (игнорирует параметры cx и cy ).
SWP_NOZORDER
0x0004
Сохраняет текущий порядок Z (игнорирует параметр hWndInsertAfter ).
SWP_SHOWWINDOW
0x0040
Отображает окно .

Возвращаемое значение

Тип: 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, не является активным окном.
Приложение не может активировать неактивное окно, не доведя его до верхней части порядка Z. Приложения могут изменять положение активированного окна в порядке Z без ограничений или активировать окно, а затем переместить его в верхнюю или не верхнюю часть окон.

Если самое верхнее окно перемещается в нижнюю часть (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)

См. также раздел

Основные понятия

MoveWindow

Справочные материалы

SetActiveWindow

SetForegroundWindow

Windows