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

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

Google Play Game Service详解 不仅提供API更提供后端支持 IBM Power走向Linux,是必然的! 美国国家安全局解密特工培训手册:如何利用谷歌等大众搜索工具搜集保密数据 微软IE10如何保护上网安全(大图) 谷歌无畏苹果的理由:强力的算法和基础设施架构 开发者热议异构统一内存访问技术(hUMA) 千万级并发实现的秘密:内核不是解决方案,而是问题所在! Apache RewriteRule重写规则语法入门 IDC:2013 Q1 Android和iOS出货量占92% WP首超黑莓 传雅虎欲10亿美元收购轻博客网站Tumblr A Beautiful Mess:如何赚男人女人的钱 CSS、JavaScript开发者必备的10款最佳工具 IBM推出API管理平台 抢占API经济市场份额 2013中国云计算榜单之一:15云平台,谁主沉浮? 移动周报:百万壁纸、85后程序媛,我为梦想代言! 电信天翼开放平台:为App开发者免费提供云存储和云主机服务 Google新的Web UI库:Ploymer 研发周报:让开发者高效编程的10个新框架 拯救行将就木的PHP:谷歌为GAE添加PHP支持 PPT集萃(一):10位业内高管分享云计算技术理念与行业趋势 得益于苹果谷歌,未来可穿戴技术市场规模可达500亿美元 雅虎11亿美元押注Tumblr三大因素:用户、社交、内容 Perceptual:英特尔感知计算挑战赛 正式启动 吴义坚:创业去!我用深度神经网络,处理语音识别 浅谈用户体验的“反面模式 可穿戴设备又一站:增强现实眼镜CastAR 数字医疗投资将破纪录 投资人看好这些细分领域 Mayer又下一城:雅虎收购Tumblr推进移动化? 前端开发利器:代码预处理工具Prepros 一个轻量级的JavaScript库:Reactor.js [探讨] 用户体验设计师现在面临怎样的机遇和挑战? 在VB里调用API打开HTML文件 如何使程序运行时隐藏dialog窗口? 关于datawindow脚本内容! AtlReportError问题 Oracle8i Release 8.1.5 原版电子文档(pdf)--- 谁要!!!!! 如何用delphi实现图像网络传输与存储?请高手介绍方法,包括用什么库,通过TCP/IP怎么办? 请教打印问题 一个菜鸟的提问 在BEAN中,System.out.println("yyy")为什么不能输出呀? 局域网接ADSL,如何限制用户上互联网? 如何不安装oracle的客户端用来连接服务器上的oracle数据库 请问哪有VC关于ADO编程的书籍下载? 关于组件的问题? 用DAO连接数据库,在我的机器上运行没问题,但在其它机器上一运行就挂 谁能告我liulee的个人网页地址呀?? 关于在浏览器中直接运行VB程序的问题 十万火急,我遇上两个奇怪的问题。答者重谢。 请问:如何使用toString? 各位,期待已久的简单任务来了!又是100分!(SQL Server 2000) 好累啊,想放弃了,但又无法回头! Java中,Inner class可不可以使用final修饰符? 谁能告我liulee的个人网页地址呀??急 请教如何在程序运行时修改dbgrid控件options属性中的关于多选控制和整行选择的两个属性? 请推荐UNIX方面的书籍 如何使用toString()方法,谢谢 菜鸟系列:一个简单的编译错误,但我不明白!救命啊!!!! 这就是标准?SJ/T11234 SJ/T11235培训纪实 在哪里看我现在linux系统中用的应用软件的版本号?比如wu-ftp sendmail等等! 操作系统版本不同问题 BCB下怎么调用WINDOWS API函数,急 cpu风扇不转的问题…… 游戏开发的高手或者3维建模的高手,是怎样开发人物模型的呢? 今天下午有没有去微软发布会的????马上回答 关于字体问题!请教会者不难者!!!!!!!! 請問怎麼定義小一點得符點數???? ReadFile超时返回什么? 我的机器装了2000server,2000profession 和NT4.0,现在机器空间不够想把nt4.0和2000profession 卸载,请问应该如何进行?? 怎样用PB代码实现在MDI窗口里的 Ctrl + Tab 的功能 ? 如何将静态库加入项目中,有头文件,SETING出也加入,为何说和系统的库重复定义 如何调用非mfc的程序调用mfc下开发的动态连接库, 请问谁有监测图片变化的部分代码?(在线等待) GetCurrentDirectory()?? 用ADo更新图片(bmp,jpg)难道只能将原来的数据记录删除后在添加吗?不能直接更新吗? 请大家帮忙解决一下循环体的问题!!:) 请问oracle 自己带的http server(实际上是apache)如何配置class path 给你100分(OLE) 我在制作一个网络浏览器时遇到一个问题,在线等你的帮助 公司不做软件了,失业了,高兴送分 JNI 中内存管理的问题 ehlib控件的问题,如何在表中的一字段显示一个列表?分可以加,,,在线等 大家帮我 帮忙写一下Na2CO3,NaHCO3,Na3PO4,AlCl3水溶液的电荷守恒,原子守恒,和质子守恒的式子 碳酸钠和碳酸溶液中水的电离程度比较 关于自然界中霜雨露雾的形成,说法错误的是A云中有小水滴,他们是水蒸气升入高空时遇冷液化而成的B雾是漂浮在空气中的大量的水蒸气C露是地面附近的水蒸气液化成的小水珠D霜是空气中的 Na2O和CaO都是碱性氧化物吗?CO和SO3都是酸性氧化物吗? 当光线垂直于水面射入水中,光的传播方向是什么,折射角为多少度,在折射现象中光路是什么的光的传播方向变吗在折射现象中光路是可逆的吗 光从空气中射入斜射入另一种介质中,入射光线会发生偏折,入射角大于折射角. 如果光从空气中射入真空中,入射角是不是会小于折射角.入射角和折射角的关系和介质的密度有没有关系?(请详 每天早上最好的锻炼时间是几点男生 当光线从空气中射入水中,光的传播方向会发生改变,这就是光的折射现象.(前面的都是废话,与题目无关)问题:图中的∠1和∠2是对顶角吗(这个我知道)试比较∠1与∠2大小.(∠1大∠2小 盛过石灰水的试剂瓶内壁有一层白膜,形成白膜原因? SO3+CaO=CaSO3是什么性质?有一瓶无色透明的溶液,可能含有KCL,CacL2,Na2CO3,CuCl2,NaNO3五种盐或其中的一种或几种,取一部分溶液放在试管中,加入组量的BaCl2容易,结果有白色沉淀析出,将沉淀过滤,向过 当光线从空气射入水中时,光的传播的方向发生了改变,这就是折射现象.图中∠1=∠ 长期存放石灰水的试剂瓶内壁上往往形成一层不溶于水的白色物质,要洗去该物质可选用A 水 B纯碱溶液 C洗衣粉 D稀盐酸 人在水中向前的速度与阻力的关系是怎样的,一般游泳的人会再水中受到多大阻力? 早上和晚上那个时间锻炼最好? 当光线从空气中射入水中,光的传播方向会发生改变,这就是光的折射现象∠1=43°,∠2=108°,试问光的传播方向改变了多少度?写错了,∠2=27° 什么时候的空气最新鲜? CAO的pH值是多少? 长期存放石灰水的试剂瓶壁有一层白色的固体物质,它是( ),形成白色固体的 化学方程式为( );清洗长期存放石灰水的试剂瓶壁有一层白色的固体物质,它是( 形成白色固体的 化学方程式为( ) 什么时辰空气最新鲜 早上几点钟为最好的锻炼时间? 盛放石灰水的试剂瓶放置时间长了,在瓶口会形成一些白色粉末.用化学方程式如何表示?(急) 早晨什么时间空气最新鲜? 有一种和其他物质不同 CaO SO3 Fe2O3 FeO 盛放石灰水的试剂瓶放置了,瓶口会形成一些白色粉末少打字了,"放置久了" 早晨什么时间空气最新鲜呢? 正能量有哪些?就比如;让座、捐款、义卖、【还有什么?【方便的话给我一篇正能量的作文!要自己做的正能量!不是自己身边】 长期盛放石灰水的试剂瓶壁上有一层白色固体物质,它是—— 澄清石灰水变浑浊后生成的新物质是______的沉淀和_______ 下面四种溶液中,CH3COONa,NaHCO3,Na2CO3,NaClO.水的电离程度最大的是? 长期存放石灰水的玻璃试剂瓶内壁有一层白色物质,它是?形成原因是【用化学方程式表示】? 为什么说二氧化碳通入石灰水后“变浑浊”比“生成白色沉淀”恰当? NA2CO3溶液中水电离产生的H离子浓度当PH=9时 在盛满三分之二水的杯子里放入5克盐,再放入鸡蛋,为什么鸡蛋会浮起来? 澄清石灰水通入二氧化碳后溶液变浑浊,生成()色的()沉淀 同样的向外辐射热的时间,为什么空气的温度比草的高,是根据什么原理 重100牛的水可以产生多大的浮力 有一包白色固体粉末A,加入Hcl生成气体B和白色沉淀,把B通入澄清石灰水,澄清石灰水变浑浊.往白色沉淀中滴加HCL,沉淀不消失.A、B、白色沉淀是什么物质 说明理由 电流击穿空气时能产生多高的温度? 盛装有石灰水的试剂瓶,日久内壁会附着一层白色固体,要想清洗掉这层白色固体,常用的试剂是A用水洗 B热的纯碱溶液 C稀硫酸 D稀盐酸 除了二氧化碳,澄清石灰水和什么生成沉淀这个气体要对自然界生命活动至关重要,问铜和二氧化碳高温反应吗,如果不反应,那么红色金属单质和二氧化碳反应生成碳或一氧化碳,红色金属 求正能量 盛放石灰水的试剂瓶内壁会有一圈白色物质,这是应为什么?宜用什么清洗?CaCO3是什么 为什么我老是梦到我自己在海中央游泳?沉入海底,后来又游出水面了? 我身边的正能量 征文400字左右 久置的装石灰水的试剂瓶用盐酸清洗化学方程式 物体在水里受到的浮力和压力一样吗? 谁能给我些正能量啊?我希望每天能量满满的活着 盛石灰水的试剂瓶壁上的白膜用盐酸清除的化学方程式 水沉底后有没有受到浮力?为什么?怎么样才算没有浮力.怎样才是?---具体. 水结冰体积变大会产生什么危害?水结冰体积变大这种现象会产生什么危害?越快越好噢!^=^ 水结冰时——体积如何变化? 一个球体再充满水的土里的浮力,跟在水里的浮力一样么? 水结冰体积变大有什么危害 实验室放石灰水的瓶中常有不溶于水的CaCO3,可加 除去,化学方程式为 物质的量浓度相等的Na2CO3和NaHCO3溶液等体积混合后的溶液中,物料守恒物料守衡2NA+=3CO3-+3HCO3-+3H2CO3 这是怎么得出来的? Na2co3溶液中水电离的氢离子个数为什么大于Nahco3同体积同物质的量 注意是氢离子个数 解释自然界中:雨 云 雪 露 雾 霜的形成依次是 na2co3 nahco3 混合溶液中的电荷守恒式 水结冰,体积变大,有什么危害? 自然界中“霜”、“雾”、“露”是怎样形成的,它们的形成过程有什么不同?
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘