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

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

创翼全国 六城联动——2012移动互联网应用创新大赛开放日 全国六城联动沙龙 爱丽丝+福尔摩斯 Game Insight解谜游戏玩出新花样 Windows Phone 8 SDK大升级:部分功能兼容WP7 信息大图《愤怒的小鸟》发家史 Intel预测:10年之后你的手机是48核的 消息推送惹怒用户:应用开发者请别太过分 创新工场:我们如何孵化未来? iOS越狱比例下降:国内移动开发环境怎么了? 响应式图像技术与资源分享 看Twitter如何应对大选:少些Ruby 多些Java 软件开发中常见的十大系统瓶颈 [CTO俱乐部87期]三人行架构分享:开源是背后的支柱 推荐5款超实用的.NET性能分析工具 OpenStack基金会主席Alan Clark访华 欢迎提问 程序员的十大烦恼 兼顾性能和兼容体验:HTML5时代的浏览器全面测试 Lisp的本质 Amazon工作环境恶劣员工高流失率 为何却依然能持续成功和创新? 对几个软件开发传统观点的质疑和反驳 [实战分析] 编写高效的JavaScript程序 Twitter的系统编程 百度高通达成合作 为Android终端提供云服务 EasyHadoop技术沙龙在北京、广州两地齐发 CloudStack技术沙龙:committer李学辉及中航信分享 思科为什么愿意花12亿美元收购云计算网络初创公司Meraki? 谷歌有麻烦了!联邦贸易委员会正调查其搜索业务 当数据中心遭遇污水 微软新能源数据中心的诞生 2012vForum:更加注重开发者 腾讯赵伟:Hive在腾讯分布式数据仓库的实践 Apple将在2013年启动香港数据中心的建设 顶级域名扩张受阻:ICANN透露部分域名存争议 小小问题?如何得到窗体右上角关闭,最大化,最小化的句柄??? 多少分才能有两绿三角?多少分才能有一个红星? 哪位同志知道网站的风格像 win xp? 请问哪里可以下载xml spy的中文帮助文件? 请教如何将.cab包解开 50分﹕HELP!!!為什么我的report分發后﹐項目全錯位了﹐應如何解決﹖ 各位,在工程中怎样用资源文件(*.res) !!请问如何利用ADO做三层设计? 哪位大哥有vfw.pas的啊?60分相赠 ATL在中国的现状怎样,大家进来说说!!! 如何黑一个网吧~~~ 急:问个初级问题,希望能得到解决 这个论坛不错! 能不能让C盘只读不写啊? 为什么CopyMemory在NT下的效率与在98下的效率不同! cmos密码如何破解 database控件的问题????? 关于if 语句! 急急急...所以的程序一运行报错:This Example Program Can Only Be Run From With The IDE? 我的机器一运行该页面就慢 怎样设置FileListBox1的路径 free,delete ,Free()的区别? 初学网络,从何学起?如何过渡 请问生成EXE文件以后,要把PB下的哪些dll文件拷贝过去,全部都要吗??还是只要拷贝几个就可以,请问是哪几个? 如何实现自动编号(在线等待) 请问如何在使用insert into时同时使用select和values语句?(十万火急) 怎样改变ListView1在详细显示模式下表头的高度(调用小5号字体)? 我用的是TomCat,请大侠们帮我看看这段调用access数据库的jsp程序那里错了!每次都提示“From字句语法错误”! 如何对数据窗口中的内容进行批量修改?急!!!!! 全上海暂无业者,联合起来!!! 请问如何在使用insert into时同时使用select和values语句?(十万火急) 高分解答!!!谢谢!!!! 字符'\'在c++中当什么看 初学者的problem,讲一讲 一个菜问题 我的爱机是不是感冒了? 关于.NET的资源占用问题? 大侠们好!!!为什么我用DBEdit输入中文可是在DBGrid中显示的是“#”?? 请教Sybase高手3个问题 有关打印的问题,急! 关于响应键盘事件!!菜题送分急!看看我的记录,我一向是当天给分的!!只要题答好。 SetParaFormat的问题,烦死了。 同时登上"vc版"和"网络通信版"榜首,高兴散分 在delphi 中怎么判断Sql Server 表中的字段为计算字段,急等 问个在Delphi里关于Socket的问题,别嫌弱啊 求租!上海! 如何实现描点视图的剪切板传输问题(复制) 帮我看看这题怎么解,谢啦 大侠们好!!!为什么我用DBEdit输入中文可是在DBGrid中显示的是“#”?? 在VB中如何用程序在SQL SERVER中加入数据库 哪儿有Programming Windows的配套光盘代码下载? 内流河指什么河流 中亚只有内流河,和内流湖吗?另外,如果知道的话,请帮忙回答一下什么叫我国华北平原出现返盐现象?什么叫返盐现象? 求:优美句子! 北极的冬天和夏天有什么区别 高烧时人产热散热为什么相等 优美句子 地球上水的平均温度是多少? 高烧时打哆嗦是散热还是产热? 达达主义和波普艺术的区别简单描述一下它们的区别各自的特点及所倡导的思想~不要粘贴来的, 地球全年平均温度 遥感与地理信息系统在化学领域有哪些应用? 求优美诗句用 清风 乘云 万紫 雪羽 血色 青绸 落羽 暗香 仙侣 暗淡 改成5个字的句子 不要求和诗一样连着 只要格式差不多就好 类似 初风染堇色 流苏落晚衣 这种的 4字也成 有几个算几个一 今晚《走进科学》主持人采访的“专家”说,核电站反应堆的热量来源是裂变中子和水分子摩擦产生?!...刚看了今晚央视的《走进科学》,关于日本福岛核泄漏事故的,主持人采访了一个什么专 语言诚恳切而有分量,情谊深长 是哪个词语的意思 生物:人体每天正常摄取的蛋白质是多少啊? 遥感与gis的区别? 一天中持续发高烧,体内的散热量和产热量哪个多,为什么? 生物题:蛋白质在人体什么中被初步消化,在什么中被彻底消化和吸收? 到北极考察最好的季节是北半球的什么季节?(到南极呢?) 话语深刻有力,情谊深长是哪个词语 补充里为人体蛋白质的有关代谢问题,请回答:⑴蛋白质是人体的重要营养物质,人体每天必须摄入足够的蛋白质才能满足人体的需要,其原因是什么?⑵人体内某些氨基酸不能通过氨基转换作用 北极最佳旅游季节是什么时候?暑期还是冬天? 土地利用分类代码在Arc GIS中如何改变 谁能帮算下额定功率多少,最大多少.顺便给下公式 北极洲是什么季节时,最好去南极洲考察? “言辞诚恳,情谊深长.隔不久”是什么词 什么叫达达主义 北极考察的最佳季节是南半球的( )填夏季或冬季 专题GIS分类众所周知,GIS能做很多专题,例如:人口分布,交通路线,地理环境等,这里要解说的是一个分类问题,就是如何把众多的专题内容进行分类,中国地大物博,无才不有,我相信会有人知道的. 达达主义的意思? 不用说话就能明白,形容道理很明显的词语 地理信息系统GIS有哪些分类, 达达主义有什么惊人的艺术主张 关于人生哲理的诗(不要古诗)写作背景,以及所表达的情感,请简短些;作者名字(不用他或她的简介) 美国的地理位置和领土组成 达达主义收到什么哲学思潮的影响 有没有古代诗词中表现人生哲理的诗句?(以及出处) 美国和中国,哪个地理位置好? 我的理想作文,不用太多,一写些好词好句就行不过也别太少啊,200字至600,越多越好啦,写当编辑的或服装搭配师, 蕴含人生哲理的古诗?要有诗名 过多或过少的蛋白质摄入对人体健康有什么影响 我的理想作文,好词好句多的 核电站的核反应,岂不要产生数千万度的高温.核反应的容器那不要瞬间气化了?自然界,怎么会有耐那么高温的容器啊.一般的容器,那不要瞬间都给气化了.那核电站核反应的容器到底是什么啊? 形容说话一点不剩的词就是形容那种心里面憋了好久的话全部一下子说出来的词.紧急提问! 有谁能详细的介绍一下“汽车内饰设计发展史”.请注意是“汽车内饰设计发展史”不是“汽车发展史”. 核电站所发生的核反应是什么?是什么反应就行了 把有的说成没有的可以用什么词语形容啊?,...不是无中生有哦 是把有的说成没有的 平面设计发展史每个发展阶段的特点是什么 核电站中发生的核反应是() 形容说话不流利的词语 我自己写了一首诗,母亲的眼泪 女娲下凡来到尘世间,开始人类生命的起点.地球母亲流下了喜悦的泪水,香甜.大地上出现第一棵火苗,这是人类文明的起点.地球母亲流下了激动的泪水,甘美.滚滚 核电站的核反应方程式是什么. 中亚的河流多为内流河,主要河流有哪些 大家看我自己写的诗怎么样?这是首骂无信小人的诗,你们可能看出什么来?无人不遇厄运时,信尔方起救悯心,小烦已随东风去,人心且遭豺狼食,猪肥献身报食恩,狗念恩情不弃穷,不想人心逊猪狗, 切尔诺贝利核电站4号反应堆现在是否还在发生核反应? 中亚地区多为内流河的原因 人体最多摄取蛋白质才不会有反效果?如题 简单阐述遥感与GIS的关系 中亚的河(湖)为何多内流河(湖)?能更具体分析一下吗,请问这跟中亚的地形是否有关? 根据下列诗句的意思各写一个含有相同道理或意境的成语王师北定中原日,家祭无忘告乃翁.( )
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘