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

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

VB如何让Window不接受键盘输入及Mouse Click VB如何让程序拥有多个热键? VB如何让用户自行输入方程式,并计算其结果? VB如何使程序不在Ctrl+Alt+Del弹出的对话框内? VB如何使用 VB 编写自动反安装的程序? VB如何用VB建立快捷方式 VB如何用VB在桌面建立快捷方式 VB如何在 VB 中控制 Modem 行为? VB如何在VB中判断Windows9x的运行模式 VB如何在Visual Basic中实现异步执行程序 VB如何在开机时自动更换墙纸? 使回车具有 Tab 的功能-VB资料 输入时,自动转换成小写? -VB资料 显示多媒体信息 -VB资料 也谈Windows 下的自动存盘 -VB资料 一个小巧精致的CPU监视器 -VB资料 应用VB4.0实现工业控制的实时曲线和历史曲线 应用程序中实现关机功能-VB资料 萤幕抓取与萤幕保护程式 -VB资料 用VB5.0创建Windows快捷方式 用VB5.0收集键盘和鼠标信息 用VBA限制非注册软件使用时间 用VB编程检测当前电池使用情况 用VB编写定时关闭计算机的程序 用VB编写键盘拦截程序 用VB函数轻松访问系统注册表 用VB设计一个定时闹钟程序 用VB实现拖放功能 在VB中启动控制面板 在VB中异步执行程序 在Visual Basic中终止Windows 95 求助: 怎样获得系统当前可用的字体? 如何打印FormView? 如果你是VC高手,对COM有深入了解,欢迎! 我今天看了我英语过级的公布成绩,我得了一个天险数字60。5分,请问。。。。。? 谁有linux下的mod_webapp.so DW UltraDev里rs.source="select * from stu where banci=request.QueryString("banci")这样是不是不行? Microsoft JDK nmake生成的EXE文件反编译问题!!! 各位大虾:请问谁能告诉我哪里能找到win xp home edition plus???如果能让我找到,送1000分 请问如何将PaintBox.Canvas的当前内容保存至内存, Linux下c语言程序该怎样运行? 请问:vb.net中oracle数据库能否支持blob格式? .ceb文件如何打开? 什么地方能够找到《Exploring Requiremengs:Quality Before Design》这本书? 关于制作一个classwizard的设计思路,欢迎大家讨论 weblogic server console: java.lang.NullpointerException 如何得到本局域网上所有主机的ip? 请问: 如果在网上可以通过网页上传某些文件到服务器空间上,并显示一些关于上传文件的信息~ 一段检测光软驱的程序,大家帮忙除Bug! 为何会死机? 高分放送,木马病毒求救! tomcat下的分布怎么做? 各位使用手机的老鸟,2000左右的手机什么牌子的好 喜欢硬件朋友请进来看看。 如何复原被Linux改写的引导扇区呢 请问各位大虾,怎样将c++同数据库结合起来 大哥......你继续看!!!??? 喜欢硬件朋友请进来看看。 在哪里调用方法?是在cpp文件还是在.h文件里? 初学者关于显示的问题? depunf朋友,您好,stringgrid那里有delete啊?敬请赐教! formula one报表打印问题 d3d头文件的错误? 执行了insert语句之后我怎么得到刚刚插入的id值啊?快快,在线等待 为什么找不到服务器? 如何禁止用户调整窗体大小?但最大化、最小化和关闭按钮仍在。 各位: 如何让系统认识带小数的字体如:7.5? 没有经验,请有实际经验的朋友回答:) 请问pb8.0+sqlserver2000怎么配置数据源!(sqlserver2000与asa7.0连接数据库时有什么不一样!) 光盘能装超过700MB的数据吗? 考程序员要考的内容? 100分呀,哪里有钱能的C++电子书下载? 同学的一台电脑,放mp3有声音,但是放mtv却没有了声音,是怎么回事? 在线等待,我的excel密码忘了,长度大约为6个到8个,请大家帮帮忙 请问,我在使用Excel制作表格的时候,有一项需要输入身份证号码。可是填入18位身份证号码后,一换行,号码的后3位会自动变为000。请大家 请教如何处理JSP网页中的路径问题? SQL 中如何与用户交互? 如何把参数传到框架页中的子页(aspx页)? google怎么了?~我这几天一直都不能访问,我重装了系统,不知道是不是这个原因。谢谢了^_^ About RowMoved 40分,只要一个类似XP菜单的插件,请帮忙? 请教高手gcc/g++、dev c++是干什么的? 松柏的特点? 教育人类认为,教育具有文化的多种功能,其中本质的功能是什么? A加油站标价5元每升,B加油站标价5元每千克,由计算说明应选择哪里加油?那啥、因为时间紧急.快点把、先不赏.答完再赏. 人体当中有多少种生物酶? 草履虫的营养方式是什么? 填写从古至今信息传递方式的主要发展历程,并写出自己的感受古代:近代:现代:当代:通过以上信息传递方式的比较,我的感受是: 什么是酵素?酵素对人体有什么好吃? 关于草履虫的生物论文,600字左右 从古至今信息传递方式的变化. 世界上寿命最长的动物是什么 描述大自然中一种动物或植物的感人故事 今天之内 举例说明信息传递的发展给我们生活带来的影响 河豚鱼」哪个部位是有毒的?jpt 加油站如何使用计量桶测量发油误差? 那种细胞置于水中会破裂?a 洋葱表皮 b 人的口腔上皮细胞c 草履虫 d 黄瓜果肉细胞. 历史上有什么人物具有松柏的品质 河豚的什么部位有毒? 加油站计算油高我就知道在收银机上查出量,然后查表做油高,我会查表,具体一点 柏树的精神是什么 人,动物,植物与大自然的关系是怎么样的?6年级寒假作业上的急! 有没有关于人们救助大自然中的动物或植物的感人故事最好短一点. 松柏具有什么精神? 河豚那个部位有毒 种是生物分类的( ),)和自然( )的产物.同一种类的各个个体具有( )的遗传性状. 松柏有什么品质? 河豚的哪个部位有毒 生物遗传计算题:二倍体结球甘蓝的叶子有紫色和绿色两种,该性状的遗传与两对等位基因有关.二倍体结球甘蓝的叶子有紫色和绿色两种,该性状的遗传与两对等位基因有关.为探究二倍体结球 植物细胞的叶绿体内哪种色素进行能量转化?简要说明一下 河豚的毒在哪些部位 月亮上有没有动物和植物? 河豚吃什么河豚鱼会吃其他的热带鱼吗? 为什么冬天的柏树是绿的? 月宫上有什么动物 河豚可以吃吗?对身体有什么危害吗? 为什么冬天的柏树是绿的?3Q 湿垃圾干垃圾每天产生量可以的话告诉我一个问题:湿垃圾和干垃圾的每天在你家产生的量是多少?(千克,暑假生活15页,一个星期哦!)我实在不好写,求求大家帮帮忙!格式如下:日期: 河豚鱼怎么吃啊?朋友送给我了一条河豚,现在还或者呢..炸着吃可以么? 青少年网络文明公约 月宫中有什么动物 河豚怎么吃 怎么计算空间站寿命?或者说发送到太空中的空间站是有哪些方面影响到它的寿命? 就女人会月金?有什么动物会吗 柏树的外形特征,作用是什么急 俄罗斯“和平号”空间站寿命15年 国际空间站工作寿命为15~20年 中国空间站? 铁矿采选行业 废水产生量怎么计算 柏树的外形特征 人体内氧气浓度最低的地方是 月亮对动物的影响求月亮对动物的种种影响,不管什么动物都可以……满月新月都行……TAT,拜托了亲们,妖在线等 请从哲学的角度看网络文化不用多,三四行字(约50字)就行. 关于和平号空间站的设计寿命,下列说法中哪一种是正确的 草履虫等单细胞生物是怎样繁殖下一代的? 柏树的特点有哪些 人体内氧浓度最大的是?A 肺泡里 B组织细胞里 C肺部毛细血管内 D 心脏内 应该是B 脱硫化学蝶阀 D71X-16C DN50 这型号中的字母个代表什么意思? 松柏特点松柏的特点,要有体会 蒙古包的 作用 材料 结构 和文化特征 草履虫常用什么方式繁殖 在我国青少年中发展积极向上的网络文化蕴含了哪些哲学思想 北京四合院的位置,作用,材料,结构,文化特征 急 明天要用啊 加油站不给日本车加油?
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘