扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
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函数中用到了不同的坐标系统,因此需要注意.
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的转换)
<>
bordercolordark="#FFFFFF" cellpadding="0">
<>
bordercolordark="#FFFFFF" cellpadding="0">
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 ByVal0& 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 |
API参数类型
注释:
你应该注意到了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
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者