2022年API教程 .pdf

上传人:Che****ry 文档编号:27261833 上传时间:2022-07-23 格式:PDF 页数:8 大小:73.84KB
返回 下载 相关 举报
2022年API教程 .pdf_第1页
第1页 / 共8页
2022年API教程 .pdf_第2页
第2页 / 共8页
点击查看更多>>
资源描述

《2022年API教程 .pdf》由会员分享,可在线阅读,更多相关《2022年API教程 .pdf(8页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、一、 API 的类型结构。 API 的类型结构与VB 中差不多,一般声明时使用Type 定义类型。如果你不懂的话麻烦你先打开你的VB 入门教程书看看。好了,文字理论咋不多说,用实例证实理论(偶喜欢这句话)。 1,在 Form 窗体上用API 画文字,最初了解类型结构填充 Private Declare Function DrawText Lib user32 Alias DrawTextA (ByVal hdc As Long, ByVal lpStr As String, ByVal nCount As Long, lpRect As RECT, ByVal wFormat As Long)

2、 As Long Private Const DT_CENTER = &H1 Private Type RECT Left As Long Top As Long Right As Long Bottom As Long End Type Private Sub Form_Load() Dim lpRect As RECT Me.AutoRedraw = True Me.ScaleMode = 3 填充结构 With lpRect .Left = 0 .Top = 0 .Right = Me.ScaleWidth .Bottom = Me.ScaleHeight End With DrawTe

3、xt Me.hdc, 这是文字效果 , -1, lpRect, DT_CENTER End Sub 好了,咱们开始分析,首先看Form_Load 里面的代码。 Dim lpRect As RECT。这一句是声明一个RECT 自定义类型,这个类型可在VB 浏览器的类型中找到。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 8 页 - - - - - - - - - Me.AutoRedraw = True。这一句其实就是设置当前窗体的AutoRedraw 属性,设为True

4、,表示持久输出图像。不懂查帮助。 Me.ScaleMode = 3 。设置当前窗体的像素模式。至于为啥要设置为3,下面将会讲到。 With lpRect.End With 。从 With 到 End With 为填充咱们声明的lpRect 类型结构。具体看里面的。 .Left=0 。这里相当于x 坐标的初始值。 .Top=0。这里相当于y 坐标的初始值。 .Right = Me.ScaleWidth 。Right 表示从 Left 开始的宽度。这里赋值为Me.ScaleWidth表示当前窗体像素的宽度。 .Bottom = Me.ScaleHeight 。同上。 Bottom 表示从 Top

5、开始的高度。Me.ScaleHeight表示当前窗体像素的高度。关键的就是下面一句,是它帮助我们在窗体中画出文字的。这里说一下为什么需要把当前窗体的坐标度量单位(ScaleMode)改成 3(Pixel 像素) ,因为 Windows 不管画什么都是以像素为单位,所以我们为了确定咱们所画的文本显示在正常位置,就必须使用像素为单位!明白了么?(问:还是不明白?答:默默无语两眼泪啊) DrawText Me.hdc, 这是文字效果, -1, lpRect, DT_CENTER 现在分析这条API。看看里面需要传入的参数:ByVal hdc As Long, ByVal lpStr As Strin

6、g, ByVal nCount As Long, lpRect As RECT, ByVal wFormat As Long ByVal hdc As Long 。hdc 为 Long 整形,所以应该传入数值,不过给大家一个技巧,以后凡是看到hdc 这个变量字符,表示需要传入的为一个hdc 句柄,注意可不是hwnd 句柄哦!这个句柄窗体和Picture 控件都有,大家注意看就是了。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 8 页 - - - - - - - - -

7、ByVal lpStr As String 。传入字符串。这里就是咱们需要画到窗体上的文本。 ByVal nCount As Long。传入数值。看看里面的声明字符nCount,可以看出来这与数目有关, 与什么数目呢?当然是文本罗。也就是说要显示的字符个数,一般如果需要全部显示出来可设为1即可,表示显示所有字符。 lpRect As RECT。一个 Rect 类型,这里需要使用Rect 类型,上面我们已经在API浏览器找到了这个类型并声明了,所以只需要传入相应的类型声明就可以了。不过这次与我上一次讲的有所不同,上次是通过API 类型结构获取相关的信息,而这次需要你把API 类型结构填充好以后再

8、传入进去。希望大家在这里注意下。可能有人要问了,那为什么这次就要这么做?我的回答是:因为API 并不是万能的和灵活的,有的时候需要我们人为的设置一些参数来完成自己所需要这个API 的功能,大家可以通过上面的结构填充就可知道,我们所要画文本的整个范围就是整个Form 窗体的范围啊! ByVal wFormat As Long 。传入数值,不过可以看看nFormat 声明字符,可以想像这里可能需要传入这个API 的使用格式,就如我们前面所讲的那样。现在打开API 浏览器,在常数中找找,输入这个API 的开头, Draw(D)Text(T)=DT_,可以看到有很多吧。具体这些都是什么意思可以查查相关

9、的API 资料。这里我们只传入了一个DT_CENTER 常数,意思是居中显示。 默认可以为0,因为这里为文字显示格式,所以你什么格式也不想要的话可设为 0 以后文字显示在左上角。 OK 。F5 运行之。 。窗体中间正常显示“ 这就是文字效果” 的几个文字。至此这里API 相关结构的填充与获取我不想再多说了,不懂的话建议把我以前发的API 入门帖子与这里的第一小节一起看看,或许你会明白些什么? 二、 Windows 消息可以说这节是本文中的重点,当你能理解该节中的所有内容时,我相信你已经可以用该方法写出不错的程序功能了,好了,不说多了,接着往下来看。在了解消息之前,先让我们看看Windows 消

10、息到底是什么? Windows 系统是一个消息驱动的OS,所以操作都是基本消息驱动的,这就好比我名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 8 页 - - - - - - - - - 用 鼠 标 按 下 一 个 按 钮 , 这 时Windows会 先 发 送 该 鼠 标 的 左 键 按 下 消 息 , 也 就 是WM_LBUTTONDOWN到 你 按 下 的 那 个CommandButton, 这 时 就 会 激 发 按 钮 的CommandButton_MouseD

11、own 事件 ,然后松开鼠标,Windows 这时会发送WM_LBUTTONUP消息,激发CommandButton_MouseUp事件,说明该鼠标按键已经弹起(松开),这时就会激发咱们VB 中的CommandButton_Click 事件,所以你点击某个按钮以后就会执行相应的操作。这里我不想说得太深太复杂,只是想以这种简单的理解方式让你明白Windows 消息到底是什么,也许说得太含糊,但是对你第一次理解这东西已经足够了!实践 1:现在就让我们以消息来写一个入门程序,先是打开VB(问:废话。答: ) ,然后打开 API 浏览器(问:早打开了。答: ) ,然后在API 浏览器找到SendMes

12、sage ,再然后在API 常数中找到WM_CLOSE ,好了,在VB 工程中新建一个标准EXE,添加一个 Command1 按钮,写入以下代码: Private Declare Function SendMessage Lib user32 Alias SendMessageA (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long Private Const WM_CLOSE = &H10 Private Sub Command1_Click() SendMessage Me

13、.hwnd, WM_CLOSE, 0, ByVal 0& End Sub 好了,先看看SendMessage 这个 API,第一个参数,hWnd 为 Long,所以传入一个对象的句柄,第二个参数wMsg 同样为Long,这里要说一下,在该API 的第二个参数,大多数都是传入以WM_ 为开关的常数,希望大家注意!第三个wParam 也是Long,该参数的意思大多数是取决于第二个参数uMsg ,这里传入的常数是WM_CLOSE, 所以这里输入0 即可,最后一个参数,lParam 为 Any,Any 是什么意思这里我说一下,也就是说该参数可以指定为任何标准数据类型,允许将任意数据类型传递给该参数!希

14、望你明白, 该参数的值也是取决于uMsg。再看看Command1_Click 事件中的代码, 其中使用了SendMessage API,第一个是当前的窗口句柄, 至于什么是句柄我在API 初级入门时讲过, 第二个为WM_CLOSE 常数消息,也就是说给当前窗口发送关闭消息,第三、四个参数分别为0,具体参数我已经说过,取决于你在uMsg 传入的常数。现在F5 运行点击Command1 按钮试试。小提示: 注意这里的句柄当然也可以输入其它窗口的句柄,执行效果同上面一样,可以关闭名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心

15、整理 - - - - - - - 第 4 页,共 8 页 - - - - - - - - - 你传递的那个句柄窗口!自己试一下,具体怎么获取窗口句柄我在VB 初级入门时讲过,自己去试试吧! ! !实践 2:现在我们开始第二个消息程序,还是使用SendMessage ,这次我们是要给一个按钮传递Click (点击)事件,最近貌似有些人在问这个问题?现在就写出来大家实践实践。新 建 一 个 标 准EXE , 添 加 两 个CommandButton 控 件 , 分 别 为Command1 和Command2 ,然后输入以下代码: Private Declare Function SendMessa

16、ge Lib user32 Alias SendMessageA (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long Private Const BM_CLICK = &HF5 Private Sub Command1_Click() SendMessage Command2.hwnd, BM_CLICK, 0, ByVal 0& End Sub Private Sub Command2_Click() MsgBox command2 End Sub 这里先看看BM_CLIC

17、K 常数,这个常数好像在VB 自带的API 浏览器中没有,所以大家可以把该常数自行复制到各自的VB 程序中, 也可以新建一个记事本保存下来,也可以把它添加到VB 的 API 浏览器文本中等等。再来看看Command1_Click 事件,可见调用了SendMessage API 向 Command2 中发送了BM_CLICK 消息,该消息为按钮点击消息,后面的参数取决于wMsg, 所以后面两个为 0 即可,现在说一个为什么最后一个参数是写成Byval 0& ,写成这样的原因主要是因为最后一个参数变量,大家可以看看最后的参数变量lParam As Any ,Any 是什么意思我已经说过, 0& 后

18、面的& 其实为Long 的简写,说白了& 就是Long 的意思,当然你可以在你程序写在Dim ABC& 声明一个Long 类型 ,而 Byval 0& 代表着是以传值方式进行传递该参数。不明白意思不要紧,翻开你的VB 书多看看过程这章。最后一个Command2_Click 的 MsgBox command2 自然是显示一个消息。好了, F5 运行试试。小提示:同样该hWnd 参数可以传递其它按钮句柄,实现效果同上面一样。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 8

19、页 - - - - - - - - - 现在让我们看看GetWindowLong 和 SetWindowLong 这两个 “ 超级 ”API ,为什么说超级呢?因为我们实现子类化少不了它们啊!基于 vb 的 ocx 和 dll 属性 ,代码论文重用性直接调用这个api 吧。今天开始,我向大家讲有关API 的是实质性内容。我们就从句柄 开始。只要你来到了API 的世界,经常碰到的问题之一就是句柄。那么究竟什么是句柄呢? 如果你从来都没有听说过句柄 这个词, 可能首先觉得句柄当中有很多内容。其实不然,所谓句柄实际上是一个数据,是一个Long (整长型 )的数据。在API 中,它经常是以一个参数的形

20、式传递给各种API 函数。如 : Public Declare Function GetWindow& Lib user32 (ByVal hwnd As Long, ByVal wCmd As Long) 其中, hwnd 就是句柄。在VB 里,句柄是一种属性,您打开VB 中的对象游览器看一看Form 窗体或者 PictureBox 控件等究竟有没有hwnd 属性。 是有的。 VB 中的解释是这样的Microsoft Windows 运行环境,通过给应用程序中的每个窗体和控件分配一个句柄(或hWnd)来标识它们。 hWnd 属性用于Windows API 调用。 许多 Windows 运行环

21、境函数需要活动窗口的hWnd 作为参数。如果想更透彻一点地认识句柄,我可以告诉大家, 句柄是一种指向指针的指针。我们知道,所谓指针是一种内存地址。应用程序启动后,组成这个程序的各对象是住留在内的。如果简单地理解, 似乎我们只要获知这个内存的首地址,那么就可以随时用这个地址访问对象。但是,如果您真的这样认为,那么您就大错特错了。我们知道, Windows 是一个以虚拟内存为基础的操作系统。在这种系统环境下,Windows 内存管理器经常在内存中来回移动对象,依此来满足各种应用程序的内存需要。对象被移动意味着它的地址变化了。如果地址总是如此变化,我们该到哪里去找该对象呢? 为了解决这个问题,Win

22、dows 操作系统为各应用程序腾出一些内存储地址,用来专门登记各应用对象在内存中的地址变化,而这个地址(存储单元的位置)本身是不变的。Windows内存管理器在移动对象在内存中的位置后,把对象新的地址告知这个句柄地址来保存。这样我们只需记住这个句柄地址就可以间接地知道对象具体在内存中的哪个位置。这个地址是在对象装载 (Load)时由系统分配给的,当系统卸载时 (Unload) 又释放给系统。 句柄地址 (稳定 ) 记载着对象在内存中的地址 对象在内存中的地址(不稳定 ) 实际对象但是,必须注意的是程序每次从新启动,系统不能保证分配给这个程序的句柄还是原来的那个句柄, 而且绝大多数情况的确不一样

23、的。假如我们把进入电影院看电影看成是一个应用程序的启动运行,那么系统给应用程序分配的句柄总是不一样,这和每次电影院售给我们的门票总是不同的一个座位是一样的道理。在 VB 中获得一个对象的句柄十分简单,如要获取Form1 窗体的句柄,就可以这样写名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 8 页 - - - - - - - - - Form1.Hwnd 对象的句柄还可以通过API 函数来获得,如GetActiveWindow 返回位于最顶部的具有输入焦点的窗口句柄Get

24、Focus 获得当前线程里补获鼠标输入的窗口句柄GetForegroundWindow 从位于前台的线程里返回活动窗口的句柄GetCursor 取得当前指针的句柄GetDesktopWindow 获取整个桌面的句柄GetWindow 获得一个窗口的句柄,该窗口与某源窗口有特定的关系以上函数说明均可在WinAPI.hlp 文件中找到。 本教程提供了演示例程 play1.vbp ,正是为了说明这些函数的具体用法的。程序运行后,用鼠标做一些任何你想做的事情,并观察各项目数据的变化。通过本程序,注意观察以下几点1.线程内与线程外。(VB 不支持多线程 )。其他应用程序对此程序来说都是线程外。2.在 w

25、indows95 操作系统下,各个窗体(包括一些控件,如文本框,图片框等,MICROSORT对它们均统称为窗体)拥有各自的鼠标指针。这和win16 下各应用程序使用同样一个指针是截然不同的。3.每次从新启动,各窗体的句柄都有所变化。Text5 的装载和卸载过程中,句柄始终是在变化着的。这说明了上面提的影院售门票中存在的现象是真实的。获得对象句柄的函数还有很多,以后碰到它们时再介绍给大家想请教个问题,我如何知道其它窗体上的一个控件句柄,比如我做的程序只有FORM1 窗口,现在我想在已经运行的程序如FORM2 窗口上的 TEXT1传入“你好”信息,该怎么做?这次我专门为你开一个小灶, 这是第一次

26、, 不过也是最后一次! 好了 , 现在让我们看看如何向其它窗口的文本框传入字符串. 还是老样子 , 新建一个标准EXE,接着新建两个Form 窗体 ,分别为 Form1 和 Form2 ,现在我们在 Form1 中添加一个 CommandButton 按钮 , 然后再在Form2 中添加一个 TextBox 文本控件和一个 CommandButton 按钮控件 , 现在在 Form1 中写入以下代码: Private Declare Function SendMessage Lib user32 Alias SendMessageA (ByVal hwnd As Long, ByVal wMs

27、g As Long, ByVal wParam As Long, lParam As Any) As Long Private Const WM_SETTEXT = &HC Private Sub Command1_Click() SendMessage Form2.Text1.hwnd, WM_SETTEXT, 0, ByVal abcdefg SendMessage Form2.Command1.hwnd, WM_SETTEXT, 0, ByVal hehe 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 -

28、- - - - - - 第 7 页,共 8 页 - - - - - - - - - End Sub Private Sub Form_Load() Form2.Show End Sub 其它的我不再分析了,大家注意看就是了,现在让我们看看 WM_SETTEXT 这个常数, 该常数所代表的意思是向某对象发送设置文本消息,具体可以参考MSDN ,其它的参数还是老样子,第一个是对象句柄(也可以说控件句柄),第二个是你给某某对象发的消息,第三个wParam 参数我上面说过,以 wMsg 的值为定,这里保留为 0, 现在关键是看看最后一个,lParam ,该参数为一个 Any 类型, 也就是说我们可以传

29、递任何值给任何对象,也就是说我们 wMsg 参数传递的为 WM_SETTEXT 消息,第三个参数为 Long 长整形, 所以无法传递字符串,只能看最后一个,而恰好最好一个是可以传递任何类型的参数,所以这里就把我们需要传递的字符串输入即可,注意 lParam 是缺省 ByRef 传递的, ByRef 与 Byval 不同的是,ByRef 是以地址传递, 而 Byval 是以参数值传递, 所以你把上面的 Byval 去掉看看会产生什么后果?也就是说你传递的字符是一个地址,但是地址必须是整形,所以你去掉以后将会发生重大问题,不信自己试试!轻则达不到预想的效果,重则 VB IDE(编程环境)直接崩溃!好了, F5 运行试试,希望这下大家能明白其中的原因,下面将不会再多说!名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 8 页 - - - - - - - - -

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 高考资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁