Функция SetWindowLong


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

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

Синтаксис

LONG SetWindowLong(      
    HWND hWnd,
    int nIndex,
    LONG dwNewLong
);

Параметры

hWnd

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

Windows 95/98/Me: Функция SetWindowLong может завершиться ошибкой, если окно, определенное параметром hWnd не принадлежит тому же самому процессу, что и вызывающий поток.

nIndex

[in] Определяет отсчитываемое от нуля смещение устанавливаемого значения. Допустимые значения находятся в диапазоне от нуля до число байтов дополнительной памяти окна, минус размер целого числа. Чтобы установить любое другое значение, задайте одну из ниже перечисленных величин.
 
Значение Предназначение
GWL_EXSTYLE Устанавливает новый дополнительный стиль окна. Дополнительную информацию, см. в описании CreateWindowEx.
GWL_STYLE Устанавливает новый стиль окна.
GWL_WNDPROC Устанавливает новый адрес оконной процедуры.

Windows NT/2000/XP: Вы не можете изменить этот атрибут, если окно не принадлежит тому же самому процессу, что и вызывающий поток.

GWL_HINSTANCE Устанавливает новый дескриптор экземпляра приложения.
GWL_ID Устанавливает новый идентификатор окна.
GWL_USERDATA Устанавливает пользовательские данные, связанные с окном. Это данные предназначаются для использования приложением, которое создавало окно. Его значение первоначально является нулевым.

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

Значение Предназначение
DWL_DLGPROC Устанавливает новый адрес процедуры диалогового окна.
DWL_MSGRESULT Устанавливает возвращаемое значение сообщения, обработанного в процедуре диалогового окна.
DWL_USER Устанавливает новую дополнительную информацию, которая является частной для приложения, такую как дескрипторы или указатели.

dwNewLong

[in] Устанавливает заменяемое значение.

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

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

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

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

Замечания

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

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

Если Вы используете SetWindowLong с индексом DWL_MSGRESULT, чтобы установить возвращаемое значение сообщения, обработанного процедурой диалогового окна, вам следует непосредственно позже возвратить ИСТИНА (TRUE). В противном случае,  если Вы вызываете какую-либо функцию, которая заканчивается вашей процедурой диалогового окна получающей сообщение окна, вложенное сообщение окна может быть записано поверх возвращаемого значения, которое Вы установили, используя флажок DWLP_MSGRESULT.

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

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

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

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

SetWindowLongW поддерживается Microsoft Layer for Unicode (MSLU). SetWindowLongA также поддерживается, чтобы обеспечить более совместимый характер работы во всех операционных системах Windows. Чтобы использовать эти версии, Вы должны добавить некоторые файлы в ваше приложение, как изложено в Microsoft Layer for Unicode для систем Windows 95/98/Me. 

Пример

Пример, см. в статье Деление на подклассы окна.

Смотри также

Обзор Классы окна, Функции, используемые классами окна, CallWindowProc GetWindowLong, RegisterClassExSetParent, SetWindowLongPtr WindowProc, WNDCLASSEX

Размещение и совместимость SetWindowLong

Windows. NET Server

Да

Windows XP

Да

Windows 2000

Да

Windows NT

Да версии 3.1 и выше

Windows Me

Да

Windows 98

Да

Windows 95

Да

Используемая библиотека

User32.lib

Заголовочный файл

 

- объявлено в

Winuser.h

- включено в

Windows.h

Unicode

Нет

Замечания по платформе

Не имеется

 

Назад в оглавление
На главную страницу
На оглавление справки

Hosted by uCoz