SetWindowLong基础理论

来源:互联网 发布:网络招生方案 编辑:程序博客网 时间:2024/06/08 17:21
SetWindowLong
SetWindowLong是一个Windows API函数。该函数用来改变指定窗口的属性.函数也将指定的一个32位值设置在窗口的额外存储空间的指定偏移位置。
注册窗口类时可以指定“每窗口额外内存
这段内存可以通过Get(Set) WindowLong 来访问
SetWindowLong 的 nIndex 参数如果不小于0。 SetWindowLong() 用于改变一个窗口的属性。属性包括窗口的样式、扩展样式、窗口函数、窗口的ID值、窗口所在的进程的句柄、和用户自定义的一个USER DATA(也就是WNDCLASS结构里的cbWndExtra,通常为0, 其实没有多大的作用)。 至于改变的是何种属性就由该API的第二个参数nIndex决定,譬如GWL_STYLE就代表要修改的是窗口的样式,具体的样式标致由第三个参数dwNewLong指出,比如窗口过程可以指定GWLP_WNDPROC,过程函数由第三个参数指定。

原型:SetWindowLong(
HWND hWnd, // handle to window
int nlndex, // offset of value to set
LONG dwNewLong // new value
);
参数:
hWnd
窗口句柄及间接给出的窗口所属的类。
nlndex
指定将设定的大于等于0的偏移值。有效值的范围从0到额外类的存储空间的字节数减4:例如若指定了12或多于12个字节的额外窗口存储空间,则应设索引位8来访问第三个4字节,同样设置0访问第一个4字节,4访问第二个4字节。
比如可以设置为:
SetWindowLong(m_pDlgBase->GetSafeHwnd(), GWLP_WNDPROC(指定窗口过程), (LONG)HandleWriteHwndProc(窗口函数));
GWLP_WNDPROC:值为 - 4,为窗口设定一个新的处理函数。 回掉函数通过第三个参数设置。

备注:
如果由hWnd参数指定的窗口与调用线程不属于同一进程,将导致SetWindowLong函数修改窗口过程失败,也就是说设置的是同一进程的窗口。
如果使用带GWL_WNDPROC索引值的SetWindowLong函数替换窗口过程,则该窗口过程必须与WindowProccallback函数说明部分指定的指导行一致。

可以使用带GWL_WNDPROC索引值的SetWindowLong函数创建一个窗口类的子类该窗口类是用于创建该窗口的类。一个应用程序可以以一个系统类为子类,
但是不能以一个其他进程产生的窗口类为子类,SetwindowLong函数通过改变与一个特殊的窗口类相联系的窗口过程来创建窗口子类,从而使系统调用新的窗口过程而不是以前定义的窗口过程。应用程序必须通过调用CallWindowProc函数向前窗口传递未被新窗口处理的消息,这样作允许应用程序创建一个窗口过程链。

其他参考网上函数说明使用。
原创粉丝点击