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


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

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

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

Синтаксис

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

Параметры

[in] hWnd

Тип: HWND

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

[in] nIndex

Тип: int

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

Ценность Значение
GWL_EXSTYLE
-20
Задает новый стиль расширенного окна.
GWL_HINSTANCE
-6
Задает новый дескриптор экземпляра приложения.
GWL_HWNDPARENT
-8
Задает нового владельца для окна верхнего уровня.
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 для замены процедуры окна процедура окна должна соответствовать рекомендациям, указанным в описании функции обратного вызова WindowProc .

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

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

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

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

GWL_HWNDPARENT используется для изменения владельца окна верхнего уровня, а не родительского элемента дочернего окна.

Окно может иметь либо родителя, либо владельца, либо ни одного из них, но никогда не одновременно.

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

Вызов SetWindowLong , чтобы задать стиль на панели выполнения, сбросит его положение.

Примеры

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

Замечание

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

Требования

Требование Ценность
Минимальный поддерживаемый клиент Windows 2000 Professional [только классические приложения]
минимальный поддерживаемый сервер Windows 2000 Server [только классические приложения]
целевая платформа Виндоус
Заголовок 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