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指出。