admin 管理员组文章数量: 1184232
2024年3月8日发(作者:css链接样式优先级)
【引用】 API之SetWindowLong函数详解[收藏]
2011-04-20 00:11:32| 分类: 默认分类 | 标签: |字号大中小 订阅
本文引用自阿杜《 API之SetWindowLong函数详解[收藏]》
函数原型
LONG SetWindowLong(hwnd,nIndex,lNewLong)
HWND hwnd; /* handle of window */
int nIndex; /* offset of value to set */
LONG lNewLong; /* new value */
函数说明
SetWindowLong函数修改给定窗口的一个属性。该函数还在给定窗口的附加窗口内存中
的指定偏移量处设置一个32位(长)值。
参数详解
hwnd
标识窗口,并且间接标只出该窗口的属的窗口类。
nIndex
指定一个距离要设置的值的以0为基值的偏移量。有效的偏移量范围最小为0,最大为附
加窗口内存的总字节数减为4,注:整数为四个字节;例如:若附加内存被指定为12个或
更多个字节,值8将是第3个长整数的索引值。要设置其它值,则应指定下列值之一:
值 动 作
============================================================================
GWL_EXSTYLE 设置新的扩展窗口风格。
GWL_STYLE 设置新的窗口风格
GWL_WNDPROC 为窗口过程设置新地址。
GWL_HINSTANCE 设置一个新的应用程序的实例句柄。
GWL_ID 设置一人新的窗口标识符。
GWL_USERDATA 设置与窗口相联系的长值。每个窗口都有一个供创建它的应用
程序使用的与之对应的长值。
当hwnd标识一个对话框时,还可使用下列值:
值 含 义
============================================================================
DWL_DLGPROC 设置对话框过程的新地址。
DWL_MSGRESULT 设置对话框过程所处理的消息的返回值。
DWL_USER 设置对应用程序来说是私有的新的附加信息:如句柄或打印机
。
lNewLong
指定该替换值。
返回值
若函数成功,返回值是指定的32位整数的原值;否则,返回值为0。使用GetLastError
函数可获取补充的错误信息。
注释
若使用SetWindowLong函数和GWL_WNDPROC索引替换窗口过程,则给定的窗口过程必须遵
循WindowProc回调函数的说明中指定的准则。
使用GWL_WNDPROC索引调用SetWindowLong函数可创建该窗口类的子类(窗口类用来创建窗
口)。应用程序不得用另一个过程的窗口产生子类。
使用RegisterClass函数,并将WNDCLASS结构的cbWndExtra成员指定为一个非零值,便可
保留附加窗口内存。
不得将SetWindowLong与GWL_HWNDPARENT索引一起使用来改变一个子窗口的父窗口。要
改变子窗口的父窗口,应使用SetParent函数。
SetWindowLong
VB声明
Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal
nIndex As Long, ByVal dwNewLong As Long) As Long
说明
在窗口结构中为指定的窗口设置信息
返回值
Long,指定数据的前一个值
参数表
参数 类型及说明
hwnd Long,欲为其取得信息的窗口的句柄
nIndex Long,请参考GetWindowLong函数的nIndex参数的说明
dwNewLong Long,由nIndex指定的窗口信息的新值
nIndex Long
GWL_EXSTYLE= (-20) 扩展窗口样式
GWL_STYLE=(-16) 窗口样式
GWL_WNDPROC= (-4) 该窗口的窗口函数的地址
GWL_HINSTANCE= (-6) 拥有窗口的实例的句柄
GWL_HWNDPARENT= (-8) 该窗口之父的句柄。不要用SetWindowWord来改变这个值
GWL_ID= (-12) 对话框中一个子窗口的标识符
GWL_USERDATA = (-21) 含义由应用程序规定
DWL_DLGPROC = 4 这个窗口的对话框函数地址
DWL_MSGRESULT = 0 在对话框函数中处理的一条消息返回的值
DWL_USER = 8 含义由应用程序规定
' Window Styles
Const WS_OVERLAPPED = &H0& '创建一个重叠窗体。一个重叠窗体一般有标题和边框。
Const WS_POPUP = &H80000000 ' 创建一个弹出式窗体。不能和WS_CHILD一起使用。
Const WS_CHILD = &H40000000 '创建一个子窗体。不能和WS_POPUP一起使用。
Const WS_MINIMIZE = &H20000000'创建一个初始最小化的窗体。只与WS_OVERLAPPED一起用。
Const WS_VISIBLE = &H10000000 '创建一个初始可见的窗体。
Const WS_DISABLED = &H8000000 '创建一个初始不可用的窗体。
Const WS_CLIPSIBLINGS = &H4000000 '使子窗体彼此别住;就是当一个指定的子窗体接收到一个paint消息时,WS_CLIPSIBLINGS类型将别住所有重叠的子窗体超过区域的部分一起更新,(如果没有使用WS_CLIPSIBLINGS并且子窗体重叠,当你在一个子窗体的客户区绘图时,可能会绘图到邻近的子窗体的客户区。)只与WS_CHILD一起使用。
Const WS_CLIPCHILDREN = &H2000000 '不包括在父窗体中被子窗体占用的区域。用于创建父窗体。
Const WS_MAXIMIZE = &H1000000 '创建一个最大尺寸的窗体。
Const WS_CAPTION = &HC00000 ' 创建一个有标题栏的窗体(隐含了WS_BORDER). 不能和WS_DLGFRAME一起使用. ' WS_BORDER Or WS_DLGFRAME
Const WS_BORDER = &H800000' 创建一个有边框的窗体。
Const WS_DLGFRAME = &H400000 '创建一个有双边但无标题的窗体。
Const WS_VSCROLL = &H200000 '创建一个有垂直滚动条的窗体。
Const WS_HSCROLL = &H100000 '创建一个带水平滚动条的窗体。
Const WS_SYSMENU = &H80000 '创建一个在标题栏有控件菜单框的窗体。只能和有标题栏的窗体一起使用。
Const WS_THICKFRAME = &H40000 '创建一个有厚边框的Window,使其可以改变大小。
Const WS_GROUP = &H20000 '指定一个用户可以用方向键从一个控件移到另一个控件的控件组的第一个控件
Const WS_TABSTOP = &H10000 指定任意数量控件中的一个可以由用户使用TAB键移动到的控件。TAB键使用户移动到由WS_TABSTOP指定的下一个控件。
Const WS_MINIMIZEBOX = &H20000 '创建一个有最小化按扭的窗体。
Const WS_MAXIMIZEBOX = &H10000 '创建一个有最大化按扭的窗体。
Const WS_TILED = WS_OVERLAPPED
Const WS_ICONIC = WS_MINIMIZE
Const WS_SIZEBOX = WS_THICKFRAME
Const WS_OVERLAPPEDWINDOW = (WS_OVERLAPPED Or WS_CAPTION Or WS_SYSMENU Or
WS_THICKFRAME Or WS_MINIMIZEBOX Or WS_MAXIMIZEBOX)
Const WS_TILEDWINDOW = WS_OVERLAPPEDWINDOW
代码实现自定义窗体风格及窗体风格的一些常量
Option Explicit
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long,
ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long,
ByVal nIndex As Long) As Long
Private Const GWL_STYLE = (-16) '窗口样式
'窗口风格
Private Const WS_CAPTION = &HC00000 '带标题栏的窗口
Private Const WS_MAXIMIZEBOX = &H10000 '带最大化按钮的窗口
Private Const WS_MINIMIZEBOX = &H20000 '带最小化按钮的窗口
Private Const WS_SYSMENU = &H80000 '带系统菜单的窗口
Private Const WS_CLIPSIBLINGS = &H4000000 '不重绘层叠子窗口
Private Const WS_CLIPCHILDREN = &H2000000 '绘图时排子窗口区域
Private Const WS_OVERLAPPED = &H0& '具有标题栏和边框的层叠窗口
Private Const WS_THICKFRAME = &H40000 '具有可调边框
'WS_OVERLAPPEDWINDOW具有标题栏、窗口菜单、可调边框和最大化、最小化按钮的窗口
Private Const WS_OVERLAPPEDWINDOW = (WS_OVERLAPPED Or WS_CAPTION Or
WS_SYSMENU Or WS_THICKFRAME Or WS_MINIMIZEBOX Or WS_MAXIMIZEBOX)
Private Const WS_GROUP = &H20000 '指定一组控制的第一个控制
Private Const WS_POPUP = &H80000000 '弹出式窗口
Private Const WS_BORDER = &H800000 '单边框窗口
Private Const WS_POPUPWINDOW = (WS_POPUP Or WS_BORDER Or WS_SYSMENU) '具有单边框、标题栏菜单的弹出式窗口
Private Const WS_MINIMIZE = &H20000000 '窗口最小化
Private Const WS_VISIBLE = &H10000000 '窗口可见
Private Const WS_DISABLED = &H8000000 '窗口被禁用
Private Const WS_MAXIMIZE = &H1000000 '窗口最大化
Private Const WS_DLGFRAME = &H400000 '对话框边框风格
Private Const WS_VSCROLL = &H200000 '具有垂直滚动条
Private Const WS_HSCROLL = &H100000 '具有水平滚动条
Private Const WS_TABSTOP = &H10000 '具有TAB键控制
Private Const WS_CHILD = &H40000000
Private Const WS_CHILDWINDOW = (WS_CHILD) '具有子窗口
'扩展风格
Private Const WS_EX_WINDOWEDGE = &H100& '窗口具有凸起的3D边框
Private Const WS_EX_CLIENTEDGE = &H200& '窗口具有阴影边界
Private Const WS_EX_TOOLWINDOW = &H80& '小标题工具窗口
Private Const WS_EX_TOPMOST = &H8& '窗口总在顶层
Private Const WS_EX_OVERLAPPEDWINDOW = (WS_EX_WINDOWEDGE Or
WS_EX_CLIENTEDGE) 'WS_EX-CLIENTEDGE和WS_EX_WINDOWEDGE的组合
Private Const WS_EX_PALETTEWINDOW = (WS_EX_WINDOWEDGE Or WS_EX_TOOLWINDOW Or
WS_EX_TOPMOST) 'WS_EX_WINDOWEDGE和WS_EX_TOOLWINDOW和WS_EX_TOPMOST的组合
Private Const WS_EX_DLGMODALFRAME = &H1& '带双边的窗口
Private Const WS_EX_NOPARENTNOTIFY = &H4& '窗口在创建和销毁时不向父窗口发送WM_PARENTNOTIFY消息
Private Const WS_EX_TRANSPARENT = &H20& '窗口透眀
Private Const WS_EX_MDICHILD = &H40& 'MDI子窗口
Private Const WS_EX_CONTEXTHELP = &H400& '标题栏包含问号联机帮助按钮
Private Const WS_EX_RIGHT = &H1000& '窗口具有右对齐属性
Private Const WS_EX_RTLREADING = &H2000& '窗口文本自右向左显示
Private Const WS_EX_LEFTSCROLLBAR = &H4000& '标题栏在客户区的左边
Private Const WS_EX_CONTROLPARENT = &H10000 '允许用户使用Tab键在窗口的子窗口间搜索
Private Const WS_EX_STATICEDGE = &H20000 '为不接受用户输入的项创建一个三维边界风格
Private Const WS_EX_APPWINDOW = &H40000 '在任务栏上显示顶层窗口的标题按钮
Private Const WS_EX_LAYERED = &H80000 '窗口具有透眀属性(Win2000)以上
Private Const WS_EX_NOINHERITLAYOUT = &H100000 '窗口布局不传递给子窗口(Win2000)以上
Private Const WS_EX_LAYOUTRTL = &H400000 '水平起点在右边的窗口
Private Const WS_EX_NOACTIVATE = &H8000000 '窗口不会变成前台窗口(Win2000)以上
Private Const WS_EX_LEFT = &H0& '窗口具有左对齐属性
Private Const WS_EX_LTRREADING = &H0& '窗口文本自左向右显示
Private Const WS_EX_RIGHTSCROLLBAR = &H0& '垂直滚动条在窗口的右边界
Private Const WS_EX_ACCEPTFILES = &H10& '接受文件拖曳
Private Const WS_EX_COMPOSITED = &H2000000 '窗体所有子窗口使用双缓冲从低到高绘制(XP)
'*************************************************************************
'**函 数 名: Form_Initialize
'**输 入: 无
'**输 出: 无
'**功能描述: 代码实现自定义窗体风格,NoMAXIMIZEBOX,HaveMINIMIZEBOX,BorderStyle=1,StartUpPosition=1
'**全局变量:
'**调用模块:
'**作 者:
'**日 期: 2007-01-29 11:27:11
'**修 改 人:
'**日 期:
'**版 本: V1.0.0
'*************************************************************************
Private Sub Form_Initialize()
Dim lStyle As Long
lStyle = GetWindowLong(, GWL_STYLE) '获取原风格
'lStyle = lStyle And Not WS_OVERLAPPEDWINDOW
lStyle = lStyle And Not WS_OVERLAPPED '去除不用的风格
lStyle = lStyle And Not WS_THICKFRAME
lStyle = lStyle And Not WS_MAXIMIZEBOX
lStyle = lStyle Or WS_SYSMENU '加上自定义风格
lStyle = lStyle Or WS_GROUP
lStyle = lStyle Or WS_MINIMIZEBOX
SetWindowLong , GWL_STYLE, lStyle '设置新的风格
( - ) / 2, ( - ) / 2
End Sub
Private Sub Form_Click()
End
End Sub
版权声明:本文标题:API之SetWindowLong函数详解 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.roclinux.cn/p/1709828690a547636.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论