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

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

让字体左、右对齐-Delphi资料 如何给TListBox加上水平的滚动条?-Delphi资料 如何快速选择一个组件的父亲-Delphi资料 如何用Delphi编写自己的可视化控件 如何用VB创建控件-Delphi资料 生成程序组和项-Delphi资料 实现超级链接-Delphi资料 实战Delphi数据网格色彩特效 使dbgrid的某几笔资料变色-Delphi资料 树形图(Treeview)的使用概述-Delphi资料 透明FORM-Delphi资料 为列表框添光彩-Delphi资料 限制FORM的大小-Delphi资料 用Delphi开发分隔线组件 用Delphi设计拨动、跳线开关组件 用Delphi 设 计 拨 动、 跳 线 开 关 组 件 用Delphi实现JPEG格式图像的显示 用Delphi制作动态有声标签 运行时生成控件-Delphi资料 在DBGRID中实现COPY、PASTE功能-Delphi资料 在Delphi程序的About窗口中建立URL连接 在Delphi中利用Tbatch组件完成数据批处理 在Delphi中巧改窗体文件实现控件数组化 在Delphi中实现不同风格的SPEED和BUTTON 在Delphi中实现类似VB中的控件数组。 在RichEdit中的串查找-Delphi资料 在按钮中快速启动程序-Delphi资料 怎样读出MEMO控件的当前值-Delphi资料 怎样使用Delphi 5中的TExcelApplication操纵Excel 97/2000 怎样在TDataset中汉英混用-Delphi资料 制作可移动的窗体的MovePanel控件-Delphi资料 关于linux WEB服务器名的问题? 请教ATL中CBindStatusCallback的问题 我的IE不能打开新窗口?用鼠标左键点击超链接没有反应? 我的项目改变目录后打不开,怎么办? 多CPU机器,同时可有几个线程处于运行状态? 高分求高效高斯模糊算法。。 如何判断软件是否过期 是不是运行ASP.Net应用的服务器必须安装.Net FrameWork呢?还是只要有Win2000 Server和IIS就行。 谈情说爱 清除内存中用call调用的脚本文件? 一个很老的问题,如何避免CListCtrl闪烁。 请大家给看看程序:avi视频读取和重建 研究数字图像处理应该那些知识? 图片上传并显示实例(VB+SqlServer2000) SQL语言中 怎样将CHAR型转换成INT型? 級連更新... 怎么实现回车自动跳到下一个位置 如何在光标处插入字符? CSSCLASS高手关注,我想把ListBox、DropDownList样式改为平面,而且颜色边框为1颜色不为灰色,用CssClass具体怎么写呢?越详细越好?多谢 求一招:::怎么对付那些那了代码就不给钱的家伙???? =========发誓:远离csdn!================ phpmyadmin为何安装不成功? 谁有crystal reports的电子书。 这个radio的返回值是什么? 离开csdn,公布密码!!!!!!!!! 新手!求界面问题的答案! javascript面相对象的编程 IMail邮件系统的问题 七月七,我不在她身旁. 可是很想她.我爱她. 高分!求一简单问题。 今天七月七了,代表所有单身人员向全体女单身同胞问好,同时也祝成双成对的人永远快乐!! 请问php中二维数组怎么定义和初始化? 难题---SQL Panel2.Width/2;应该怎样改 求: Rational XDE 2003 (带破解的),分不够可以再加,要多少给多少,很急! 这个存储过程怎样调用? 在有限区域中打印文本,文本长度若超出,则压缩间距,否则正常显示 急,高手请进! 如何重新加载select? 怎样做一个网页编辑器(windows form)大家给个思路 强烈建议 删除 {{轰动上海大学的偷拍事件录像下载地址 (yy795188 ) }}的贴子,否则版主失职 用Authorware能够作出象隐藏在框架里的菜单吗? 我的程序需要定期执行一次,怎么写呢? 请各位大侠帮忙分析分析,我大概还有300分的可用分,解决的话,全送你了(300分) 日历 这是Mysql的BUG吗--彬、斌--如何分别查询 如何利用XML中的xsl进行信息的交换 为什么我新建项目时不行? 求教:有没有象outlook一样的文件管理软件?? 怎樣利用datalink和可更新快照進行雙机數据同步一制備份?急救!急救!在線等待!! 我学flash怎样才能入门了~~!我现在不知道怎么下手~~! 依旧填空题.1.一辆汽车做匀速直线运动,在5s内通过相距50m的A、B两根电线杆,若汽车经过B杆后改做匀加速直线运动,到达下一根电线杆C时速度达到15m/s,若B、C两杆相距也是50m,则此汽车的加速度 初三反比例函数 直线y=x+1与y=2/x相交与a,b求三角初三反比例函数 求大神 在线等 直线y=x+1与y=2/x相交与a,b求三角形aob的面积 为什么我们国家教育制度这么仓库呢 染色体1号跟19号平衡易位能做试管吗 请问分封制度下周王和诸侯是君臣关系么 《目送》的阅读答案 怎么样可以提高高中语法填空完形的能力? 三国志.魏书 ——董遇自季直.原文+译文 《三国志 魏书》之董遇字季直你是怎样理解“人有从学者,遇不肯教,而云:‘必当先读书百遍!'”? 中国的教育制度是否存在缺陷 中国的教育制度到什么时候能够跟上世界潮流!中国现代的教育制度毒害了许多有能力的人士所培养出的才子佳人大多数是有文化没有能力的人! 非洲多国出现罕见混合型日食克里访开罗寻求修复美埃关系长兴3万株古银杏披“金”衣与青山翠竹浙江富阳万市镇“银杏之秋”开游式在杭常山举行处置村级组织换届群体性突发事湖南三姐弟上学途中遇害 学校:校车司周四“立冬” 接下来雾霾可能会是杭州中央第二轮10巡视组全部进驻 重点纠地方政府放权缓慢遭质疑 官员:有些权男童假装落水致救人者瘫痪 愧疚28年孙杨年初已无证驾驶 负责人称依法处理无线技术保护不足 黑客可控制汽车并窃网上吹嘘继承大批珠宝 美国网友遭匪徒王洪章:增强三个能力建设 五方面推动台女星散播不雅照 当事人羞愤自杀(图新关西机场公司延长运营权投标期限泰国总理乘坐东京至大阪新干线 比较日国家发改委给高通开中国市场8%销售额中欧、中德、中法举行外交政策磋商美德首脑会晤难掩分歧新华社评论员:勇于担当,肩负起改革历地方两会看经济转型发展:开启新动力
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘