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


Функция SetWindowLongW (winuser.h)

Изменяет атрибут указанного окна. Функция также задает 32-разрядное значение (long) с указанным смещением в дополнительную память окна.

Примечание Эта функция заменена функцией SetWindowLongPtr . Чтобы написать код, совместимый с 32-разрядной и 64-разрядной версиями Windows, используйте функцию SetWindowLongPtr .
 

Синтаксис

LONG SetWindowLongW(
  [in] HWND hWnd,
  [in] int  nIndex,
  [in] LONG dwNewLong
);

Параметры

[in] hWnd

Тип: HWND

Дескриптор для окна и, косвенно, класса, к которому принадлежит окно.

[in] nIndex

Тип: int

Отсчитываемое от нуля смещение к заданному значению. Допустимые значения находятся в диапазоне от нуля до количества байтов дополнительной памяти окна за вычетом размера целого числа. Чтобы задать любое другое значение, укажите одно из следующих значений.

Значение Значение
GWL_EXSTYLE
–20
Задает новый расширенный стиль окна.
GWL_HINSTANCE
–6
Задает новый дескриптор экземпляра приложения.
GWL_ID
-12
Задает новый идентификатор дочернего окна. Окно не может быть окном верхнего уровня.
GWL_STYLE
-16
Задает новый стиль окна.
GWL_USERDATA
-21
Задает пользовательские данные, связанные с окном. Эти данные предназначены для использования приложением, создающим окно. Изначально его значение равно нулю.
GWL_WNDPROC
–4
Задает новый адрес для процедуры окна.

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

 

Следующие значения также доступны, если параметр hWnd определяет диалоговое окно.

Значение Значение
DWL_DLGPROC
DWLP_MSGRESULT + sizeof(LRESULT)
Задает новый адрес процедуры диалогового окна.
DWL_MSGRESULT
0
Задает возвращаемое значение сообщения, обработанного в процедуре диалогового окна.
DWL_USER
DWLP_DLGPROC + sizeof(DLGPROC)
Задает новые дополнительные сведения, которые являются частными для приложения, например дескрипторы или указатели.

[in] dwNewLong

Тип: LONG

Значение на замену.

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

Тип: LONG

Если функция выполняется успешно, возвращаемое значение является предыдущим значением указанного 32-разрядного целого числа.

Если функция выполняется неудачно, возвращается нулевое значение. Дополнительные сведения об ошибке можно получить, вызвав GetLastError.

Если предыдущее значение указанного 32-разрядного целого числа равно нулю и функция завершается успешно, возвращаемое значение равно нулю, но функция не очищает последние сведения об ошибке. Это затрудняет определение успеха или неудачи. Чтобы решить эту ошибку, следует очистить последние сведения об ошибке, вызвав Метод SetLastError с 0 перед вызовом SetWindowLong. Затем сбой функции будет отмечен возвращаемым значением, равным нулю, и результатом GetLastError , не равным нулю.

Комментарии

Некоторые данные окна кэшируются, поэтому изменения, внесенные с помощью SetWindowLong , не вступают в силу, пока вы не вызовете функцию SetWindowPos . В частности, при изменении любого из стилей кадров необходимо вызвать SetWindowPos с флагом SWP_FRAMECHANGED для правильного обновления кэша.

При использовании SetWindowLong с индексом GWL_WNDPROC для замены процедуры window процедура должна соответствовать рекомендациям, указанным в описании функции обратного вызова WindowProc .

Если вы используете SetWindowLong с индексом DWL_MSGRESULT , чтобы задать возвращаемое значение для сообщения, обработанного процедурой диалогового окна, вы должны вернуть значение TRUE непосредственно после этого. В противном случае при вызове любой функции, которая приводит к тому, что процедура диалога получает сообщение о окне, вложенное сообщение окна может перезаписать возвращаемое значение, заданное с помощью DWL_MSGRESULT.

Вызов Метода SetWindowLong с индексом GWL_WNDPROC создает подкласс класса окна, используемого для создания окна. Приложение может подкласс системного класса, но не должно подкласса класса окна, созданного другим процессом. Функция SetWindowLong создает подкласс окна, изменяя процедуру окна, связанную с определенным классом окна, в результате чего система вызывает новую процедуру окна вместо предыдущей. Приложение должно передавать все сообщения, не обработанные новой процедурой окна, в предыдущую процедуру, вызывая CallWindowProc. Это позволяет приложению создать цепочку оконных процедур.

Зарезервируйте дополнительную память окна, указав ненулевое значение в элементе cbWndExtra структуры WNDCLASSEX, используемой с функцией RegisterClassEx .

Не следует вызывать SetWindowLong с индексом GWL_HWNDPARENT , чтобы изменить родительский элемент дочернего окна. Вместо этого используйте функцию SetParent .

Если окно имеет стиль класса CS_CLASSDC или CS_OWNDC, не устанавливайте стили расширенных окон WS_EX_COMPOSITED или WS_EX_LAYERED.

Вызов Метода SetWindowLong для задания стиля на индикаторе выполнения приведет к сбросу его положения.

Примеры

Пример см. в разделе Подкласс окна.

Примечание

Заголовок winuser.h определяет SetWindowLong в качестве псевдонима, который автоматически выбирает версию ANSI или Юникод этой функции на основе определения константы препроцессора ЮНИКОД. Использование псевдонима, не зависящий от кодирования, с кодом, который не является нейтральным для кодировки, может привести к несоответствиям, которые приводят к ошибкам компиляции или времени выполнения. Дополнительные сведения см. в разделе Соглашения для прототипов функций.

Требования

   
Минимальная версия клиента Windows 2000 Professional [только классические приложения]
Минимальная версия сервера Windows 2000 Server [только классические приложения]
Целевая платформа Windows
Header winuser.h (включая Windows.h)
Библиотека User32.lib
DLL User32.dll
Набор API ext-ms-win-ntuser-windowclass-l1-1-0 (появилось в Windows 8)

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

CallWindowProc

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

GetWindowLong

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

RegisterClassEx

Setparent

SetWindowLongPtr

WNDCLASSEX

Классы окон

Windowproc