setclasslong和setwindowlong

SetWindowLong该函数改变指定窗口的属性.函数也将指定的一个32位值设置在窗口的额外存储空间的指定偏移位置。

SetClassLong该函数替换在额外类存储空间的指定偏移地址的32位长整型值,或替换指定窗口所属类的WNDCLASSEX结构.

以我的理解: SetClassLong是与窗口类有关,学过win32编程的人都知道,一个应用程序在创建某个类型的窗口(CreateWindow)前,必须首先注册该“窗口类”(Windows Class,WNDCLASS)。而这个Class即表示窗口类,所以SetClassLong是设置窗口类的属性。

SetWindowLong是已经创建好的窗口,所以它是设置窗口的属性。所以这两个还是有区别的,当我们想改变窗口的属性时就调用SetWindowLong,而改变窗口类的属性时最好调用SetClassLong,这只是我的个人见解,有不同意见的欢迎指正。

 

以下摘自百度百科,根据专业人士的总结让我们更清楚的理解它们两个的用法

函数原型:DWORD SetClassLong(HWND hWnd,int nlndex,LONG dwNewLong);

hWnd:窗口句柄及间接给出的窗口所属的类。

  nlndex:指定将被替换的32位值。在额外类存储空间中设置32位值,应指定一个大于或等于0的偏移量。

  有效值的范围从0到额外类的存储空间的字节数一4;例如,若指定了12个字节或多于12个字节的额外类存储空间,则索引值为8时,对应的是第三个32位整数值。要设置WNDCLASSEX结构中的任何值,指定下面索引之一:

  GCL_CBCLSEXTRA:设置与类相关的尺寸的字节大小。设定该值不改变己分配的额外字节数。

  GCL_CBWNDEXTRA:设置与类中的每一个窗口相关的尺寸的字节大小。设定该值不改变已分配额外字节数。查看如何进入该内存,参看SetWindowLOng。

  GCL_HBRBACKGROUND:替换与类有关的背景刷子的句柄。

  GCL_HCURSOR:替换与类有关的光标的句柄。GCL_HICON:替换与类有关的图标的句柄。

  GCL_HMODULE:替换注册类的模块的句柄。GCL_STYLE:替换窗口类的风格位。

  GCL_MENUNAME :替换菜单名字符串的地址。该字符串标识与类有关的菜单资源。

  GCL_WNDPROC :替换与窗口类有关的窗口过程的地址。

由上可知,上面的属性都是GCL_+窗口类中的参数 ;

  dwNewLong:指定的替换值。

  返回值:如果函数成功,返回值是原来类结构中32位整数;如果未事先设定,返回值为0。如果函数失败,返回值为0。若想获得更多错误信息,请调用GetLastError函数。

  备注;如果使用SetClassLong函数和GCL_WNDPROC索引值来替换窗口过程,新的窗口过程必须与WindowProc回调函数中所规定的规则一致。

  以带GCL_WNDPROC索引值的SetClassLong函数修改的一个窗口类的的子类将会影响所有随后以该类创建的窗口。应用程序可以创建一个系统类的子类,但是不能创建由其他进程创建的类的子类。

  通过使用RegisterClassEx函数将WNDCLASSEX结构中的cbWndExtra单元指定为一个非零值来保留额外的的类存储空间。

  使用SetClassLong函数要小心。例如,可以通过使用SetClassLong来改变类的背景颜色,但是这种改变不会马上生效,直到属于该类的窗体下次重绘,除非使用UpdateWindow()强迫窗体更新。

 

LONG SetWindowLong(HWND hWnd,int nlndex,LONG dwNewLong);

hWnd:窗口句柄及间接给出的窗口所属的类。

  nlndex:指定将设定的大于等于0的偏移值。有效值范围从0到额外类的存储空间的字节数-4:例如若指定了12位或多于12位的额外类存储空间,则应设为第三个32位整数的索引位8。要设置其他任何值,可以指定下面值之一:

  GWL_EXSTYLE:设定一个新的扩展风格

  GWL_STYLE:设定一个新的窗口风格。

  GWL_WNDPROC:为窗口过程设定一个新的地址

  GWL_ID:设置一个新的窗口标识符

  GWL_HINSTANCE:设置一个新的应用程序实例句柄。

  GWL_USERDATA:设置与窗口有关的32位值。每个窗口均有一个由创建该窗口的应用程序使用的32位值。

  当hWnd参数标识了一个对话框时,也可使用下列值:

  DWL_DLGPROC:设置对话框过程的新地址。

  DWL_MSGRESULT:设置在对话框过程中处理的消息的返回值。

  DWL_USER:设置的应用程序私有的新的额外信息,例如一个句柄或指针。

  dwNewLong:指定的替换值。

  返回值:如果函数成功,返回值是指定的32位整数的原来的值。如果函数失败,返回值为0。若想获得更多错误信息,请调用GetLastError函数。

  如果指定32位整数的原来的值为0,并且函数成功,则返回值为0,但是函数并不清除最后的错误信息,这就很难判断函数是否成功。这时,就应在调用SetWindowLong之前调用callingSetLastError(0)函数来清除最后的错误信息。这样,如果函数失败就会返回0,并且GetLastError。也返回一个非零值。

 

如果由hWnd参数指定的窗口与调用线程不属于同一进程,将导致SetWindowLong函数失败。

  指定的窗口数据是在缓存中保存的,因此在调用SetWindowLong之后再调用SetWindowPos函数才能使SetWindowLong函数所作的改变生效。

  如果使用带GWL_WNDPROC索引值的SetWindowLong函数替换窗口过程,则该窗口过程必须与WindowProccallback函数说明部分指定的指导行一致。

  如果使用带DWL_MSGRESULT索引值的SetWindowLong函数来设置由一个对话框过程处理的消息的返回值,应在此后立即返回TRUE。否则,如果又调用了其他函数而使对话框过程接收到一个窗口消息,则嵌套的窗口消息可能改写使用DWL_MSGRESULT设定的返回值。

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

  通过使用函数RegisterClassEx将结构WNDCLASSEX中的cbWndExtra单元指定为一个非0值来保留新外窗口内存。

  不能通过调用带GWL_HWNDPARENT索引值的SetWindowLong的函数来改变子窗口的父窗口,应使用SetParent函数。

你可能感兴趣的:(setclasslong和setwindowlong)