VB的子类处理应用两例
2008-04-09 04:42:24来源:互联网 阅读 ()
一、实现无标题栏窗口的拖动
大家都知道,按住窗口的标题栏可以拖动窗口。可如果窗口没有标题栏,怎样拖动它呢?那就按在窗口的客户区上吧,只要让窗口觉得是按在了标题栏上就可以了。
首先需要在一个模块文件Modulel内输入以下代码,(我们自制的回调函数必须在模块文件中声明,不可将其放到类模块中,也不能附加到窗体中):
下面声明的是子类处理中最重要的三个函数。
SetWindowLong函数使用GWL_WNDPROC索引将默认的窗口函数替换成我们自制的回调函数,回调函数的地址由AddressOf操作符得到。SetWindowsLong函数返回值为默认的窗口函数的地址。
Declare Function SetWindowLong Lib“user32"Alias“SetWindowLingA"(ByValhwnd As Long,ByVal nIndex As Long,By Val dwNewLong As Long)As Long
Declare Function DefWindowProc Lib“user32"Alias “DefWindowProcA"(ByValhwnd As Long,ByVal wMsg As Long,ByVal wParam As Interger,ByVal lParam As Long)As Long
CallWindowProc函数传递消息到指定的窗口函数(窗口函数地址由lpPrevWndFunc参数给定),并返回消息处理的指定返回值。
Public Declare Function CallWindowProc Lib“user32"Alias“CallWindowProcA"(ByVal lpPrevWndFunc As Long,ByVal hwnd As Long,ByVal Msg As Long,ByVal wParam As Long,ByVal lParam As Long)As Long
Public proroc As Long
Public Const WM_NCHITTEST=&H84
Public Const HTCAPTION=2
Public Const HTCLIENT=1
Public Const GWL_WNDPROC=(-4)
回调函数WindowProc结构如下,共有四个参数,第一个参数是窗口句柄,第二个参数是消息编号,第三、四个参数是32位整数,它们根据不同的消息而不同。
本例中,当鼠标在窗口内进行了一个按下或松开的操作时,WINDOWS会向窗口发出一条WM_NCHITTEST消息(该消息用于判断窗口的非客户区域的什么部分包含了鼠标指针),回调函数在收到WM_NCHITTEST消息后,首先调用窗口的默认函数进行处理,然后判断返回值,如果是HTCLIENT(表示鼠标指针在客户区内),就改变它,使之返回HTCAPTION(表示鼠标指针在标题栏内),这样,当我们在窗口的客户区内按住鼠标移动时,窗口就会傻呼呼地以为按在了标题框内,当然就跟着我们的鼠标动了。
Function WindowProc(ByVal hwnd As Long, ByVal msg As Long,ByVal wParam As Long,ByVal lParam As Long)As Long
Dim rv As Long
If msg=WM_NCHITTEST Then
rv=DefWindowProc(hwnd,msg,wParam,lParam)
If rv=HTCLIENT Then
WindowProc=HTCAPTION
Else
WindowProc=rv
End If
将其他的消息传递给默认的窗口函数进行处理。
Else
WindowProc=CallWindowProc(proroc,hwnd,msg,wParam,lParam)
End If
在Forml内输入如下代码:
Private Sub Form_load()
proroc=SetWindowLong(hwnd,GWL_WNDPROC,AddressOf WindowProc)
End Sub
一定要记得在窗口卸载之前恢复默认的窗口函数,否则……您试一试就知道了。
Private Sub Form_Unload(Cancel As Integer)
Dim rv As Long
rv=SetWindowLong(hwnd,GWL_WNDPROC,proroc)End Sub 156
大家都知道,文本框控件有自己的关联菜单(上有剪切、复制、全选之类的命令),这无疑为我们在编程时提供了便利。可是,有利必有弊,当我们需要给文本框提供一些定制命令,并把它们加到一个自定义的关联菜单中时,默认的关联菜单给我们带来了不便(在文本框内单击右键时,会先后弹出两个关联菜单)。如何防止默认的关联菜单弹出呢?
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash