Функция 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, RegisterClassEx, SetParent, 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 |
Нет |
Замечания по платформе |
Не имеется |