SetWindowLong

注册窗口类时可以指定“每窗口额外内存” 

这段内存可以通过Get(Set)WindowLong   来访问 
SetWindowLong   的   nIndex   参数如果不小于0 
那么就是访问这段内存, 
这段内存存放什么东西都可以 
如果   nIndex   小于零 
那就是访问窗口的数据结构 

其实这是另外一个不同的功能

*********************************************************************

参数   类型 说明   
hwnd   Long 欲为其取得信息的窗口的句柄   
nIndex   Long * 
dwNewLong   Long 由nIndex指定的窗口信息的新值   


nIndex Long 欲取回的信息,可以是下述任何一个常数:   
GWL_EXSTYLE 扩展窗口样式   
GWL_STYLE                   窗口样式   
GWL_WNDPROC 该窗口的窗口函数的地址   
GWL_HINSTANCE 拥有窗口的实例的句柄   
GWL_HWNDPARENT 该窗口之父的句柄。不要用SetWindowWord来改变这个值   
GWL_ID 对话框中一个子窗口的标识符   
GWL_USERDATA 含义由应用程序规定   
DWL_DLGPROC 这个窗口的对话框函数地址   
DWL_MSGRESULT 在对话框函数中处理的一条消息返回的值   
DWL_USER  

********************************************************************************************

你可以将窗口附加字节看作一个字节数组,
假设wndClass.cbWndExtra=16; 这时系统分配了一块16字节的空间供窗口使用.
你可以将它看作是BYTE bData[16];或LONG nData[4];

SetWindowLong中的第二个0指的是 bData[0], 一次取4个字节

SetWindowLong(hWnd, 0, 0); 相当于设置nData[0]=0;

*******************************************************************************************

每一个hwnd都可能有一些和应用程序有关的数据。比如说,你可以给每一个窗口起一个名字。现在你希望得到窗口之后就知道它的名字。现在有两种办法,首先,你可以建立一全局变量表,里边有每一个hwnd和它的名字,然后每得到一个hwnd之后在这个表里边查找。这是一种和麻烦的办法。 
现在Windows位我们提供了userdata这个东西,那么我们可以把名字存在hwnd的userdata里边。这样可以实现一种“数据携带”。 
不过如果你要设计一个可以重用的窗口类,那么建议不要使用userdata,因为类的使用者可能使用userdata。比如你是标准button的编写者,那么鉴于其他的编程人员要大量的使用button,那么你不应该实用userdata,因为其它的编程人员也需要存取一些数据。这时候你应该实用附加的窗口字节。

&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&

SetWindowLong()用于改变一个窗口的属性。 
属性包括窗口的样式、扩展样式、窗口函数、窗口的ID值、窗口所在的进程的句柄、和用户自定义的一个USER   DATA(也就是WNDCLASS结构里的cbWndExtra,通常为0,   其实没有多大的作用)。 
至于改变的是何种属性就由该API的第二个参数nIndex决定,譬如GWL_STYLE就代表要修改的是窗口的样式,具体的样式标致由第三个参数dwNewLong指出。 

http://blog.csdn.net/luo809976897/article/details/49309703

原文地址:https://www.cnblogs.com/findumars/p/6857838.html