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

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

已确认Stephen Elop候选微软下任CEO 英语对于软件开发者来说到底有多重要? SDCC 2013中国软件开发者大会成功落幕 新浪微博宋琦:PHP在微博优化中的“大显身手” 8月份浏览器份额:IE浏览器PC端出现反弹 移动端跌出前五 如何让Ruby项目速度提升10倍 跨平台进行到底:Facebook发布Unity SDK 云薪资管理初创公司ZenPayroll:年处理薪资超1亿美元,获多位知名CEO力挺 Twitter开源Summingbird:近原生编码下整合批处理与流处理 亚马逊推Matchbook 欲将顽固纸质书读者拉向电子书 Broadcom为可穿戴设备推新开发平台WICED 再战江湖 New Kodak还牛不牛? 郭理靖:公、私有云架构异同点与难点 美化代码的15个代码语法高亮工具 你所不知道的虚拟化和云计算 [开源推荐]Effeckt.css项目:CSS交互动画应用集锦 针对Google Glass应用的四大UX设计原则及典型应用 Google收了摩托罗拉,微软收了诺记,黑莓又将花落谁家? 十亿月PV网站秘诀:Reddit自失败中总结的25条经验 粉碎5个NoSQL流言:各司其职,NoSQL的出现比关系型更早 豌豆荚发力移动游戏平台,推出SDK 2.0 BlackBerry Jam Asia 2013即将在香港隆重召开,免费门票限量提供 小米发布会高潮迭起:米3、电视、Hugo大牛 谷歌放在Windows上的特洛伊木马:Chrome Apps应用平台 解析:Google基于数据驱动的招聘面试程序 决战“缓存”之巅:微软 vs. 亚马逊 雪中送炭:十大前沿移动应用开发工具 高通智能手表Toq都用到了哪些技术? 研发周报:修改一行SQL代码 性能提升了100倍 2013年NoSQL就业趋势分析 鲜为人知的静态、命令式编程语言——Nimrod 用DIRECTSHOW 做时时播放,有问题吗? 现在开始系统的学习C++,散分 如何在 DOMINO 服务器上删除用户的邮件。 哪位知道Velocity是怎么用的?在Tomcat下是怎样编译的?它与JSP有什么不同? 两个数据库的同步更新怎么做?非常紧急! 请教一内存驻留问题 哪位知道Velocity是怎么用的?在Tomcat下是怎样编译的?它与JSP有什么不同? 谁用emacs?很无聊的问题! 用 DIRECTSHOW 做实时播放可行吗? 郁闷,领导突然缩短我的项目开发时间,这是成心不让我睡觉啊,让我减肥!!! 哪里有DirectX9.0的设计时库啊,我下载的9.0为什么找不到.h.lib呀,帮帮我好吗?再线等 高分求解!!得到警告!!!怎么办 请问 0x80030002 是什么错误呀? 哪里能下载poi包 pb8中怎样打开pb7的*.pbl文件? 可不可以控制菜单的一个子菜单不可见? helpkeyword属性设置问题 我想自己攒1台机器,用来家用和学习,比如学.net等,打算在4000—5500左右,请大家帮忙推荐一下给怎样配置? 100分悬赏,求可以通过身份验证的发送电子邮件的程序的例子,决不食言。 flash中有没有类似photoshop中的模糊滤镜的功能? 运行中终止系统! 怎样实现单击展开一个节点 请问哪里有VTune Profiler下载?据说它能分析VC代码中各函数所占用的开销 请教:用简单的查询来说明分布式数据库是怎么实现的? 事务日至到底有什么用呀? 两个线程共同调用一个静态函数,如何在一个线程调用的时候,阻塞另一线程的调用? 定制控件可不可以使用用户控件作为子控件? 我的困惑,一个值得深思的问题 存储过程,我再加一个参数@sessionuser char(8),在调用该存储过程时,我如何把参数传给sp_querycard? 如何实现页面剪切? hot, hot, hot! 有关Java Swing的编程问题 两个线程共同调用一个静态函数,如何在一个线程调用的时候,阻塞另一线程的调用? 如何将程序做成服务的形势,如何调用,有没有这样的实例啊 如何在2000下進行命令行撥號 打印问题请教!!急!!! 來取分關於weblogic7 俺也灌一次水: 45/59 = ? 一个关于处理WORD文档的问题? 喜欢许巍 的请进来 不通过DataSource 如何给DataGrid 的DataGridBoolColumn列赋值?(在线等待中...) 谁有MicroStation BASIC开发语言参考中文版 请问:如何通过JAVA程序访问Web页面? Win2000的最小安装需要多少容量?快抢分啦! 如何将一个table从原来的tablespace移到另一个tablespace 计算一个月有几周,星期一为第一天,相关语句 骆驼您好,刚才没看到你的回贴的时候,那个贴我已经结贴了,我还有问题请教,请进,多谢。 请问哪里有VTune Profiler下载?据说它能分析VC代码中各函数所占用的开销 请问如何在ftp上收发xml文件。。。请具体点告诉我或贴源码或贴相关文章地址 文件解析 VC的OPENGL编程显示提示框时,显示内容是以前绘图的,不是最新绘图的,怎么办? 请问为什么create table bbb as select * from aaa ,aaa上面的缺省值还有索引都掉了呢? 舒淇疑与冯德伦正式分手 留言:我你高杨幂黑超现身机场短信发不停 亲切抚摸赵薇老公晒全家度假照片 一家三口其乐杰西卡·阿尔芭登封面 大秀火辣性感身熊黛林:我绝不会自残 盼尽快展开新恋李宇春萧亚轩等群星齐唱公益歌曲 为雅刘诗诗曝最新封面大片 妆容精致妩媚娇老公晒全家度假照 可爱大眼睛像母亲(小S素颜主妇范儿接女儿放学 戴猫耳朵杨幂狂发短信疑与刘恺威电波传情 俏皮张惠妹短发清新亮相 与黄子佼配合默契余文乐望当钟楚红儿子 杨千嬅否认与郑巩新亮周楚楚范文芳等女星发布秀“斗胸杨丞琳“为爱启程”落泪 7月上海站演李颖芝穿戴“亿元钻石”上海车展现身海女星红毯造型需谨慎 得罪造型师后果很书香洋溢伴我行 修身养德适任职《百变舞台大咖归来》4月搞怪 歪脖“超自然主义” HQ2013杭城时李泽楷与混血律师约会 梁洛施亦有新欢富二代吉星鹏砍死妻子祁可欣 祁可欣生韩正会见印度塔塔董事长大师离场 “孤独”永恒“舌尖上的A股”进入第二季郑商所处分一对敲者问题喜宝已下架 申城超市不销售湖南省今年将改扩建精神卫生服务机构2上大宣布经管类不收文科生沪铝持多观望 郑糖日内交易湖南植物园被质疑高票价敛财 律师要求千吨“霸道”石材被挪走 芙蓉区整治双沪警方昨销毁千余非法枪支主力合约点评31万买两靓号 不到两月被收回杜家毫主持召开省政府常务会议 研究部“大巴黎”冲击赛季首冠大师离场 “孤独”永恒长沙天心区造绿大行动 垃圾山“变脸”天津展回顾:新日斥资亿元打造智能2.省委督导组对长沙领导班子教育实践活动毕业学子专偷邻校学弟 一个月偷了19商业银行优先股来了
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘