免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2495 | 回复: 0
打印 上一主题 下一主题

如何才能提升你对API的学习兴趣? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-07-30 15:43 |只看该作者 |倒序浏览
API,我常把它看做成过程函数,不过每人都有每人的见解和理解方式,自己的理解方式只要可以帮助自己更好的学习和掌握API,也没必要一定要学习他人的。

  1,自己做MsgBox

  了解API参数的使用方法是很重要的,这里我们不用VB的MsgBox,直接使用API弹出MsgBox消息框。首先,打开API浏览器,选择MessageBox,大家可以用这个API和VB内置的MsgBox比较一下,其实MsgBox也就是MessageBox的缩写,只不过一个是API,一个是VB内置的,但两者都是通过API进行工作的。好了,选择私有声明方式,粘贴到VB代码编辑窗口中,然后新建一个CommandButton,写入以下代码:

Private Declare Function MessageBox Lib "user32" Alias "MessageBoxA"
(ByVal hwnd As Long, ByVal lpText As String, ByVal lpCaption As String,
ByVal wType As Long) As Long
Private Sub Command1_Click()
     MessageBox Me.hwnd, "这里是内容", "标题", 0
End Sub

  先让我们来分析一下,首先看第一个参数Byval hWnd As Long,很显然这是一个长整形变量,所以我们这里需要传递的是数字,你可能会发现我们传递的并不是数字啊,而是 Me.hwnd??很奇怪是吗?如果你真的有此疑问说明你是真心想要学习好API的,现在就让我们来看看Me.hwnd到底是什么东西?以下摘自VB帮助文档:
  hWnd 属性:返回窗体或控件的句柄。
  句 柄:是由操作环境定义的一个唯一的整数值,它被程序用来标识或者切换到对象,如窗体或控件等。

  现在估计你差不多就已经明白了,我们调用的hwnd其实是一个句柄整数值,你可以用 Msgbox Me.hwnd 看一下就知道了。至于Me这是一个关键字,代表当前Form窗体对象。如:Me.Caption="标题"、Me.BackColor=vbRed等。

  接上面的,首先我们传入了Me.hwnd,表示是当前窗口调用MessageBox,这里告诉大家一个技巧,也就是以后凡是看到Byval hwnd As Long,一般都是需要传入句柄的,至于传入哪个对象句柄,那就要看你是怎么实现的了。
  ByVal lpText As String,这个是字符串变量,标识着叫我们需要传入字符串进去,可以看里面的变量字符lpText,属于文本的意思,也就是说是用来显示MsgBox中的消息文本的。
  ByVal lpCaption As String,也是字符串变量,还是传入字符串进去。在看里面的变量字符lpCaption,其实就是显示MsgBox标题的。
  ByVal wType As Long,这是一个整形变量,需要传递整形数字,还是看里面的变量字符wType,标识着显示MsgBox类型,这里可以像VB的MsgBox一样使用,如这里可以传入:vbYesNo,vbOkCancel等,如果忽略那就传入0即可。

  好了,按F5启动程序,点击Command1,接着就会弹出一个消息框,这里我们制作以及分析MsgBox已经完成了。希望你能在这段学习到一些知识。

  2,来点实用的吧

  就拿隐藏Windows任务管理器来说吧,这里只能隐藏任务管理器中的窗口,不能隐藏进程。(问:有没有隐藏进程的?答:你想干什么?),当程序运行后你无法从任务管理器的窗口中关闭程序,只能从进程中进行终止。好了,还是老规矩,打开API浏览器,输入GetWindow和ShowWindow两个API,声明范围还是私有的,复制粘贴到Form代码窗口中,嗯,好了?别急,还是API浏览器,选择Combox中的常数,输入GW_OWNER和SW_HIDE这两个API常数,然后粘贴到代码窗口中,问我这两个是干什么的?那就接着往下看吧。写入以下代码:

Private Declare Function GetWindow Lib "user32" (ByVal hwnd As Long,
ByVal wCmd As Long) As Long
Private Declare Function ShowWindow Lib "user32" (ByVal hwnd As Long,
ByVal nCmdShow As Long) As Long
Private Const GW_OWNER = 4
Private Const SW_HIDE = 0
Private Sub Form_Load()
     Dim lphWnd As Long
     lphWnd = GetWindow(Me.hwnd, GW_OWNER)
     ShowWindow lphWnd, SW_HIDE
End Sub

  又到了分析的时候了,这对刚入门的新手可谓是最激动的时候了。好了,还是老子,看看两个API的表面意思和传递值变量。

  先看GetWindow,表面意思:获取窗口。传递值变量:hWnd整形句柄,wCmd整形命令值。
  再看ShowWindow,表面意思:显示窗口。传递值变量:hWnd整形句柄,nCmdShow整形命令值。

  然后是使用代码,先看lphWnd = GetWindow(Me.hwnd, GW_OWNER)这句,这句意思是获取当前窗口的所有者窗口句柄,可以看到GetWindow是Function过程函数,执行以后会返回相应的窗口句柄值,这个值为Long整形(同句柄)。接着调用ShowWindow lphWnd, SW_HIDE,这句意思是显示lphwnd这个句柄的窗口,关键一句是最后的SW_HIDE,这是API函数的常量。通过设置常量能让系统知道API到底应该怎么执行显示窗口,是显示?还是隐藏?Hide当然是隐藏的意思。好了,编译成Exe,运行后打开任务管理器,查看程序窗口,还有吗?

  我又要说一下了,有些人可能不懂为什么要用GW_OWNER这些常量,这些到底有什么用?还有就是我怎么知道哪些API对应哪些的常量?其实这些常量你只要稍微注意一下就知道它们是怎么回事了,如在GetWindow中我使用GW_OWNER,在ShowWindow中我使用SW_HIDE这些常量都有一个共同的特点,就是他们都是以API的单词第一个字母为标准。如GetWindow相对应的常量就是Get(G)Window(W)=GW,ShowWindow相对应的常就是Show(S)Window(W)=SW,这些常量可以自己在VB的API浏览器中找找看。

三、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运行之。。。窗体中间正常显示“这就是文字效果”的几个文字。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP