说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

在VB中使用API函数 (之五)

HTML文档下载 WORD文档下载 PDF文档下载
在VB中使用API函数 (之五)

 
子类处理
当你一最大限度利用了VB所给你的并且还想知道更多的东西,或只是想更多地了解你自己的窗口,你将会发现子类处理的优势.

子类处理是指用一个新的窗口函数来取代当前活动窗口函数.这个用户自定义函数能处理任何需要的消息,并能调用原来的窗口函数,它将在原来的窗口函数之前收到各种消息.但原来的那个窗口处理函数依然存在,并没有消失.如果你不想处理某条消息,你应该让原来的窗口函数去处理它.

子类处理是通过调用SetWindowLong函数实现的,该函数将改变指定窗口的特殊属性.下面是它的声明:

Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA"(ByVal hwnd As Long, ByVal nIndex As Long,ByVal dwNewLong As Long) As Long

第一个参数代表要进行子类处理的窗口,第二个参数应该是GWL_WNDPROC(-4),第三个参数是新的窗口函数的地址.参见回调和窗口函数一节.

此函数将在窗口取得焦点,发生事件,或其他情况下(如其他进程改变了系统的某些参数)被随时调用.

如果发生错误SetWindowLong函数将返回0,否则将返回原来的窗口函数的地址.这个地址特别重要,你应该把它保存在一个变量中或其他地方.当你不处理某些消息时(实际上,你可能只处理不到1%的消息,其他的都将由原窗口函数处理),调用原来的窗口函数就需要该地址.

调用原窗口函数将由CallWindowProc来完成.这里是它的声明:

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

第一个参数是原窗口函数的地址,其他的同你接收到的四个参数一样.你可以改变其中的值来控制对消息的处理.例如,当你收到了一条WM_MOUSEMOVE消息时,你从lParam中得到鼠标所在位置的坐标并将其改成了其他的坐标.那么原窗口函数就会认为鼠标位于其他的位置从而做出一些有趣的事如显示其他控件的Tooltip.

你指定的返回值也是有意义的,它依赖于发送的消息.

在结束你的程序时将控制权交回给原窗口函数是很重要的,通常在Form_Unload中完成如下:

Ret& = SetWindowLong(Me.Hwnd, GWL_WNDPROC, oldWndProcAddress)

如果你在VB中启动程序时忘掉了这一行,结果将是VB崩溃并会丢失尚未保存的数据.千万要小心.

这里是子类处理的一个简单示例:

Dim oldWndProc As Long

Private Sub Form_Load()

oldWndProc = SetWindowLong(Me.Hwnd, GWL_WNDPROC, AddressOf MyWndProc)

End Sub

Private Sub Form_Unload()

Ret& = SetWindowLong(Me.Hwnd, GWL_WNDPROC, oldWndProc)

End Sub

Function MyWndProc(ByVal Hwnd As Long,ByVal wMsg as Long,ByVal wParam As Long,ByVal lParam As Long)

Debug.Print wMsg & " " & wParam & " " & lParam

Ret& = CallWindowProc(oldWndProc, Hwnd, wMsg, wParam, lParam)

End Function

处理参数

有时函数并不以你所需的方式返回信息.一个典型的例子是将两个代表鼠标位置的整形(2 byte)数合并为一个4 Byte的数.还有一个例子是判断一个数的某位是否为1.你还可能得到一个代表一个结构地址的Long型数.

合并和分离一个数并不需要过多的描述.你能在我们的网站(www.geocities.com/SiliconValley/Lab/1632/)上找到APIMacro.bas,它包含了你需要的多种函数.

可以用一下方法检查一个数的第N位是否为1:

If Value and (2^N) then ...

置1

Value = Value Or 2^N

置0

Value = Value And Not 2^N

如果你想设定或取得预先知道的某位的信息,用1024代替2^10要快的多.因为这样VB无需自己进行计算(VB憎恨 "^" ?).

如果你接收到一个类型的指针,你要做的工作将稍多一点.你可以使用CopyMem函数来取得信息.下面是它的声明:

Declare Sub CopyMem Lib "kernel32" Alias "RtlMoveMemory" (pDest As Any, pSource As Any, ByVal ByteLen As Long)

如果你接收到了一个指向RECT 类型的指针并存在Long型变量Addr 中,可以这样处理:

Dim Info As Rect

Call CopyMem(Info, ByVal Addr, len(Info))

注意ByVal关键字.现在,如果你想把信息写回,使用:

Call CopyMem(ByVal Addr, Info, Len(Info))

Command & Conquer 文件格式-VB资料 CrystaIReports for VB5报表编程经验 DirectX揭密-VB资料 HOOKS 说明书-VB资料 kb_event函数的使用 -VB资料 MaskEdit 中 9 的问题 -VB资料 MDB文件的导出(使用DAO)-VB资料 PaintPicture的和法 -VB资料 Shell & Wait 的程序怎么写? -VB资料 SHELL语句用法心得-VB资料 VarPtr、StrPtr和ObjPtr函数的用法-VB资料 VB 在ACADWIN中的使用 VB5.0应用程序的启动与退出设计 VB5如何取得CDROM的盘符? VB5三十六计 VB5中确定CPU类型 Vb6.0编程技巧四则 VB6二进制双通道技术实战经典 VB6内置的内码转换功能 VB编程步步高-代码效率篇(一) VB编程步步高-杂类篇(二) VB编程步步高-杂类篇(一) VB编程的必备技巧 VB编程的一些心得 VB编程技巧几例 VB编程经验点滴 VB编程俱乐部问答 VB编程如何控制I/O口 VB编程问与答 VB编程之提速攻略(二) VB编程之提速攻略(三) 谁有Dreamweaver4.0的注册码,我晕,555555555…~~~~~~~~~ 我曾在本论坛看到一篇“用纯ASP代码实现图片上传并存入数据库中”的文章,可是怎样实现一个页面上传多幅图片呢,高手能否帮忙看一下? 如何检测一个超链接是不是死链接 软件发布:加密专家系统 只要点一下,妹妹我就以身相许 谁有Dreamweaver4.0的注册码,我晕,555555555…~~~~~~~~~11 请问只要是线程就有消息队列,还是此线程产生window后才有消息队列?在控制台程序中,在消息循环中,当受到一wm_timer消息时,此消息将发送给那一window procedure? 软件发布:三维几何画板 CSDN有徐州的朋友吗 请教高手一个关于图像格式的问题 高手清帮忙:如何获得一个控件的电子签名认证?急,急,急! 觅有时间有经验用MAPINFO开发GIS的高手? IE 能不能同时浏览2种以上不同设置的网页? 初级asp问题 询问-----上海在哪里有软件考试报名? 怎样用SDK的方法改变文本框的前景色和背景色?(内空) 能推荐几个有关COM、ActiveX技术的网站吗?每个10分不够再加。 请问ljhua,ASP网页怎样调用*.bat文件,是服务器上的还是客户机上的bat? ****************** 先散掉点分,省得走的时候累赘 ****************** UNICODE和WinMain 一个空战游戏,附源程序! 创建WebSnap应用程序(一) 请教一个http错误号 vs.net安装(2) 请教高手,怎样使用信使服务向局域网内的其他用户发通知? 使用过DeviceIoControl的高手请进: 不知用过jbuilder5的朋友有何感想 如何用程序中断拔号连接? DLL调用 搞什么鬼?不给超过三次? ADOTable如何查询数据? 软件发布:小精灵 vcguy,come on! 我在用resin做标签库时遇到问题,请大家帮忙。 没有源代码的情况下,由*.DLL该如何生成相应的*.LIB文件? 那位先生对 Oracle Spatial比较感兴趣~~~~~~~~~~~~ 如何在电子邮件中加入JAVA语句,重谢!!! 我不知道~ 竟猜: 成精的狐狸不是狐狸mm就是狐狸jj。那HolyFire 是狐狸jj还是狐狸mm呢?? 软件发布:图标精灵 请问在网上怎样发传真! 为何我的表只能做一页 怎样从显示名称获得它的PItemIDList ********如何在窗体中动态的创建组建?********来者有分 笔记本电脑和台式机怎样连起来传输文件! 很菜的问题,请各位指教谢谢! 花开石头你个笨鸟 我在这里那!! 如何设置串口的“流控制”为“无”? 知道一个窗口的CWnd*指针,怎样使得该窗口显示到屏幕的最前端? DOM 关于软件发布的问题 把19分成若干个自然数的和,如何分才能使他们的乘积最大 有一个质数,是一个两位数,两个数字之和是8,两个数字之差是2,这个质数是多少? 将1~9这九个数字,分别填入方框里,使等式成立.()÷()=()÷()=()()()÷()()=3 把19分成n个自然数的和,怎样分才能使它的乘积最大. 一个质数是两位数,其数字之差为7,这个质数是多少 你能用数字4组成5个数填入方框,使等式成立吗?等数等于100 1.把19分成几个自然数的和,要使这些数的乘积最大,应该怎么分?最大的乘积是多少?2.甲、乙、丙三乡各出等量的钱,购买若干辆汽车,买好后,由于丙乡需要量少,结果丙乡比甲、乙两乡各少要15辆 有一个质数,是两个数字组成的两位数,两个数字之和是8,相差2,这个质数是? 只用数字8组成的五个数,填入下面方框,使等式成立.囗+囗+囗+囗+囗=1000谢谢了, 把19分成若干个自然数的和,如何分才能使自然数的乘积最大?最大值是多少?要算式解. 有一个质数,是两个数字组成的两位数,两个数字之和是8,两个数字之差事2,那么这个质数是几? 只用数字8组成五个数,填入方框内,使等式成立 把19分成几个自然数的和,这些加数的连乘积最大是? 有一个质数,是两个数字组成的两位树,两个数字之和是8,两个数之差是2,那么这个质数是几? 只用数字8组成五个数,填入下面的方框里,使等式成立.口+口十口十口十口=1000 已知四个互不相等的整数的乘积等于9,这四个数的和是? 有一个质数,是两个数字组成的两位数,两个数字之和是8,两个数字之差是2,那么这个质书是几? 口十口十口十口十口=1000 只用数字8组成五个数,填入上面方框里,使等式成立. 已只4个互不相等的整数的乘积等于9这4个的和是几快 我是一个质数,是一个两位数,十位数字与个位数字的和是10,我是? 将只用数字6组成的数,填入下面的方框里,使等式成立 一个整数和一个小数的乘积等于它们的和,求这两个数. 我是一个质数,是一个两位数,十位数字与个位数字的和是10.我是几? 2011是质数还是合数? 如何证明两个数的乘积等于最大公因数与最小公倍数的乘积 一个两位质数,交换个位与十位上的数字,所得的两位数仍是质数,这个数有什么. 2011是不是质数 有三个正整数一个比一个大1,三个数的乘积是210,求三个数 一个两位数的质数,交换个位与十位上的数字,所得的两位数仍是质数,这样的两位数有几个? 求证{2}^{2011}+1不是质数 如果3个连续的正整数的乘积是210,那么这3个数分别是多少? 一个质数是两位数它的个位数字与十位数字之差是7这个质数是几 在2009,2011,2013,2017中,质数有几个? 三个连续正整数,他们的乘积是336,求这三个数. 1/?+1/18=1/? 在2011,2009,2007,2001中,质数的个数是 三个连续的正整数,如果后两个数的乘积的差为114,求这三个数的和 大于6分之1且又小于5分之一,分子分母都是质数,分母是两位数,这样的分数一共有几个 一个质数的3倍和一个质数的4倍的和是100,这两个质数分别是几? 三个正整数的乘积为84,其中两个数的和等于另一个数,这三个数分别是什么? 大于六分之一,小于五分之一,分子、分母都是质数,分母是两位数的分数. 一个质数的3倍与另一个质数的2倍之和为100,那么这两个质数的和是多少? 怎样修改:自然数可以分为奇数、偶数、质数、合数.(注:不能改变“自然数”、“偶数”、“合数”这几个字) 一个大于6分之1且小于5分之1的分数,其分子为一位数的质数,分母是两位数的质数,写出这样所有的分数 一个质数的4倍加上16的3倍,和是100,求这个质数 什么叫自然数 小数 百分数 奇数 偶数 质数 合数 因数 倍数 公倍数 互质数 ( )( )( )( )×( )=( )( )( )( )在方框内填入123456789九个数字,使等式成立,每个数字不得重复使用. 将1,2,...9填入3X3的方格内,使三行,三列,二对角线的三个数之和都等于15,一般地,将连续的正整数1,2,3,.....n平方,填入nXn个方格中,使得每行,每列,每条对角线上的数的和相等,这个正方形就叫做n阶 整数、自然数、小数、分数、奇数、偶数、质数、合数、因数、倍数、真分数、假分数的定义分别是什么?请回答者把以上所有的数的定义都回答上,回答的全的网友追加分! 把123456789这九个数字,分别填入下面九个()中,使等式成立()\()=()()\()=()()\()()=2 在3x3方格中,填入3,4,5,6,7,8,9,10,11这9个数,使每行每列及对角线上的各数之和相等 0.1.2.3.4.5.6.7.8.9这一组数字当中,分别填到方框里(每个数只能用一次),使三个算式成立(至少写两个答 非零自然数按()的个数来分,可以分成质数()和() 在方框内填上123456789九个数字,使等式成立,数字不得重复.()÷()×()=()() ()+()-()=() 将0、1、2、3、4、5、6这七个数字分别填入下面算式的方框内,每个方框内只许填一个数字,使算式成立( )x( )=( )( )=( )( )除( ) 两个连续的非零自然数,他们都是质数,这两个数分别是( ) ( ) 将123456789这九个数字填入框中,使等式成立.()()()=1/2*()()()=1/3*()()() 用0.1.2.3.4.5.6.7.8.9这10个数添在方框里,试下面的3个算式成立□+□〓□□―□〓□□□÷□〓□ ()和任何非零自然数都能组成互质数;两个质数的乘积一定是() 把1-9分别填入下面的方格里,每个数字只出现一次,使等式成立□□÷□=□×□-□=□-□×□□□÷□=□×□-□=□-□×□
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn