Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Изменяет атрибут указанного окна. Функция также задает 32-разрядное (длинное) значение по указанному смещение в дополнительном окне памяти.
Синтаксис
LONG SetWindowLongA(
[in] HWND hWnd,
[in] int nIndex,
[in] LONG dwNewLong
);
Параметры
[in] hWnd
Тип: HWND
Дескриптор окна и, косвенно, класс, которому принадлежит окно.
[in] nIndex
Тип: int
Отсчитываемое от нуля смещение для заданного значения. Допустимые значения находятся в диапазоне от нуля до количества байтов дополнительной памяти окна, минус размер целого числа. Чтобы задать любое другое значение, укажите одно из следующих значений.
Ценность | Значение |
---|---|
|
Задает новый стиль расширенного окна. |
|
Задает новый дескриптор экземпляра приложения. |
|
Задает нового владельца для окна верхнего уровня. |
|
Задает новый идентификатор дочернего окна. Окно не может быть окном верхнего уровня. |
|
Задает новый стиль окна. |
|
Задает данные пользователя, связанные с окном. Эти данные предназначены для использования приложением, создавшего окно. Его значение изначально равно нулю. |
|
Задает новый адрес для процедуры окна.
Этот атрибут нельзя изменить, если окно не принадлежит тому же процессу, что и вызывающий поток. |
Следующие значения также доступны, когда параметр hWnd определяет диалоговое окно.
[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) |
См. также
Концептуальный
Справочные материалы