GetWindowLong() 和 SetWindowLong()

GetWindowLong()和SetWindowLong()的用法  

SetWindowLong 

函数功能:该函数改变指定窗口的属性.函数也将指定的一个32位值设置在窗口的额外存储空间的指定偏移位置。 
函数原型: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函数。 
  Windows CE:nlndex参数必须是4个字节的倍数不支持unaligned access。 
  不支持下列nlndex参数值:。 
  GWL_HINSTANCE;GWL_HWNDPARENTGWL;GWL_USERDATA 
  Windows CE 2.0版支持在nlndex参数中的DWL_DLGPROC值,但是WindowsCE1.0不支持。 
  速查:Windows NT:3.1以上版本;Windows:95以上版本;Windows CE:1.0以上版本:头文件:winuser.h;库文件:user32.lib;Unicode:在Windows NT上实现为Unicode和ANSI两种版本。 
  函数功能:该函数删除一个窗口类,清空该类所需的内存。 
  函数原型:BOOL UnRegisterClass(LPCTSTR IpClassName; HINSTANCE hlnstance); 
  参数: 
  IpClassName:指向一个空结束字符串的指针,或是一个整型原子。如果IpClassName是一个字符串,则它指定了窗口类的类名。这个类名必须由此前调用RegisterClassEx函数来注册。系统类,如对话框控制,必须被注册。 
  如果这个参数是一个整型原子,它必须是由此前调用GlobalAdd原子函数创建的全局原子。这个16位整型数小于OxCOOO,必须是lpszClass的低16位,其高位宇必须为0。 
  hlnstance:创建类的模块的事例句柄。 
  返回值:如果函数成功,返回值为非零;如果未发现类或由此类创建的窗口仍然存在,则返回值为0。 
  若想获得更多错误信息,请调用GetLastError函数。 
  备注:在调用这个函数之前,应用程序必须销毁由指定类创建的所有窗口。 
  应用程序注册的所有窗口类在应用程序中止后都为未注册的类。 
  Windows 95:所有由OLL注册的窗口类在DLL卸载后均未注册的类。 
  windows NT:所有由DLL注册的类在DLL卸载后仍为已注册的类。 
  速查:Windows NT:3.1以上版本;Windows:95以上版本;Windows CE:1.0以上版本;头文件:winuser.h;库文件:user32.lib;Unicode:在Windows NT上实现为Uhicode和ANSI两种版本。 
============================================================================== 
============================================================================== 
GetWindowLong 
  函数功能:该函数获得有关指定窗口的信息,函数也获得在额外窗口内存中指定偏移位地址的32位度整型值。 
  函数原型:LONG GetWindowLong(HWND hWnd,int nlndex); 
  参数: 
  hWnd:窗口句柄及间接给出的窗口所属的窗口类。 
  nlndex:指定要检索的基于0的的偏移量。有效值的范围从0到窗口额外内存空间的字节数,最小为4。例如,若指定了12位或多于12位的窗体类的额外存储空间,则应设为第三个32位整数的索引位8。要获得任意其他值,指定下列值之一:
  GWL_EXSTYLE;获得扩展窗口风格。 
  GWL_STYLE:获得窗口风格。 
  GWL_WNDPROC:获得窗口过程的地址,或代表窗口过程的地址的句柄。必须使用GWL_WNDPROC函数调用窗口过程。 
  GWL_HINSTANCE:获得应用事例的句柄。 
  GWL_HWNDPAAENT:如果父窗口存在,获得父窗口句柄。 
  GWL_ID:获得窗口标识。 
  GWL_USERDATA:获得与窗口有关的32位值。每一个窗口均有一个由创建该窗口的应用程序使用的32位值。 
  在hWnd参数标识了一个对话框时也可用下列值: 
  DWL_DLGPROC:获得对话框过程的地址,或一个代表对话框过程的地址的句柄。必须使用函数CallWindowProc来调用对话框过程。 
  DWL_MSGRESULT:获得在对话框过程中一个消息处理的返回值。 
  DWL_USER:获得应用程序私有的额外信息,例如一个句柄或指针。 
  返回值:如果函数成功,返回值是所需的32位值;如果函数失败,返回值是0。若想获得更多错误信息请调用 GetLastError函数。 
  备注:通过使用函数RegisterClassEx将结构WNDCLASSEX中的cbWndExtra单元指定为一个非0值来保留额外类的存储空间。 
  Windows CE:nlndex参数指定的字节偏移量必须为 4的倍数。不支持 unaligmned access。 
  Windows CE:不支持在参数nlndex中设定的GWL_HINSTANCE和GWL_HWNDPARENT。 
  Windows CE1.0也不支持在 nlndex参数中的 DWL_DLGPROC和 GWL_USERDATA。 
  速查:Windows NT:3.1以上版本;Windows:95以上版本;Windows CE:1.0对以上版本;头文件:winuser.h;库文件:user32.lib;在Windows NT上实现为Unicode和ANSI两种版本。

补充:

设置窗口风格

   如:SetWindowLong(hWnd, GWL_STYLE, WS_POPUP|WS_BORDER);      //有边框的弹出窗口

         SetWindowLong(hWnd, GWL_EXSTYLE,  WS_EX_TOOLWINDOW);    //设置窗口扩展样式为WS_EX_TOOLWINDOW,可以让窗体不在任务栏中显示。

如果我们想在保留窗体原有风格的基础上增加一个风格,还需要另一个API:
Private Declare FunctionGetWindowLongLib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
GetWindowLong的调用方法和SetWindowLong相似,只不过不需要第三个参数,因为这里的返回值是得到它的风格的组合。你可以先这样做:
Dim lStyle As Long
lStyle = GetWindowLong(Me.hwnd, GWL_STYLE)
然后你就可以放心地使用了。
SetWindowLong Me.hwnd, GWL_STYLE, lStyle Or WS_SIZEBOX

为窗体增加一个WS_SIZEBOX风格而无需担心其他风格会丢失。如果想去掉WS_SIZEBOX,则使用:
SetWindowLong Me.hwnd, GWL_STYLE, lStyle And Not WS_SIZEBOX

设置完后要注意及时 RePaint 窗体。

  1. /* 窗口样式参考列表: 
  2. WS_POPUP - 弹出式窗口(不能与WS_CHILDWINDOW样式同时使用) 
  3. WS_CHILDWINDOW - 子窗口(不能与WS_POPUP合用) 
  4. WS_MINIMIZE - 最小化状态 
  5. WS_VISIBLE - 可见状态 
  6. WS_DISABLED - 不可用状态 
  7. WS_CLIPSIBLINGS - 使窗口排除子窗口之间的相对区域 
  8. WS_CLIPCHILDREN - 当在父窗口内绘图时,排除子窗口区域 
  9. WS_MAXIMIZE - 具有最大化按钮,须指定WS_SYSTEM样式 
  10. WS_CAPTION - 有标题框和边框(和WS_TILED样式相同) 窗口带有一个标题栏,经测试,实际上等于 (WS_BORDER Or WS_DLGFRAME) 
  11. WS_BORDER - 有单边框 窗口带有一个薄边框 
  12. WS_DLGFRAME - 带对话框边框样式,不带标题框 带有一般对话框的风格,但没有标题栏 
  13. WS_VSCROLL - 有垂直滚动条 窗口带有一个垂直滚动条 
  14. WS_HSCROLL - 有水平滚动条 窗口带有一个水平滚动条 
  15. WS_SYSMENU - 标题框上带有窗口菜单(须指定WS_CAPTION样式) 在窗口的标题栏上增加一个系统菜单,该窗口必须具有 WS_CAPTION 风格(即WS_BORDER和WS_DLGFRAME) 
  16. WS_SIZEBOX 和 WS_THICKFRAME - 有可调边框(与WS_SIZEBOX样式相同) 窗口带有一个可以调整窗口大小的边框(即VB里的Sizable,其他地方的边框均指不具调整大小功能的边框) 
  17. WS_GROUP - 组样式,每个组的第一个控件具有WS_TABSTOP样式 
  18. WS_TABSTOP - 可接受TAB键焦点 
  19. WS_MINIMIZEBOX - 有最小化按钮 窗口带有最小化按钮,该窗口必须具有 WS_CAPTION 风格 
  20. WS_MAXIMIZEBOX - 有最大化按钮 窗口带有最大化按钮,该窗口必须具有 WS_CAPTION 风格 
  21. WS_OVERLAPPEDWINDOW 和 WS_TILEDWINDOW:- 具有层叠,标题框,系统菜单,可调边框,系统按钮   窗口是一个交迭式窗口,并且组合了 WS_OVERLAPPED, WS_CAPTION, WS_SYSMENU,
  22. WS_THICKFRAME, WS_MINIMIZEBOX 以及 WS_MAXIMIZEBOX 这些风格 
  23. WS_POPUPWINDOW - 具有单边框,弹出式,系统菜单样式
  24. WS_OVERLAPPED 和 WS_TILED:窗口是一个交迭式窗口。交迭式窗口带有一个标题栏和一个边框 
  25. */  
  26. /* 窗口扩展样式参考列表: 
  27. WS_EX_DLGMODALFRAME - 带双层边框 
  28. WS_EX_NOPARENTNOTIFY - 创建/销毁时不通知父窗口 
  29. WS_EX_TOPMOST - 窗口置顶(停留在所有非最高层窗口的上面) 
  30. WS_EX_ACCEPTFILES - 可接受文件拖放 
  31. WS_EX_TRANSPARENT - 透明样式,在同属窗口已重画时该窗口才可重画 
  32. WS_EX_MDICHILD - MDI子窗口样式 
  33. WS_EX_TOOLWINDOW - 工具条窗口样式 
  34. WS_EX_WINDOWEDGE - 带凸起边缘的边框 
  35. WS_EX_CLIENTEDGE - 带阴影的边缘 
  36. WS_EX_CONTEXTHELP - 有上下文帮助样式,标题栏包含一个问号标志 
  37. WS_EX_RIGHT - 右对齐 
  38. WS_EX_RTLREADING - 窗口文本从右到左显示 
  39. WS_EX_LEFTSCROLLBAR - 垂直滚动条在窗口左边界 
  40. WS_EX_CONTROLPARENT - 允许用户使用TAB键在窗口的子窗口间搜索 
  41. WS_EX_STATICEDGE - 当窗口为不可用状态时创建一个三维边缘 
  42. WS_EX_APPWINDOW - 当窗口可见时将一个顶层窗口放置在任务栏上 
  43. WS_EX_OVERLAPPEDWINDOW - 带凸起边缘的边框,边缘有阴影 
  44. WS_EX_PALETTEWINDOW - 带立体边框,有工具条窗口样式,窗口在顶层 
  45. WS_EX_LAYERED - 分层或透明窗口,该样式可使用混合特效 
  46. WS_EX_NOINHERITLAYOUT - 子控件不继承窗体或控件的布局 
  47. WS_EX_LAYOUTRTL - 窗体或控件将具有从右向左的布局(因而会被镜像) 
  48. WS_EX_COMPOSITED - 用双缓冲从下到上绘制窗口的所有子孙(WinXP以上) 
  49. WS_EX_NOACTIVATE - 处于顶层但不激活 
  50. */  
  51. /* 控件样式参考列表:  
  52. DS_ABSALIGN - 对话框的坐标为屏幕坐标(缺省为客户区坐标)  
  53. DS_SYSMODAL - 系统模式(仅支持16位程序),不能与DS_CONTROL同用  
  54. DS_LOCALEDIT - 在对话框内部为编辑框分配内存(仅支持16位程序)  
  55. DS_SETFONT - 可定制对话框字体  
  56. DS_MODALFRAME - 框架样式(不能与WS_CAPTION同用)  
  57. DS_NOIDLEMSG - 无空闲消息  
  58. DS_SETFOREGROUND - 使对话框在最前面显示  
  59. DS_3DLOOK - 四周有3维边框  
  60. DS_FIXEDSYS - 使用系统固定字体  
  61. DS_NOFAILCREATE - 忽略创建过程中的错误  
  62. DS_CONTROL - 控件模式,可作为其他对话框的子窗口  
  63. DS_CENTER - 在屏幕居中  
  64. DS_CENTERMOUSE - 在鼠标位置居中  
  65. DS_CONTEXTHELP - 有上下文帮助按钮  

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`SetWindowLong`是一个Win32 API函数,可以用于设置窗口的扩展风格(extended window style)和窗口过程(window procedure)地址。下面是该函数的详细说明: `LONG SetWindowLong(HWND hWnd, int nIndex, LONG dwNewLong);` 其中,`hWnd`是要设置的窗口的句柄,`nIndex`是要设置的信息的索引,`dwNewLong`是要设置的新值。 `nIndex`参数可以取下面的值: - `GWL_EXSTYLE` :设置窗口的扩展风格。此参数可以用于设置不同的窗口样式(例如圆角窗口)。 - `GWL_HINSTANCE` :设置窗口实例的句柄。此参数通常用于与窗口关联的模块实例句柄。 - `GWL_ID` :设置窗口的标识符。此参数可以用于标识窗口并进行操作。 - `GWL_STYLE` :设置窗口的样式。此参数可以用于设置窗口的边框、标题、按钮等。 - `GWL_USERDATA` :设置窗口的用户数据。此参数通常用于存储与窗口相关的自定义数据。 - `GWL_WNDPROC` :设置窗口过程的地址。此参数通常用于自定义窗口过程,并替换默认的处理方式。 对于不同的`nIndex`参数,`dwNewLong`参数的含义也不同。例如,如果`nIndex`参数为`GWL_STYLE`,则`dwNewLong`参数应该包含要设置的窗口样式的具体值。 需要注意的是,`SetWindowLong`函数有两个版本:32位和64位。在64位版本中,该函数已被废弃,应该使用`SetWindowLongPtr`函数代替。另外,如果要获取窗口的扩展风格、样式等信息,可以使用`GetWindowLong`函数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值