18 сент. 2010 г.

SetWindowLong

Функция SetWindowLong изменяет атрибут указанного окна. Функция, также, устанавливает 32-битное значение в заданном смещении дополнительной памяти окна.
LONG SetWindowLong(
    HWND hWnd, // дескриптор окна
    int nIndex, // смещение устанавливаемого значения
    LONG dwNewLong // новое значение
);
Параметры:
hWndОпределяет окно и, косвенно, класс к которому относится окно.
nIndexОпределяет смещение (начиная от нуля) устанавливаемого значения, или одно из следующих значений:

Значение:
Действие:
GWL_EXSTYLEУстановить дополнительные стили окна.
GWL_STYLEУстановить стили окна.
GWL_WNDPROCУстановить адрес оконной процедуры, или дескриптор, который представляет адрес оконной процедуры. Для вызова оконных процедур, вы должны использовать функцию CallWindowProc.
GWL_HINSTANCEУстановить дескриптор экземпляра приложения.
GWL_HWNDPARENTУстановить дескриптор родителького окна, если оно есть.
GWL_IDУстановить идентификатор окна.

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

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

Возвращаемые значения:
При успешном завершении, функция возвращает прежнее установленное 32-битное значение.

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

Если прежнее значение равно нулю, и функция успешна, возвращаемое значение нулевое, но функия не очищает прежнюю информацию об ошибке. Может оказаться сложностью, определить ошибку или успех функции. Чтобы, все таки, справиться с этим, вы должны самостоятельно очистить информацию об ошибке при помощи SetLastError(0) перед вызовом SetWindowLong. Потом, ошибка функции будет видна по возвращаемому ненулевому значению GetLastError.
Замечания:
Функция SetWindowLong завершается с ошибкой, если окно, указанное в параметре hWnd, не относится к тому самому процессу, что вызывающий поток.

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

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

Вы не должны вызывать SetWindowLong с индексом GWL_HWNDPARENT для изменения родителя дочернему окну. Вместо этого, воспользуйтесь функцией SetParent.
Смотрите также:
CallWindowProc, GetWindowWord, RegisterClass, SetParentGetWindowLongSetWindowWord, WindowProc, WNDCLASS