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

在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))

Qualcomm中国2015高峰论坛:新品牌与5G技术展望 福利!MDCC 2015 免费展位等你来申请! 《近匠》Gamegou:多些坚持,瞄准海外的小团队也有春天 细说JavaScript异步函数发展历程 YoMail创始人Albert Yang:我与Email交织的程序人生 TIOBE 2015年9月编程语言排行榜:时髦语言Rust进前50 50张999元限量特惠票!SDCC2015软件开发嘉年华 首批讲师名单公布 百度安全:XcodeGhost大爆发可能只是冰山一角 北京市计算中心云计算转型:缘定OpenStack MDCC 2015移动开发者大会 八大技术专场首批议题剧透 Apple TV指南:从零开始用Swift开发个tvOS应用 React Native、开源:MDCC平台与技术Android专场全揭秘! 相约MDCC 2015 首批免费展位破茧而出 MDCC 2015召开在即,平台与技术iOS专场大咖来了! 一个iOS开发者对tvOS SDK的初探 前Twitter iOS技术团队负责人:使用第三方库的四大准则 【SDCC讲师专访】巨杉数据库创始人兼CTO王涛:SequoiaDB为何要开源? 对话函数式编程语言Roy之父Brian Mckenna GitLab获400万美元A轮融资,GitLab 8.0将很快到来 【CTO讲堂】如何构建高可用和可伸缩的架构? 未来程序员会被机器取代吗? React Native实战(一):配置和起步 集聚MDCC 2015 免费展位第二波正式放出 【深入浅出Koa】入门知识,带你以现代化开发方式构建Web应用 升级到Node V4的七个理由 支持大量ES6特性 像写SQL一样编写Java数据应用 Swift 2.0实战:如何实现从非零下标遍历数组? 手把手教学:在iOS 8中使用Cocoapods 交互技术前沿与应用实战:MDCC虚拟现实专场议程揭晓 解密“攻城狮使用手册” 技术专家齐聚!MDCC 2015精彩日程全曝光 怎样自动捕捉网格啊? 本人就快作毕业设计了,想作个vc项目,大家给我点意见吧! 怎么把CByteArray型数组转换成char*型. 关于纯资源DLL的问题! 超难问题:如何将一个EXE转换成SWF? 关于PHP程序员工资待遇问题的讨论! 网页中嵌入ActiveX控件,遇到的问题。 问个比较简单的问题:关于ASP上传的 送分啦~~~~~~~用什么方法可以获得鼠标的移动到那里的句柄(包括窗体和环境),就向SPY++里面的findwindows一样的功能 关于vb数据库的问题,请教了!!!!! 1982.12.12,2001.12.12是19岁生日还是20岁生日? 寻找调查投票程序,66分 在printf格式字符串中,用于输出字符串的格式字符是什么? 哪里有这样的jsp程序 轻松一分钟,统计一下看流星雨的程序员们是单身还是成双成对? c语言程序的基本单位是什么? 是什么原因产生stop:0x0000001e故障的,有办法解决吗 如何虚拟键盘输入?急!!! 请问怎样才能将用户选择的行或列在打印预览窗口中? 如何获得所运行的进程列表 设i,j,k均为int形变量,执行下列语句:for(i=0,j=10;j<=j;i++,j--)k=i+j;则k的值是多少? 怎样把kv3000解密到一张软盘????? 是高手的进来赚点分(全给) delphi中如何定义过程与函数,请帮我各写一行带参数与不带参数的例子, 有谁用过EXPRESSO开发过JSP吗 如何在MTS对象中使用现有控件? 求救!!!WINNT 4.0下无法显示中文! 请各位指导,如何查出QQ的区IP地址? .怎样将多个文件用MAKECAB。EXE制作成CAB文件 请问变量声明问题 该怎么让客户端浏览网页时自动完成对服务器端网页中ActiveX控件的注册? 一直困惑我的问题! 请问printf( "\t\b\b" )是什么意思? 如何将.EXE文件转换为.COM文件? 安装好的软件到哪去了? JavaScript有没有比较字符窜大小的函数。就像VBScript的,StrComp(); nmpop3怎么知道哪些是新邮件,哪些是已看过的邮件呢? SQLServer的别名怎么建立?急,急,急 为什么,为什么,我的delphi到底怎么了!!!!!!!!!!!!!!!!!????????????????????? 问一哈:哪有中文版的VB API的书?(不要MSDN)下载看是也可以的。 关于收发internet 邮件 VB中怎么使一个数值四舍五入呀?有四舍五入的函数吗? VC编译器告诉我这个错误,请帮帮忙。 如何将SQL6。5升级SQL7。0? 鼠标怎么不见了? 请问如何用C++编写一个从键盘上输入若干学生的成绩,统计并输出最高成绩和最低成绩,当输入负数时结束输入。 SQL Server为什么不能递归调用?有什么变通办法? 看看http://www.csdn.net/develop/read_article.asp?id=7104 请问CSDN离线浏览器中的数据算法的数据库在什么地方可以下载?? 高分求解:图的最小生成树问题(类似背包问题) 判断时间是否过期最简单的方法就是用datediff函数吗? 十六分之四和十八分之六怎么约分? 怎样判断马铃薯中是否含有糖类?实验所需材料:实验现象:实验结论:如题 280分之225 约分 含糖类较多的食物 什么食物克马铃薯 15分之225约分 哪些食物含糖类多 食物中的食物纤维是什么东西?还有土豆含维生素C多吗? 大圆的直径是小圆直径的3倍,那么小圆的周长是大圆周长的(),小圆的面积是大圆面积的()注意:是问小圆的周长是大圆周长的多少,不是求大圆是小圆的多少 牛奶保存不当会影响下列哪种营养素的营养价值?A .蛋白质 B .脂肪 C .碳水化合物 D .维生素 E .矿物质 含有丰富糖类的食物有那些? 食物相克西红柿和土豆是吗 木糖醇口香糖与平常的口香糖有什么区别?对我们有害吗? 哪些食物富含糖类 土豆是酸性食物还是碱性食物? 大圆中有一个小圆,小圆半径是大圆半径的二分之一,大圆的四分之一减去小圆的一半等于6厘米,大圆的面积是用方程,用算式都可以, 6分之5小时的2分之1是几分钟,4分之3千克的3分之1是几克 兄妹两人同时从A地向B地去,哥哥每分钟行150米,妹妹每分钟行80米,哥哥到达B地后立即返回,A 、B两地相距2300米,两人多少分钟后相遇?相遇时,妹妹行了多少米? 一个苹果重10分之1千克,一筐有8千克.一筐有多少个? 5分之3小时=( )分 8分之5千克=( )克 6分之1×( )=13分之7×( )=13分之7-( )=( )×0.3=1 兄妹两人同时从A地向B地走去,哥速度180米,妹速度60米,哥行到B地即返回,AB两地相距1440米.两人相遇时,妹妹走了多少米 1斤等于多少千克? 兄妹两同时从甲乙两地相向而行,兄走完全程要2小时,妹走完全程要3小时,两人相遇时兄比妹多走了2.4千米.甲乙两地相距多少? 兄妹两人同时从A地向B地走去,哥哥每分钟行180米,妹妹每分钟行60米,哥哥行到B地立即返回.AB两地相距1440米.两人相遇时,妹妹行了多少米? 10约分! 妹两同时从甲乙两地相向而行,兄走完全程要2小时,妹走完全程要3小时,两人相遇时兄比妹多走了2.4千米,求甲乙两地之间距离? 兄妹同时从A向B走,哥哥每分行180米妹妹每分行60米,哥哥行到B地返回,AB相距1440米两人相遇时妹妹行了几十万火急! 各元素的化合价1--20号,Fe,Mn,I,Br,Ba等越多越好 甲乙两人从两地出发,相向而行.甲走完全程需要2小时.已走完需要3小时.两人相遇时甲比乙多走了4.5千米.求两地相距多少千米 兄妹两人同时从A地向B地走去,哥速度180米,妹速度60米,哥行到B地即返回,AB两地相距1440米.两人相遇,要等式 单质中元素的化合价看做();化合物中各元素正化合价的总数与负化合价和为() 甲乙两人同时分别从AB两地相向而行甲走了全程的5/11的地方与乙相遇,已知甲每小时走4.5千米,乙行完全程用5小时,那么这段路全长多少千米? 怎么约分 根的化合价就是各元素化合价的_______ 数学在什么情况下该约分那如果约分了, 两个圆的面积,和为5338平方厘米,大圆的直径是小圆半径的8倍,求两圆的直径和周长? 化合价的相关问题 化合价原则 根据常见元素的化合价书写化合式 判断一下物质中各元素的化合价化合价原则:单质中元素的化合价为_______,化合物中各元素的化合价为_____ 哪些情况下可以约分.比如4.5×5×11/5.怎么约分的? 大圆半径与小圆直径的比是8:4,如果大圆的周长是25.12厘米,则小圆的面积是( ) 西瓜平均分兄妹两人 哥吃了分到西瓜的五分之四 妹吃了分到西瓜的三分之二 兄妹两人分别吃了西瓜的几分之 x^-(y-z)^/(x+y)^-z^ 为什么葡萄糖淀粉纤维素都属于糖类 木糖醇的化学式为什么是C5H12O5 约分, 蔗糖、葡萄糖、淀粉都属于糖类,那种更容易被人体吸收?请说明机理,并从人身健康角度分析,对这些营养成分的摄入提供一些有益的建议. 4分之1千克=()克 下面能不能约分啊?忘了!5/1*6/1+3/4--------------555/8=88*44 为什么葡萄糖、淀粉、纤维素是糖类? 2003年,兄妹两的年龄分别是16岁和10岁,那么当哥哥的年龄是妹妹的年龄的2倍时,是 加工过的糖类食物是哪些? 淀粉变成的葡萄糖,是糖类物质吗拜托了各位 谢谢淀粉是糖类物质 2006年,兄妹两人的年龄分别是16岁和10岁,那么,当哥哥的年龄是妹妹的年龄的2倍时,应是___年急 20千克的四分之一比1吨的200分之3少多少千克? 葡萄糖、淀粉等有机化合物都属于__类,又称__化合物.淀粉是人们食用的最主要的糖类.检验淀粉的方法是_. 2007年,兄妹两人的年龄分别是16岁和10岁,那么当哥哥的年龄是妹妹的2倍时,应是几年 5分之2千克的11分之2比它的6分之五少多少千克? ( )千克的十七份之五是五千克 约分 十八分之十二= 约分怎样约 用小数计算.10千克+5千克36克
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn