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

在VB中使用API函数 (之二)

HTML文档下载 WORD文档下载 PDF文档下载
在VB中使用API函数 (之二)

 
Windows的一些特别之处

这个主题是要告诉你Windows 的一些与在VB中的不同的细节

Windows通过句柄(Handle)识别每个窗体,控件,菜单,菜单项或其他任何你能想得到的东西.当你的程序运行时,它所包含的每个部件都有一个唯一确定的句柄用来同其他的部件相区别.例如,某个按钮得句柄就与其他部件不同,当你想要通过API来执行有关该按钮的某种操作时就必须使用这个句柄.从哪儿得到它呢?VB 为每个拥有Windows句柄的控件都提供了Hwnd属性来表示其句柄.

Windows 使用像素(Pixel)而不是缇(Twip).因此,把涉及API函数调用的控件的ScaleMode属性设为3--(Pixel)是个不错的主意,这样你可以通过ScaleXXX属性得到它们的公制单位值.尽管这样,你可能有时仍需要进行从Twip到Pixel的转换(反之亦然),你可以通过Screen对象的TwipsPerPixelX和TwipsPerPixelY来实现.举例如下:

PixelXValue=TwipXValue\Screen.TwipsPerPixelX

PixelYValue=TwipYValue\Screen.TwipsPerPixelY

TwipXValue=PixelXValue*Screen.TwipsPerPixelX

TwipYValue=PixelYValue*Screen.TwipsPerPixelY

我并没有在实际中见到过TwipsPerPixelX 和 TwipsPerPixelY 的值有什么不同,但你最好是把它们区别开来而不是混用,这至少是一种好的程序设计风格.另外需要注意的是,这里用的是" \ "(整除) 而不是 " / " ,这是因为像素值必须是整数.

另外需要提到的是,Windows函数中用到了不同的坐标系统,因此需要注意.

最后要注意的是,一旦你使用了API 函数,VB就可能不再可靠了---API调用中一个简单的语法错误就会导致VB 崩溃!(请经常保存您的工程).VB 并不能识别API调用中的错误,因此一旦你的程序出现异常,要先检查API调用---是否缺少 ByVal,或者是错误的类型,参数等等.

从哪里得到有关函数的说明?

这个主题不会告诉你如何通过API函数改变按钮文字或如何快速查找一个文件.这不是一个API函数文档.

为了得到有关函数的说明,你需要SDK帮助或微软的SDK文档(至少有40M---我怎么可能放在这里?).这些SDK帮助通常都包含在Borland Dephli 3.0 开发包或者MS Visual C++中.到网上去或找您的朋友要一个,版本越新越好

注意Win3.x 的SDK 帮助对你并没有用,因为很多函数已经过于陈旧甚至废弃不用,尽管他们中的大多数由于与 Windows95兼容而依然存在.

API参数类型

如果你已经有了一个SDK帮助,你肯定主意到了函数的返回之或参数有很多奇怪的类型如VOID,LPCSTR, 和DWORD.如果你对C语言比较熟悉的话,那你肯定明白它们的意思.对于其他不熟悉C语言的人,这里有一张摘自 VB

Books Online(标题是:C语言声明到Visual Basic的转换)

Books Online(标题是:C语言声明到Visual Basic的转换)

 

C 语言数据类型 在VB中的声明 Call with
ATOM ByVal variable As Integer An expression that evaluates to an Integer
BOOL ByVal variable As Long An expression that evaluates to a Long
BYTE ByVal variable As Byte An expression that evaluates to a Byte
CHAR ByVal variable As Byte An expression that evaluates to a Byte
COLORREF ByVal variable As Long An expression that evaluates to a Long
DWORD ByVal variable As Long An expression that evaluates to a Long
HWND, HDC,HMENU,etc.(Windows handles) ByVal variable As Long An expression that evaluates to a Long
INT, UINT ByVal variable As Long An expression that evaluates to a Long
LONG ByVal variable As Long An expression that evaluates to a Long
LPARAM ByVal variable As Long An expression that evaluates to a Long
LPDWORD variable As Long An expression that evaluates to a Long
LPINT, LPUINT variable As Long An expression that evaluates to a Long
LPRECT variable As type Any variable of that user-defined type
LPSTR, LPCSTR ByVal variable As String An expression that evaluates to a String
LPVOID variable As Any Any variable (use ByVal when passing a string)
LPWORD variable As Integer An expression that evaluates to an Integer
LRESULT ByVal variable As Long An expression that evaluates to a Long
NULL As Any orByVal variable As Long ByVal Nothing or ByVal 0& or vbNullString  
SHORT ByVal variable As Integer An expression that evaluates to an Integer
VOID Sub procedure Not applicable
WORD ByVal variable As Integer An expression that evaluates to an Integer
WPARAM ByVal variable As Long An expression that evaluates to a Long

注释:

你应该注意到了BOOL类型(Boolean)求出的值为Long而不是Boolean.因此0表示"假"(False),其他任何值表示"真"(True).

HWND,HDC,HMENU,etc.---etc.指其他所有与于前面所述相似的类型.它们都以"H"开头来表示不同对象的句柄.举例来说,HBITMAP表示一副位图的句柄,HBRUSH标是一个刷子的句柄等等.它们均为Long而且要按值传递(ByVal).

同样要注意LPVOID被声明为Any型变量,本文将会有独立的一个主题用来论述Any类型.

有些类型以"LP"开头.LP 是Long Pointer的缩写.因此LPWORD实际表示数据所存的内存地址.不过,你并没有必要调用某个函数来获取这个地址.当你按引用(ByRef)传递参数时,你实际上传递的就是它的地址.在这里你只需记住:如果某个参数的类型以"LP"开头,应该按引用(ByRef)传递.顺便说一句,LPARAM 与 Lparam 很相似但不是Lparam,Lparam不是一个指针,在这里你必须传递它的真实值,因此要按值(ByVal)传递.

NULL也是一种奇怪的类型.你可以从 VB 中了解到有关它的描述,这里我不去讨论它.按你需要的形式传递它吧,在大多数情况下,可以用 ByVal 0& 或 vbNullString.

最后,VOID是用来指那些没有返回值的函数的.API中没有SUBs,这就是它们的标志.只要记住:如果一个函数被声明为VOID ,你必须在 VB 中把它声明为 SUB.
VB用RND()函数加密 VB用SendKeys来捉屏 用VB4.0制作软件封面 用VB5 对Windows 95 任务栏提示区进行编程 用VB5读写注册表实例 用VB5开发商品软件的经验谈 用VB5设计多功能计时器 用VB5制作文字上卷效果 用VB6.0实现打字效果 用VB编写DirectX7.0游戏(上) 用VB创建Excel报表 用VB读取和控制Windows的中文输入法 用VB将命令行软件Windows化 用VB进行移位操作 用VB开发CAI软件的小经验 用VB开发分布式应用 用VB切换三个特殊键 用VB生成EXE文件后,如何在后面加上参数?这个参数怎样传给VB 用VB实现动态显示操作进度程序 用VB实现双向循环链表 用VB实现用户登录密码的修改 用VB与MS-Draw开发通用作图软件 用VB制作TopMost类型窗口 用VB制作Windows风格安装盘 用Visual Basic 6创建基于MTS的商务组件 用Visual Basic实现Windows的重启动 VB用Windows管理技术做你的应用程序 VB用程序给标识字段(ID)赋值的一种简单实现方法 VB用自己的'PROGRAM'测试自己的电脑 有 BitMap 之Menu -VB资料 运行其他程序,并等待执行完毕 -VB资料 关于 SQL Server 查询遇到的问题。 高分请教:怎样得到PB函数对象的地址? 超链接列的数据绑定问题. datagrid和sql,在线等待 在北京想要参加oracle的培训,时间最好在一周!请给个推荐! 如何把一个aspx页面作为两个页面来用? 帮帮忙:显示窗口变化导致显示物体变形问题 为什么订阅成功了而它的状态是失败或从未启动???请高手帮忙!!! 怎样判断字符串中有半个中文字符? 如何将ClientDataSet.Delta置空? js文件是什么? 如何在hibernate中一次提交删除多条记录? *.mdf壞了,應如何恢復? 怎么读去一个数据库中的所有表的名称 请教一个文件上传的问题! 急!!VS.NET的MSDN突然看不了(绝大部分),报IE找不到服务器错误!!! ----怎么在程序打包后创建一个卸载的快捷方式? java 做的记事本中如何加打印功能 打造功能最强,代码风格最标准的留言簿,欢迎挑刺. 问个关于结贴的问题 如何在Tcl脚本里执行Tk命令? C#下如何做饼图,曲线和柱图 装了VS.NET不知道怎样新建一个ASP.NET文件,请指点 请大家帮忙给我一些asp.net设计框架的资料? 要光盘一打开就能打开一个IE 中秋大送分,祝大家节日快乐,心想事成!! 中秋大送分,祝大家节日快乐,心想事成!! 用ADO可以连上数据仓库MSOLAP,可查询出来的数据不对呀,什么控件支持数据仓库?请高手指教! 中秋大送分,祝大家节日快乐,心想事成!! 如何在Tcl脚本里执行Tk命令? 第一次用VB:请问如何用VB调用一个Console.msi的安装程序?? 中秋大送分,祝大家节日快乐,心想事成!! 关于库存调拨成本计算的问题 关于用户控件的使用 关于.o文件转化为.elf的问题。在线等! 招聘 关于库存调拨成本计算的问题 新手 祝大家中秋节百事可乐! 抢答题:如何改变XP和WINDOWS98的启动顺序 关与asp.nt的编辑软件?我有你个是英文的有中文的吗?上那种asp.net专用的. 请帮忙看看http://expert.csdn.net/Expert/topic/2247/2247767.xml?temp=.7379419 用JMail组件写的邮件系统,怎样设置已查看的邮件为已读? jboss配置好了http://localhost:8080/jmx-console/index.jsp能打开但是? 如何检测数据库操作中发生了错误? 怎么样选择表A中字段YpID与表B中字段YpID内容不相同的所有记录的所有字段? 怎样才能把win98的登录模块替换成自己写的登录程序? 为什么我的这句sql语句换成了access数据库就不行了,请给我看看? oracle数据库连接异常? 请教取每周日期的时间段问题!!! 字符串与数组之间的操作问题 misplaced participles意思 英语的misplaced modifier问题求解Steve carefully hung the new suit that he would wear to his first job interview in the bedroom closet. 怎么错?怎么改? 在射线OP上顺次截取OA=a AB=b,则线段什么就是所要画的a+b的线段 已知线段AB=10,点O再AB上,且射线OC垂直平分线段AB,点P在射线OC上运动,设OP=X当X为何值时,△PAB为等腰三角形?当X为何值时,△PAB为锐角三角形?当X为何值时,△PAB为钝角三角形? 卫子夫生的是男孩还是女孩 生态系统对环境有什么的作用 卫子夫生的男孩还是女孩 生态系统的环境功能有哪些? 大自然给我们什么好处 第2题的A,B选项有什么区别? f(x)在x=0处是否连续?为什么1 宁波海曙区已有五个社区无主车“清零”美耶鲁大学19岁大二学生欲徒步闯南极墨西哥一家美国公司糖果厂爆炸20人失美国海军基地再发枪击案 2人受伤枪手美国义诊团感受中国医疗现状 吁加强健环球小姐决赛即将举行 佳丽泳装展示傲世界最高大的狗在美国去世 存活年龄为手机疑遭美监听 默克尔怒了哈士奇模仿婴儿爬行萌翻网友【组图】墨西哥一美国公司糖果厂锅炉爆炸 40中韩超人气“包子脸”女星(组图)深圳本月底可 直飞柬埔寨金边深圳市人大常委会关于深圳前海蛇口自贸深圳商事登记制度改革 六大创新举措获上半年看好价值 下半年关注成长“老树画画” 本周六来深开讲艺术摩拜单车将建1000处停车点第二届华语 诗歌春晚举行特朗普首次国会演讲马检方以谋杀罪起诉 两名涉嫌杀害朝鲜“标杆工程”照亮 村民脱贫之路“一家两制”吃相太难看我是异界神兽万里灵根极品维修工重生之万佛朝宗再会1850魔头降临横行魔兽世界异时空之江山美人记都市之无赖至尊江湖惊变昆仑续里沙旅游中信明思克航母(已关闭)旅游中英街旅游小梅沙旅游龟山旅游立园旅游自力村旅游开平碉楼群旅游鸳鸯溪旅游太山寺旅游古藤谷旅游
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘