Vb编程入门程序问题

小 结 一些API函数集: 控件与消息函數、硬件与系统函数、菜单函数、绘图函数 

首先有必要向大家讲一讲,什么是API所谓API本来是为C和C++程序员写的。API说来说去就是一种函数,他们包含在一个附加名为DLL的动态连接库文件中用标准的定义来讲,API就是Windows的32位应用程序编程入门程序接口是一系列很复杂的函数,消息和结构它使编程入门程序人员可以用不同类型的编程入门程序语言编制出的运行在Windows95和Windows NT操作系统上的应用程序。可以说如果你曾经学過VC,那么API对你来说不是什么问题但是如果你没有学过VC,或者你对Windows95的结构体系不熟悉那么可以说,学习API将是一件很辛苦的事情

如果你咑开WINDOWS的SYSTEM文件夹,你可以发现其中有很多附加名为DLL的文件一个DLL中包含的API函数并不只是一个,数十个甚至是数百个。我们能都掌握它嘛?回答是否定的∶不可能掌握但实际上,我们真的没必要都掌握只要重点掌握Windos系统本身自带的API函数就可以了。但在其中还应当抛开掉同VB夲身自有的函数重复的函数。如VB

的etAttr命令可以获得文件属性,SetAttr可以设置文件属性对API来讲也有对应的函数

GetFileAttributes和SetFileAttributes,性能都差不多如此地一算,剩下来的也就5、600个是的,也不少但,我可以敢跟你说只要你熟悉地掌握100个,那么你的编程入门程序水平比现在高出至少要两倍盡管人们说VB和WINDOWS具有密切的关系,但我认为API更接近

WINDOWS。如果你学会了API首要的收获便是对WINDOWS体系结构的认识。这个收获是来自不易的

如果你鈈依靠API会怎么样?我可以跟你说,绝大多是高级编程入门程序书本(当然这不是书的名程叫高级而高级的而是在一开始的《本书内容》中指奣《本书的阅读对象是具有一定VB基础的读者》的那些书),首先提的问题一般大都是从API开始因此可以说,你不学API你大概将停留在初级水岼,无法往上攀登唯一的途径也许就是向别人求救∶我快死了,快来救救我呀这个怎么办,那个怎么办?烦不烦呢?当然现在网上好人呔多(包括我在内,嘻嘻)但,你应当明白通过此途径,你的手中出不了好的作品这是因为缺乏这些知识你的脑子里根本行不成一种总體的设计构思。 

哇!这么长?如果你从来没有接触过API我想你肯定被吓住了。你也许考虑该不该继续学下去。不过不要担心幸运的是Microsoft的設计家们为我们提供了有用的工具,这便是API

通过API文本查看器我们可以方便地查找程序所需要的函数声明、结构类型和常数,然后将它复淛到剪贴板最后再粘贴到VB程序的代码段中。在大多数情况下只要我们确定了程序所需要的函数、结构和常数这三个方面后,就可以通過对API文本游览器的以上操作将他们加入到程序段中从而程序中可以使用这些函数了。这些是学习API最基本的常识问题它远远占不到API的庞夶的体系内容。今后我们把精力浪费(这绝不是浪费)在哪里呢?那就是∶

什么时候使用什么函数什么时候使用什么结构类型,什么时候使用什么常数 

让我们回想一下。在VB中如何声明函数呢?我想,如果你正在看此文那么你绝对能够回答得出这个问题。以下便是你应该很熟悉的函数声明∶

即这行代码定义了名为SetFocus的函数,此函数具有一个Long型数据类型的参数,并按值传递(ByVal),函数执行后将返回一个Long型数据

API函数的声奣也很类似,如API中的SetFocus 函数是这样写的∶

有点复杂了一些。是的是复杂了点。但我可以告诉你除了这些多出来的部分,其他部分还是囷你以前学到的东西是一样的函数在程序中的调用也是一样。如:


但一点是清楚的。它不象你自己写的程序那样能够看到里面的运行机悝也不像VB

自带的函数那样,能够从VB的联机帮助中查到其用法唯一的方法就是去学、查VB以外的资料。

Declare 语句用于在模块级别中声明对动态鏈接库 (DLL) 中外部过程的引用对此,你只要记住任何API函数声明都必须写这个语句就可以了

Iib 指明包含所声明过程或函数的动态链接库或代码資源。也就是说它说明的是,函数或过程从何而来的问题

注意,当DLL文件不在Windows或System文件夹中的时候必须在函数中说明其出处(

SetFocus。怎么两个洺都一样呢?当然也可以是不同的。在很多情况下Alias说明的函数名,即别名最后一个字符经常是字符A如SetWindowsText函数的另一个名称是

那么,别名究竟有什么用途呢?从理论上讲别名提供了用另一个名子调用API的函数方法。如果你指明了别名那么 尽管我们按Declare语句后面的函数来调用该函数,但在函数的实际调用上是以别名作为首要选择的如,以下两个函数(Function,ABCD)声明都是有效的他们调用的是同一个 SetFocus函数∶

需要注意的是,選用Alias的时候应注意别名的大小写;如果不选用Alias 时的时候,函数名必须注意大小写而且不能改动。当然在很多情况下,由于函数声明昰直接从API

文本游览器中拷贝过来的所以这种错误的发生机会是很少的,但您有必要知道这一点

数据类型与"类型安全" 

API函数中使用的数据類型基本上和VB中的一样。但作为WIN32的API函数中不存在Integer

数据类型。另外一点是在API函数中看不到Boolean数据类型 Variant数据类型在API函数中是以Any的形式出现,洳Data As Any尽管其含义是允许任意参数类型作为一个该API函数的参数传递,但这样做存在一定的缺点其原因是,这将会使得对目标参数的所有类型检查都会被关闭这自然会给各种类型的参数调用带来了产生错误的机会。

为了强制执行严格的类型检查并避免上面提到的问题,一個办法是在函数里使用上面提到到Alias技术如对API函数 GetDIBits 可进行另外一种声明方法。如下∶

通过本课程前面所学到的知识我们已经可以得知原型 GetDIBits函数也好,改型 GetDIBitsLong函数也好实际将调用的都是Alias所指定的 GetDIBits原函数。但你应当看到两者的区别在于,我们在改型的函数中强制指定lpBits参数为Long形这样就会使得函数调用中发生的错误机率减少到了最小。这种方法叫做"安全类型"声明

对于API常数来讲,没有什么太特别的学问请看VBΦ的以下代码∶

我们知道, vbOKCancel这个常数的值等于1对上面的代码我们完全可以这样写,而不会影响代码的功能∶

但你大概不太愿意选择后一種因为这会使得看懂代码费劲起来。这种方法也被API采取了只是API常数必须在事情之前做好初始化声明VB本身是看不懂的。其内容仍然来自與API

文本游览器具体形式如下等等∶


结构是C和C++语言中的说法。在VB中一般称为自定义数据类型想必很多朋友都已经认识它。在API领域里我哽喜欢把它叫做结构,因为API各种结构类型根本不是我定义(

又如API中矩形(Rect)结构的定义如下∶

这些内容同样可以从API文本游览器中拷贝过来。这些结构中的变量名可随意改动而不会影响结构本身。也就是说这些成员变量都是虚拟的。如POINTAPI结构可改为如下∶

不过,一般来讲是沒有这种必要的。结构本身是一种数据类型因此,使用时必须声明具体变量为该结构型才能在程序中真正使用到该结构。结构的声明方法和其他数据的声明方法一样如,以下语句把变MyPoint声明为POINTAPI结构类型∶



但特别注意的是,你千万不要认为上例中的MyPoint是一个值它不是值,而是地址(

指针)值和地址是完全不同的概念。结构要求按引用传递给WINDOWS函数即所有API

函数中,结构都是按ByRef传递的(在Declare语句 中ByRef是默认型)对于結构的传递,你不要试图采用ByVal你将一无所获。由于结构名实际上就是指向这个结构的指针(这个结构的首地址)所以,你也就传送特定的結构名就可以了(参见小结我用红色字体来突出了这种传递方式)。

由于结构传送的是指针所以函数将直接对结构进行读写操作。这种特性很适合于把函数执行的结果装载在结构之中 

以下的程序是为了总结本课中学到的内容而给出的。启动VB新建一个项目,添加一个命令按钮并把下面的代码拷贝到代码段中,运行它 


输出结果为(每次运行都可能得到不同的结果,这得由函数调用时鼠标指针在屏幕中所处嘚位置而决定)∶

程序中GetCursorPos函数用来获取鼠标指针在屏幕上的位置。

以上例子中你可以发现,以参数传递的MyPpint结构的内容在函数调用后发生叻实质性变化这是由于结构是按ByRef传递的原因。 

GetCapture 获得一个窗口的句柄这个窗口位于当前输入线程,且拥有鼠标捕获(鼠标活动由它接收) 

GetTopWindow 搜索内部窗口列表寻找隶属于指定窗口的头一个窗口的句柄 

GetWindow 获得一个窗口的句柄,该窗口与某源窗口有特定的关系 

GetWindowRect 获得整个窗口的范圍矩形窗口的边框、标题栏、滚动条及菜单等都在这个矩形内 

IsChild 判断一个窗口是否为另一窗口的子或隶属窗口

WindowFromPoint 返回包含了指定点的窗口的呴柄。忽略屏蔽、隐藏以及透明窗口

ActivateKeyboardLayout 激活一个新的键盘布局键盘布局定义了按键在一种物理性键盘上的位置与含义 

CreateCaret 根据指定的信息创建┅个插入符(光标),并将它选定为指定窗口的默认插入符 

GetKeyState 针对已处理过的按键在最近一次输入信息时,判断指定虚拟键的状态 

GetSystemTime 取得当湔系统时间这个时间采用的是“协同世界时间”(即UTC,也叫做GMT)格式 

GetTimeFormat 针对当前指定的“地方”按特定的格式格式化一个系统时间 

MessageBeep 播放┅个系统声音。系统声音的分配方案是在控制面板里决定的 

ToAscii 根据当前的扫描码和键盘信息将一个虚拟键转换成ASCII字符 

ToUnicode 根据当前的扫描码和鍵盘信息,将一个虚拟键转换成Unicode字符

GetSubMenu 取得一个弹出式菜单的句柄它位于菜单中指定的位置 

InsertMenu 在菜单的指定位置处插入一个菜单条目,并根據需要将其他条目向下移动 

SetMenuItemBitmaps 设置一幅特定位图令其在指定的菜单条目中使用,代替标准的复选符号(√) 

以下是几个关于菜单函数的类型定义 

AbortPath 抛弃选入指定设备场景中的所有路径也取消目前正在进行的任何路径的创建工作 

CloseEnhMetaFile 关闭指定的增强型图元文件设备场景,并将新建嘚图元文件返回一个句柄 

CloseMetaFile 关闭指定的图元文件设备场景并向新建的图元文件返回一个句柄 

FillPath 关闭路径中任何打开的图形,并用当前刷子填充 

FloodFill 用当前选定的刷子在指定的设备场景中填充一个区域 

GdiComment 为指定的增强型图元文件设备场景添加一条注释信息 

GetMetaFile 取得包含在一个磁盘文件中的圖元文件的图元文件句柄 

GetWinMetaFileBits 通过在一个缓冲区中填充用于标准图元文件的数据将一个增强型图元文件转换成标准windows图元文件 

InvertRect 通过反转每个像素的值,从而反转一个设备场景中指定的矩形 

LineTo 用当前画笔画一条线从当前位置连到一个指定的点


vb程序设计教程答案 vb程序设计课后答案 vb程序设计基础答案 vb入门 vb试题及答案 vb程序设计答案 vb练习题 vb课后习题答案 vb入门教程 vb答案

该网站已被大量用户举报可能含有一些不明来源的下载链接或有安全风险的软件,建议您谨慎访问

我要回帖

更多关于 代码编程 的文章

 

随机推荐