SetWindowLong GetWindowLong SetClassLong GetClassLong

GetWindowLong() SetWindowLong() 详解

这两个函数在windows程序中有着重要的作用,依照MSDN说明以下这两个函数。

/*****************************************************************/

GetWindowLong

这个函数可以通过一个窗口的句柄来得到窗口的一些其他的信息,比如ID等

语法:

LONG GetWindowLong( HWND hwnd,int nIndex);

·hwnd 是要查询的窗口的句柄

·nIndex 有几个标识符来让我们得到不同的信息:

GWL_EXSTYLE extended windows styles

GWL_STYLE   返回windows创建时的style

GWL_WNDPROC 返回windows 的消息处理函数的地址

GWL_HINSTANCE 返回应用程序的实例句柄

GWL_ID 返回窗口的ID

GWL_HWNDPARENT 返回这个窗口的父窗口句柄

GWL_USERDATA 返回和这个窗口相关联的用户数据

如果hwnd是一个对话框句柄,就可以使用下面几个标志:

DWL_DLGPROC 同样是消息处理函数的地址

DWL_MESRESULT 返回消息处理函数中的消息(????)

DWL_USER 一些附加的内容

·返回值

     如果函数调用成功,就会返回一个所要查询的32-bit的值

     如果不成功,就会返回0.

比如我们想要获得一个窗口的id,可以这样用

Id = GetWindowLong(hwnd,GWL_ID);

/**********************************************************/

SetWindowLong

该函数与GetWindowLong相仿,不过就是由获取信息变成了改变信息,我们可以通过这个函数来设定窗口的一些字段和属性。

语法

LONG SetWindowLong( HWND hwnd, int nIndex,   LONG dwNewLong );

·hwnd 就是窗口的句柄

· nIndex 这个字段的标志和GetWindowLong是一样的,可以通用

·dwNewLong 是我们需要设定的那个值,要用它对窗口进行修改。

返回值:

当函数调用成功时,函数返回被修改的那个值。

如果不成功,函数返回0。

举个简单的例子,如果说我们想把主窗口的消息处理函数改为WndProcChanged(HWND,UINT,WPARAM,LPARAM);

我们可以这样写:

   SetWindowLong(hwnd, GWL_WNDPROC, (LONG)WndProcChanged);

这样,窗口的消息处理函数就成了我们刚刚声明的那个函数。其他的标志符都可以这样用。

 

 

 

 

GetClassLong

  函数功能:该函数返回与指定窗口相关的WNDCLASSEX结构的指定32位值。
  函数原型:DWORD GetClassLong(HWND hWnd,int nlndex);
  参数:
  hWnd:窗口句柄间接给出的窗口所属的类。
  nlndex:指定要恢复的32位值。从额外的类存储空间恢复一个32位的值,指定的一个大于等于0的被恢复值的偏移量。有效值为从0开始到额外类存储空间字节数一4。例如,若指定了12位或多于12位的额外类存储空间,则应设为第三个32位整数的索引位8。要从WNDCLASSEX结构中恢复任何值,需要指定下面值之一:
  GCSW原子:获得一个唯一标识窗口类的原子值,该值与RegisterClassEx函数的返回值相同。
  GCL_CBWNDEXTRA:获得与类中的每个窗口相关的额外窗口中内存空间的字节大小,进入该存储空间的方法请参看GetWindwoLong。
  GCL_HBRBACKGROUND:获得与类有关的背景刷子的句柄。
  GCL_HCURSOR:获得与类有关的光标的句柄。
  GCL_HICON:获得与类有关的图标的句柄。
  GCL_HICONSM:获得与类有关的小图标的句柄。
  GCL_HMOUDLE:获得注册该类的模块的句柄。
  GCL_MENUNAME:获得菜单名字符串的地址,该字符串标识了与类有关的菜单资源。
  GCL_STYLE:获得窗口类的风格位。
  GCL_WNDRPOC:获得与类有关的窗口过程的地址。
  返回值:如果函数成功,返回值是所需的32位值;如果函数失败,返回值为0。若想获得更多错误信息,请调用GetLastError函数。
  备注:通过使用函数RegisterClassEx将结构WNDCLASSEX中的cbCIsExtra单元指定为一个非O值来保留额外类的存储空间。Windows CE:nlndex参数是一个字节偏移量,但是必须为 4的倍数。Windows CE不支持unaligned access。nlndex参数中只可设定为GCL_HICON和GCL_STYLE。 如果使用了Windows CE的 lconsurs组件,该组件支持在适当的目标平台上的鼠标,也可以在nlndex中使用GCL_HCURSOR。 注意支持鼠标的 Windows CE版本包含 Iconcurs和 Mcursor而不是 Icon和 Cursor组件。

 

SetClassLong

 

  函数功能:该函数替换在额外类存储空间的指定偏移地址的32位长整型值,或替换指定窗口所属类的WNDCLASSEX结构。
  函数原型:DWORD SetClassLong(HWND hWnd,int nlndex,LONG dwNewLong);
  参数:
  hWnd:窗口句柄及间接给出的窗口所属的类。
  nlndex:指定将被替换的32位值。在额外类存储空间中设置32位值,应指定一个大于或等于0的偏移量。
  有效值的范围从0到额外类的存储空间的字节数一4;例如,若指定了12位或多于12位的额外类存储空间,则应设为第三个32位整数的索引位8。要设置WNDCLASSEX结构中的任何值,指定下面索引之一:
  GCL_CBCLSEXTRA:设置与类相关的尺寸的字节大小。设定该值不改变己分配的额外字节数。
  GCL_CBWNDEXTRA:设置与类中的每一个窗口相关的尺寸的字节大小。设定该值不改变已分配额外字节数。查看如何进入该内存,参看SetWindowLOng。
  GCL_HERBACKGROUND:替换与类有关的背景刷子的句柄。
  GCL_HCURSOR:替换与类有关的光标的句柄。GCL_HICON:替换与类有关的图标的句柄。
  GCL_HMODULE:替换注册类的模块的句柄。GCL_STYLE:替换窗口类的风格位。
  GCL_MENUNAME :替换菜单名字符串的地址。该字符串标识与类有关的菜单资源。
  GCL_WNDPROC :替换与窗口类有关的窗口过程的地址。
  dwNewLong:指定的替换值。
  返回值:如果函数成功,返回值是原来类结构中32位整数;如果未事先设定,返回值为0。如果函数失败,返回值为0。若想获得更多错误信息,请调用GetLastError函数。
  备注;如果使用SetClassLong函数和GCL_WNDPROC索引值来替换窗口过程,新的窗口过程必须与WindowProc回调函数中所规定的规则一致。
  以带GCL_WNDPROC索引值的SetClassLong函数修改的一个窗口类的的子类将会影响所有随后以该类创建的窗口。应用程序可以创建一个系统类的子类,但是不能创建由其他进程创建的类的子类。
  通过使用RegisterClassEx函数将WNDCLASSEX结构中的cbWndExtra单元指定为一个非零值来保留额外的的类存储空间。
  使用SetClassLong函数要小心。例如,可以通过使用SetClassLong来改变类的背景颜色,但是这种改变不会马上生效,直到属于该类的窗体下次重绘,除非使用UpdateWindow()强迫窗体更新。
  Windows CE:nlndex参数是一个字节偏移量但必须是4的倍数。Unaligned不支持。
  不支持在nlndex参数中的标准的CGL_★值,只有一个例外,如果目标设各支持鼠标,则可以在nlndex参数中指定CGL_HCURSOR。
  注意支持鼠标的WindowsCE版本包含Iconcurs和Mcursor组件而不是lcon和Cursor组件。
  速查:Windows NT:3.1以上版本:Windows:95以上版本;Windows CE:1.0以上版本;头文件:winuser.h;库文件:user32.lib;Unicode:在Windows NT 上实现为Unicode和ANSI两种版本。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值