关于SetWindowLong函数

SetWindowLong 函数
SetWindowLong 函数 改变一个指定窗口的属性。这个函数还在窗口的附加内存中以指定的偏移量设置一个32位的值。
提示:
这个函数已经被SetWindowLongPtr 函数所取代。想写兼容32位和64位windows系统的程序,请使用SetWindowLongPtr函数。
语法:
LONG SetWindowLong( HWND hWnd,
    int nIndex,
    LONG dwNewLong
);
参数:
hWnd
一个窗口句柄,间接来说,也可当成是窗口所属的窗口类。
Windows 95/98/Me:如果指定的窗口句柄和呼叫线程不属于同一个进程,这个函数可能出错。
nIndex
为被将要被设定的值指定一个从0开始的偏移量,有效值得范围为从0到附加窗口内存的字节数减去一个int型所占字节数。想要设定其他值,请指定下面列出的值:
GWL_EXSTYLE
设定一个扩展窗口样式,更多信息请参看CreateWindowEx
GWL_STYLE
设定一个新的窗口样式

GWL_WNDPROC
设定一个新的窗口过程地址。
Windows NT/2000/XP: 如果窗口和呼叫线程不属于同一个进程,这个属性不能更改。
GWL_HINSTANCE
设置一个新的应用程序实例句柄
GWL_ID
设置一个新窗口标志符
GWL_USERDATA
设置和窗口相关的用户数据,这个数据被应用程序用来创建窗口,他的值被初始化为0.

下面的取值在窗口句柄指向对话框的时候是可用的
DWL_DLGPROC
设置一个新的对话框过程的地址
DWL_MSGRESULT
设置对话框过程处理一条消息后的返回值
DWL_USER
给应用程序设置私有的附加信息,比如:句柄或指针


dwNewLong
指定替代值

返回值:
如果函数调用成功,那么返回值是前面指定的32位整数的值。
如果调用失败,返回值是0.可以调用GetLastError来得到更多的出错信息。
如果先前指定的32位整数的值是0,并且函数调用成功,那么返回值也是0,但是函数调用期间并不会清空以前的出错信息,这就造成很难判断到底是否调用成功。为了应对这种情况,应该在呼叫SetWindowLong之前先呼叫SetLastError(0),这样以来,就可以通过GetLastError的返回值是否为0来判断SetWindowLong调用是否成功。

讨论(remarks)
如果某个窗口的数据是在缓存中,那么你通过调用SetWindowLong在你调用SetWindowPos之前不会起作用。特别的,如果你改变了框架的任何某个样式的话,那你必须调用SetWindowPos,且使用SWP_FRAMECHANGED标志符,来确保缓存被正确的更新。
如果你调用SetWindowLong时使用DWL_WNDPROC索引号来更替窗口过程,那么这个窗口过程必须符合WindowProc回叫函数的准则。
如果你调用SetWindowLong时使用了DWL_MSGRESULT索引号来设置一个对话框过程处理一条消息的返回值,你在这之后直接应该返回一个真值,否则,如果你调用任何一个会使你的对话框过程收到一条windows消息的函数,嵌套的window消息会覆写你通过DWL_MSGRESULT设定的返回值。

呼叫SetWindowLong时使用GWL_WNDPROC索引号会创建一个窗口类的子类。一个应用程序可以子类化一个系统的类,但却不能将一个其它过程创建的窗口类子类化。SetWindowLong创建了一个窗口子类,这是通过改变与一个特定的窗口类相关的窗口过程来实现的,这样做会导致系统去调用新的窗口过程而不是先前的那个。一个应用程序必须把任何不被新窗口过程处理的消息交给先前的那个窗口过程来处理(通过调用CallWindowProc),这样就使得应用程序能创建一条窗口过程的链条。
分配窗口附加内存,请设定WNDCLASSEX结构体的cbWndExtra成员的值。这要调用RegisterClassEx函数来实现。
你不能调用SetWindowLong(GWL_HWNDPARENT)来改变一个字窗口的父窗口,而应该使用SetParent函数。
如果一个窗口的窗口类别中有CS_CLASSDC或者CS_OWNDC,那么请不要把窗口的扩展样式设置成WS_EX_COMPOSITED 或 WS_EX_LAYERED。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值