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

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

新一代IDE Light Table开源:让编程工作更简单 图片应用也能高大上,看Cooliris如何玩转无人机 拥抱Spark,机遇无限——Spark Summit 2013精彩回顾 1月10日:改变世界的iPhone七岁了,你是传奇! 同洲电子推出首款手机操作系统960OS 免费授权使用 如何在Windows 8.1的IE11中打开同步选项卡? 25年老对手评价微软:换CEO可行,但是太迟了 【PPT集萃】十位一线专家分享Spark现状与未来(三) 万元奖品等你拿!2014创客118新年大Party! Firefox OS的2013回顾和2014展望 Strom8 CEO:搞好手游开发,合伙人很重要 2013年Q4全球PC出货量同比下滑6.9% 已连续下滑七个季度 一周消息树:2013年十大产品、图书、公司盘点 专访Wunderlist主设计师Jan Martin:永远不要盲目跟风流行趋势 研发周报:超实用的JavaScript技巧及最佳实践 2013最吃香的技能:Java称霸、Android势头正猛 移动周报:最火原型设计工具盘点 “京东电商云”起航,零售企业及品牌商是重点 教育乃立国之本:教育类开源项目大汇集 Hugo Barra首度谈离开谷歌后在中国工作的感受 对中国赞不绝口 母婴行业最早试水者 优谈宝宝借助轻应用全面布局移动产品线 腾讯云平台部总经理纪顺友:微云将彻底迈过文件传输的门槛 豌豆“荚”油!B轮融资1.2亿美元的豌豆荚 2013年终盘点:10款最精巧的硬件开发板 SquareWear:可替代Lilypad Arduino的开发板 开放数据:2014年最热门的竞争领域 IE11虚拟机免费面向广大开发者 九城搭建的一个以Hadoop为基础的大数据平台 Windows 8复杂性的代价到底有多大? 在发布前,第一代iPhone其实并不完善 市场占有率调查:iOS 7秒杀Android 4.4 请问什么命令找开一个窗体的? 请问:如何从文件中获取icon并得到HBITMAP句柄? 如何在客户端打开一个word文件 MVP是个什么概念???? linux启动不了,Bringup loopback interface时出错,请问是什么原因? 帮帮忙!! 我海军一艘潜艇失事 70名官兵不幸全部遇难!! 明天朋友结婚,征集整人的法子 是谁删除了我贴?? 而且没有跟我说一声!!! 白天工作,晚上溜狗,爽呀!比大暑天喝了冰镇雪碧还爽! 我的jsp服务器是iis+TOMCAT+win2000pro 不知怎的每次用不了多久就显示出 网页无法显示 目前访问该 Web 站点的用户过多,我只是自已用怎么 终于有星了,高兴,散分(第一次散分,请斑竹手下留情) 我的刚装的2000进入启动界面时,进度条读到2/3时就蓝屏了! 请问在运行时向ActiveX控件中添加ActiveX控件的方法是什么? 高手请进:如何在WinNT以上系统进行BIOS读取! 毕业设计的问题,请各位大哥帮小弟一个忙 备份与恢复 数据备份与恢复 我用win2k,下载了php4.3.1,extension_dir是c:\php\ext 可是里面没有php_gd.dll,怎么办,到哪里可以down一个补上? 帮我一下:解决中文问题 新手问题:怎么在用ATL COM WIZARD已生成的dll加入MFC 请问如何删除系统? warton给大家散分来了! 求助,请问哪儿提供的域名空间最好? 新手上路,VB中用ODBC连接ACCESS 关于ORACLE中(多)表的备份和恢复问题 MM``狂给分^*^ 找人一同研究JUnit对于数据库的测试架构 怎样在程序中动态生成数据库(内存库)?求救高手 请问,怎样用本机作web服务器? 这样的夜晚 想起一些故人.... 各位的jbuilder是用什么命令运行的 刚学者求问 python+CGI 如何获得客户端IP Win2000上, 对话框没能弹出到桌面顶层 在静态上下文中不能引用非静态变量? 有没有高手可以举例讲解一下self的各种用法? 一个很困惑的问题:文字处理软件中,字体大小改变时,字符的高度,宽度怎么变化? 移动硬盘在重装系统时忘记拔下来。结果给误删了,求助!没有格式化的! 怎样创建自己的 Cursor ? 请问一下 这个是什么意思 public Properties() { this(null)} 在SQL7中日志满了,如何清除日志. ?????????? 一个编程习惯上的问题 为中国争口气!投中国的长城和布达拉宫一票!!恳请置顶! 菜鸟问题4。。。。 网上现在有没有用ASP.NET做的实例 vc.net为什么没classwizard 有关CDC的一个问题,有代码,请指教! 要陪老婆,兄弟们,给我顶住,我先闪了,..... javascript 能否取得客户端的IP? 关于删除xp_cmdshell的问题 一个四边形一定可以进行镶嵌 求泰勒斯威夫特的新专辑red里面come back...be here,we are never ever getting back together还有还有sad beautiful tragic,以及以前的safe and sound和you belong with me,back to december的伴奏,各位有多少都发给我吧, 家里挂镜子好吗 go to work by their car对吗 指南车为何人所造? 除哪一种外都是由细胞构成的?A,狗 B,烟草花叶病毒 C,蕨 D,向日葵请说明选择理由哦! 江西省九江市永修县立新乡车溪车溪中心组193号英语翻译 7上历史题传说谁造指南车 构成向日葵的组织有 改为复数形式啊 黄帝制造指南车反映出人们可能认识到什么现象? 如图所示,左侧是倾角为60°的斜面、右侧是 圆弧面的物体固定在水平地面上,圆弧面底端切线水平,一...如图所示,左侧是倾角为60°的斜面、右侧是圆弧面的物体固定在水平地面上,圆弧面底端 江西省新余市渝水区的邮政编码是多少 余额宝里,在金额相同的情况下,为什么七日年化收益的利率越高,反而收益越少呢?比如说,金额相同的情况下,七日年化收益的利率是4.9940%的收益(2.35)比七日年化收益的利率是4.7960%(2.89)的 他们相爱两年了.They have___each other for 2 years, 改为复数形式, 以余额宝的七日年化利率什么上涨什么下跌.a一定b可能c不可能,数学题 《我的伯父鲁迅先生》课后问题:“你想,四周黑洞洞的,还不容易碰壁吗?”找出类似的句子并解释 运用三角形和四边形进行ping平面镶嵌,个三角形和?个四边形可以进行平面镶嵌? 《我的伯父鲁迅先生 》四周黑洞洞比喻什么 help!math!已知abcd是正数,且满足a+b+c+d=4,用M表示a+b+c+d,c+d+a,d+a+b的最大值,则M的最小值是多少? 英语翻译快1! 我的伯父鲁迅先生中“四周黑洞洞的,还不容易碰壁吗?”求理解 help!(5年纪math)有一个长方体铁盒,它的宽与高相等.如果长缩短15cm,就成为表面积是54cm^的长方体,这个长方体的宽是长的几分之几? 送分!今天倒数第二次 先到先得 无条件限制!速度进 I like this pink jacket改否定句;They like the school也改否定句并写出一般疑问句,作否定与肯定回答 MAth promble! help !Why is important to learn to communicate mathematics ? give a real-life exmple of communicating mathematics 今天倒数第二次送分!先到先得!无条件限制! They like super robots(否定句)This pair of gloves is yellow(复数句)The are(horses)in English(提问 math help!)某水坝横截面是等腰梯形,坝顶宽6m,坝高10m,斜坡ΑB的坡度为1:2.现要加高2m,在坝顶宽度和斜坡坡度均不变的情况下,加固一条长50m的大坝,需要多少土方? 关于毛泽东的诗词 小报的题目帮我起个题目,5—7个字左右好的追加悬赏5——不等 there+was+a+small+house+many+year+ago.+变一般疑问句怎么变着急 我的伯父鲁迅先生++++++++++++++四周黑洞洞的比喻什么++++++碰壁比喻什么 毛泽东都有哪些诗词(题目,题材) 江西省新余市的邮政编码是多少呀 如图,如果直线L 的表达式为y=kx+b,那么关于x的不等式kx+b>0的解集是______________如果直线L 的表达式为y=kx+b,那么关于x的不等式kx+b>0的解集是______________,kx+b ________are all Chinese a)We ,you and they b)you ,they and we c)he ,you and i d)they ,you and we这道题我觉得先a,可为什么答案上选b 江西省新余市东山雅筑邮政编码 语文一道题;连( )带( )例;连(蹦)带(跳)英语题目;open your books(改为否定句,但意思不变哦 ) 同一种四边形能够进行平面镶嵌吗? bamboo的复数复制搜索说出为什么复制搜索 海带细胞中积累的碘的方式是什么? 同一种四边形一定能进行平面镶嵌是真命题吗? 四周黑洞洞的,难道还不容易碰壁吗?《我的伯父鲁迅先生》 这句话用的是什么修辞手法 Open the gate.please 改为否定句,句意不变 Kitty is my sister 对画线提问 Kitty是画线的 任何同一种四边形都能够进行平面镶嵌吗 ------- 目前非美元与人民币汇率的波动幅度为中国人民银行公布的该货币当日交易中间价的多少?进行提问 “任意四边形都可以密铺”这句话对吗? I,you and he are all teachers.其中有哪处错误?怎么改? The dress,________ a flower on it,is very beautiful. 任意四边形都可以密铺吗 生命生命杏林子题目用了2个生命会不会重复 苹果含维生素C吗?或含那些维生素? 每2个参加宴会的人见面时握一次手,N个人握了几次 以“生命价值”这个词为题目写一段话 【注】:讲起来只需2、3分钟就行,写的好的加分, Mrs white (have)a beautiful dress 的水母、海带,陆地上的蜥蜴、小草等 生物细胞中含量最多的是 正八边形和正四边形在镶嵌时需()个正八边形和()个正四边形 The beautiful dress cost her(100yuan)(把括号里的单词进行提问) 初中生物学里有哪些海洋下的食物?例:海带请说出这些的名字, 日本创意小商品 别针收纳箱美共和党参议员计划推迟耶伦的美联储主美华裔家庭母子5人惨遭凶杀 凶手系孩西班牙巴塞罗那发生列车脱轨事故 造成美国旧金山湾区万圣节前多起驾车枪击 一名联合国维和人员在刚果(金)丧生安哥拉中国商会开讲中华礼仪墨西哥石油公司前三季度出现巨额亏损昆西·琼斯向杰克逊信托人索赔6080人民日报谈地方债怪相:地方欠债越多官新疆集中查处多名干部 原库尔勒市市长槟榔陷“致癌”漩涡行业临危机 医生:16岁伴娘婚礼上遭多人扒光摸遍全身(记者调查:中国游客满意度,柬埔寨为何格林斯潘新书反思金融危机:我为何没能为何中美趋同反而滋生冲突?日本佐贺县秋季祭孔英媒:中国首支核潜艇部队在海上巡逻以色列拟释放第二批26名长期关押巴勒多地密集推高考改革 十年寒窗学数学只安倍称不容中国“武力崛起” 外媒称中邯郸市荀子研究会举办第二届大会石市检察院启动2015春雨行动 奔赴约旦国王对飞行员遇害表示十分悲痛国际油价3日大幅上涨环卫女工守护结冰路面7小时香港拟建边境购物城分流内地购物客流(省委农村工作会电视电话会议召开为女孩寻找生的希望 联动全国搜索救命成都市人民代表大会常务委员会关于促进看亚足联如何拯救危局国办公布修订后的《国家突发环境事件应省市老年摄影家协会举办迎春联谊会全省春运预计铁路发送旅客1300万人乘公交碰伤眉骨手腕索赔400万 法院拓宽群众增收途径 增强“输血造血”功上海绿地申花宣布签下卡希尔我国网民达6.49亿 人均每周上网2三河街道:生态画笔绘就幸福生活二三圈层正逐渐成为全域成都工业产业发循循“善”诱董老师每期推介
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘