5.显式声明与自动保存
在默认情况下,VisualBasic会把未声明的变量认为是新变量(即使是你不小心打错字了),这样很容易出现错误,而且要找出这样的错误往往很不容易。加上API的操作基本上都会涉及到系统本身,一旦出错就有可能出现VisualBasic崩溃甚至系统崩溃。所以到VisualBasic的选项设置中选上RequireVariableDeclaration(需要变量声明)。在Enviroment(环境)页中的Whenaprogramstarts(当程序启动时)处选上PromptToSaveChanges(提示保存)或SaveChanges(自动保存)。这样VisualBasic会检查变量是否已经声明,不再允许没有声明的变量出现了。
6.API浏览器
前面讲“声明”的时候提到了API浏览器,这里也说一说它。在安装完VB时,安装程序会把API浏览器复制到你的计算机里。启动后界面如图1(以VB6为准)。可以看到,从API浏览器里我们可以得到API的声明、常量值以及与API相关的自定义类型的定义。其中DeclareScope(声明范围)是指该声明是公有的还是私有的。对于在标准模块中的声明,如果声明为私有,则只对该模块有效,如果为公有,则对整个程序都有效。在窗体模块中只能声明为私有。
7.MSDN
MSDN是微软发布的一套完整的Windows开发者技术文档(如图2)。里面不仅有VB、VC++、VFP、MSDEV、VSS等开发工具的完整帮助,而且包含了Windows平台开发的几乎所有的技术资料,并不断地更新。我们需要的API资料这里都有很详细的说明,包括使用平台、参数类型、参数作用等(当然它并非完全正确,错误的地方也时有出现)。不过作为以C为基础的API,这里的资料是英文的,而且格式也是C语言格式。想要读懂,那你的英文水平和C语言就要有两把刷子了。不过不必担心,它只是我建议一定要有的参考文档,最重要的还是我接下来要讲的内容,它不仅是中文的,还是VB的,又有使用示例,还有相关知识讲解。记住MSDN只是参考文档,作用就好像字典,可千万不要买了一套MSDN就跑去跟别人说你已经变得多厉害了,不然……
顺便说一说,以前的MSDN是双CD的,现在已经变成3CD了。如果买的话应尽量买最新的(但没有必要每次更新都换一套),因为更新的版本把一些错误改正了,并增加了新的内容,比如最新的MSDN已经增加了许多WindowsXP的内容。你可以从微软的中国网站订到这套文档,不过一年的价钱从一万几到三万几,买不起的话……自己想办法吧。
好了,开篇写了这么多,无非也是想让读者在以后可以更容易理解所讲的内容。这些是基础,是一定要记住的。下面我们就先介绍一个比较简单的API,开始我们的API之旅吧!
第一话从消息说起
由于这是《细水长流话API》的第一话,我必须注意到所讲的内容要简单,并且让你有耐心可以看到往后的文章,所以我希望可以通过一个比较特别的例子来引起你的注意(这样的情况不会总是有的)。让我们想想,VB里的CommandButton控件让我们可以做什么?按下、弹起,还有呢?请看看图3,这样的情况在你的程序运行时出现过吗?
Windows是以消息来传递信息的。当出现某个操作,比如按钮被按下,就产生按钮被按下的消息。消息被传送到被操作对象(按钮),事件就产生了。应注意不是按钮产生消息,而是Windows知道这个操作的发生,向按钮发送这个消息,按钮收到后再做相应的处理——如改变外观成为按下的状态。
Windows允许第三者向某个对象发送消息,因此当某个操作没有发生时,我们是可以让对象如同收到消息一样产生效果的,这就需要用到API函数——SendMessage了。
SendMessage的声明前面已经说过(注意以Public开头应放在标准模块中,否则用Private开头),它的各个参数中,hwnd是对象的句柄,wMsg是消息的值(具体什么消息),另外两个参数根据不同消息和不同应用有不同的值。
你看到的图3的情况,是由于我的程序向CommandButton控件发送了WM_NCLBUTTONDOWN消息。这个消息发生在鼠标在窗口的非客户区域上按下时。所谓非客户区域,你可以理解成一个窗口的边缘和标题栏(当然是指一般情况,这种情况是可以被程序改变的)。
在我这个按钮的MouseDown事件中,只写了短短的几句:
PrivateSubcmdResize_MouseDown(ButtonAsInteger,ShiftAsInteger,XAsSingle,YAsSingle)
DimnParamAsLong
WithcmdResize
'之所以在0和100之间以及下面.Width-100和.Width之间,是让鼠标只在按钮边缘才可以拉动按钮
IfX>0AndX<100Then
nParam=HTLEFT
ElseIfX>.Width-100AndX<.WidthThen
nParam=HTRight
EndIf
IfnParamThen
CallReleaseCapture
CallSendMessage(.hwnd,WM_NCLBUTTONDOWN,nParam,0)
EndIf
EndWith
EndSub
可以看到,我让鼠标拉动按钮时,拉按钮左边是用HTLEFT做参数,拉右边是用HTRIGHT做参数。这两个都是常量,可以从API浏览器中得到值。同样的,若想拉按钮的上面和下面,可用HTTOP和HTBOTTOM做参数,而HTTOPLEFT和HTBOTTOMRIGHT则分别是左上角和右下角。
在发送消息之前有一个ReleaseCapture的API。这个API是让Windows释放对鼠标的捕捉以便使鼠标位置的信息不能被收到,CommandButton不知道鼠标在哪里,也就不会发生按钮在这时被按下的情况。当然,可以放心,Windows释放对鼠标的捕捉只是暂时的,当你放开鼠标再次发生移动时,Windows又会捕捉鼠标了——它是时时都在发生的。
你可能希望如同我的程序一样在按钮边缘光标会变化,下面是我写的程序段:
PrivateSubcmdResize_MouseMove(ButtonAsInteger,ShiftAsInteger,XAsSingle,YAsSingle)
DimNewPointerAsMousePointerConstants
WithcmdResize
IfX>0AndX<100Then
NewPointer=vbSizeWE
ElseIfX>.Width-100AndX<.WidthThen
NewPointer=vbSizeWE
Else
NewPointer=vbDefault
EndIf
IfNewPointer<>.MousePointerThen
.MousePointer=NewPointer
EndIf
EndWith
EndSub
作用很明显,而且很简单,所以我就不对这段代码作解释了。
这个例子很简单,但相信起的作用是不小的。SendMessage可以发送很多消息,当然我不会对这些消息一一作解释,但以后还是会经常接触到的,所以更多的知识就等慢慢再学吧。
文中程序在Windows2000 VB6环境下调试通过。
新闻热点
疑难解答