VB API 中级入门(接VB API初级入门)(一)

这次咱们来深入了解API在VB程序中的运用,并且有些复杂的API使用可能会使你感到很悲观,不过我会尽量用最容易让人理解的方式表达出来。注:如果你是一个刚入门API的初学者,那么请你先看看关于我写的初级API入门教程,也许会对了解API有帮助,地址:http://www.vbgood.com/viewthread.php?tid=50241&extra=page%3D1
        一、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) 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
                    DrawText Me.hdc, "这是文字效果", -1, lpRect, DT_CENTER
        End Sub
            好了,咱们开始分析,首先看Form_Load里面的代码。
            Dim lpRect As RECT。这一句是声明一个RECT自定义类型,这个类型可在VB浏览器的类型中找到。
            Me.AutoRedraw = True。这一句其实就是设置当前窗体的AutoRedraw属性,设为True,表示持久输出图像。不懂查帮助。
            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开始的高度。Me.ScaleHeight表示当前窗体像素的高度。
            关键的就是下面一句,是它帮助我们在窗体中画出文字的。这里说一下为什么需要把当前窗体的坐标度量单位(ScaleMode)改成3(Pixel像素),因为Windows不管画什么都是以像素为单位,所以我们为了确定咱们所画的文本显示在正常位置,就必须使用像素为单位!明白了么??(问:还是不明白?答:默默无语两眼泪啊~~)
            DrawText Me.hdc, "这是文字效果", -1, lpRect, DT_CENTER
            现在分析这条API。看看里面需要传入的参数:ByVal hdc As Long, ByVal lpStr As String, ByVal nCount As Long, lpRect As RECT, ByVal wFormat As Long
            ByVal hdc As Long。hdc为Long整形,所以应该传入数值,不过给大家一个技巧,以后凡是看到hdc这个变量字符,表示需要传入的为一个hdc句柄,注意可不是hwnd句柄哦!这个句柄窗体和Picture控件都有,大家注意看就是了。
            ByVal lpStr As String。传入字符串。这里就是咱们需要画到窗体上的文本。
            ByVal nCount As Long。传入数值。看看里面的声明字符nCount,可以看出来这与数目有关,与什么数目呢?当然是文本罗。也就是说要显示的字符个数,一般如果需要全部显示出来可设为-1即可,表示显示所有字符。
            lpRect As RECT。一个Rect类型,这里需要使用Rect类型,上面我们已经在API浏览器找到了这个类型并声明了,所以只需要传入相应的类型声明就可以了。不过这次与我上一次讲的有所不同,上次是通过API类型结构获取相关的信息,而这次需要你把API类型结构填充好以后再传入进去。希望大家在这里注意下。可能有人要问了,那为什么这次就要这么做?我的回答是:因为API并不是万能的和灵活的,有的时候需要我们人为的设置一些参数来完成自己所需要这个API的功能,大家可以通过上面的结构填充就可知道,我们所要画文本的整个范围就是整个Form窗体的范围啊!
            ByVal wFormat As Long。传入数值,不过可以看看nFormat声明字符,可以想像这里可能需要传入这个API的使用格式,就如我们前面所讲的那样。现在打开API浏览器,在常数中找找,输入这个API的开头,Draw(D)Text(T)=DT_,可以看到有很多吧。具体这些都是什么意思可以查查相关的API资料。这里我们只传入了一个DT_CENTER常数,意思是居中显示。默认可以为0,因为这里为文字显示格式,所以你什么格式也不想要的话可设为0以后文字显示在左上角。
            OK。F5运行之。。。窗体中间正常显示“这就是文字效果”的几个文字。
二、Windows 消息
            可以说这节是本文中的重点,当你能理解该节中的所有内容时,我相信你已经可以用该方法写出不错的程序功能了,好了,不说多了,接着往下来看。
            在了解消息之前,先让我们看看Windows 消息到底是什么?
            Windows系统是一个消息驱动的OS,所以操作都是基本消息驱动的,这就好比我用鼠标按下一个按钮,这时Windows会先发送该鼠标的左键按下消息,也就是WM_LBUTTONDOWN到你按下的那个CommandButton,这时就会激发按钮的CommandButton_MouseDown事件,然后松开鼠标,Windows这时会发送WM_LBUTTONUP消息,激发CommandButton_MouseUp事件,说明该鼠标按键已经弹起(松开),这时就会激发咱们VB中的 CommandButton_Click 事件,所以你点击某个按钮以后就会执行相应的操作。这里我不想说得太深太复杂,只是想以这种简单的理解方式让你明白Windows消息到底是什么,也许说得太含糊,但是对你第一次理解这东西已经足够了!
        实践1:
            现在就让我们以消息来写一个入门程序,先是打开VB(问:废话。答:……),然后打开API浏览器(问:早打开了。答:……),然后在API浏览器找到 SendMessage ,再然后在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.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是什么意思这里我说一下,也就是是说明该参数可以指定为任何标准数据类型,允许将任意数据类型传递给该参数!希望你明白,该参数的值也是取决于 uMsg。
                    再看看 Command1_Click 事件中的代码,其中使用了SendMessage API,第一个是当前的窗口句柄,至于什么是句柄我在API初级入门时讲过,第二个为 WM_CLOSE 常数消息,也就是说给当前窗口发送关闭消息,第三、四个参数分别为0,具体参数我已经说过,取决于你在 uMsg 传入的常数。
                    现在 F5 运行点击Command1按钮试试。
                    小提示:注意这里的句柄当然也可以输入其它窗口的句柄,执行效果同上面一样,可以关闭你传递的那个句柄窗口!自己试一下,具体怎么获取窗口句柄我在VB初级入门时讲过,自己去试试吧!!!
                实践2:
                    现在我们开始第二个消息程序,还是使用 SendMessage ,这次我们是要给一个按钮传递 Click(点击)事件,最近貌似有些人在问这个问题?现在就写出来大家实践实践。
                    新建一个标准EXE,添加两个 CommandButton 控件,分别为 Command1 和 Command2 ,然后输入以下代码:
                    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 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_CLICK 常数,这个常数好像在VB自带的API浏览器中没有,所以大家可以把该常数自行复制到各自的VB程序中,也可以新建一个记事本保存下来,也可以把它添加到VB的API浏览器文本中等等。
                    再来看看 Command1_Click 事件,可见调用了 SendMessage API 向 Command2 中发送了 BM_CLICK 消息,该消息为按钮点击消息,后面的参数取决于 wMsg,所以后面两个为0即可,现在说一个为什么最后一个参数是写成 Byval 0&,写成这样的原因主要是因为最后一个参数变量,大家可以看看最后的参数变量 lParam As Any ,Any 是什么意思我已经说过,0& 后面的 & 其实为 Long 的简写,说白了 & 就是 Long 的意思,当然你可以在你程序写在 Dim ABC& 声明一个 Long 类型,而 Byval 0& 代表着是以传值方式进行传递该参数。不明白意思不要紧,翻开你的VB书多看看过程这章。
                    最后一个 Command2_Click 的 MsgBox "command2" 自然是显示一个消息。
                    好了,F5 运行试试。
                    小提示:同样该 hWnd 参数可以传递其它按钮句柄,实现效果同上面一样。
                            现在让我们看看 GetWindowLong 和 SetWindowLong 这两个“超级”API,为什么说超级呢?因为我们实现子类化少不了它们啊!

 

posted @ 2010-09-27 21:08  年轻的蜗牛  阅读(695)  评论(0编辑  收藏  举报