2008年8月18日星期一

vb技巧5

使用 IIF 和 SWITCH 以精减代码
在很多地方你都可以使用一个更紧凑的 IIf 函数来代替 If...Else...Endif 的结构:
例:返回两个值中较大的一个 maxValue = IIf(first >= second, first, second)
Switch 则是一个很少使用的函数,可是在很多方面它都提供比 If...ElesIf 结构更好的
例:判断 "x" 是正、负还是 null?
Print Switch(x<0,"负",x>0,"正", True, "Null")
[返回技巧索引]
变量的地址 (97/11/29)
VB5 内置了一个 VarPtr 函数,可是此函数在 VB4 中没有提供。可是你知道吗?VB4 的运行库中已经包含了此函数。只是在用它之前,我们需要声明一下:
#If Win16 Then
Declare Function VarPtr Lib "VB40016.DLL" (variable As Any) As Long
#Else
Declare Function VarPtr Lib "VB40032.DLL" (variable As Any) As Long
#End If
此函数在传递一个 Type 结构(如果此结构要求其一段是另一个变量或记录的地址)给一个外部的 API 程序时十分有用。
返回
放置“透明”的图片
在 VB 中,如果你试着把一只有鸟的图片放到背景的一棵树上,你就会发现树会被鸟遮住一个矩形的区域(即鸟的图片矩形)。我们可以通过以下方法使图片上非鸟的其它部分变透明:
我们可以利用一个 WinAPI 函数 BitBlt 对图形进行一系列的位操作来达到此目的。
函数声明:
Declare Function BitBlt Lib "gdi32" Alias "BitBlt" (ByVal hDestDC As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long
参数解释:
目标环境:hDestDC——目标设备环境;x——左上角;y——顶端;nWidth——宽;nHeight——高
源环境:hSrcDC——源设备环境;xSrc——源左上角;ySrc——源顶端;
dwRop——位处理操作,如 vbSrcAnd;vbSrcAnd;vbSrcCopy;vbSrcErase;vbSrcInvert 等
(目标环境或源环境只能是 Picture, Form 或 Printer 对象。各单位为象素。)
进行处理之前,我们需要对鸟的图片进行处理:先复制一份相同的图形,将其应该透明之处(鸟的背景)设置为黑色(设此图为sPic),再将另一图做以下处理:要复制的地方(鸟)设置为黑色,其余地方设置(鸟的背景)为白色(设此图为Mask)。
设树的图形为名dPic。
最后,请加入以下代码:
R=BitBlt(dPic.hdc,0,0,sPic.Width,sPic.Height,Mask.hdc,0,0,vbScrCopy)
R=BitBlt(dPic.hdc,0,0,sPic.Width,sPic.Height,sPic.hdc,0,0,vbScrInvert)
后记:
1、VB 中的 PaintPicture 方法提供类似功能,但速度不及此方法;
2、在此方法上稍微加入一些代码,就不难实现动画的显示。
3、VB 例子中的 CallDlls 就使用此方法。
返回

编译时不要自动使用 快速代码优化
如果你第一次使用 VB 的本地代码优化选项,你可能会立即尝试选择“优化代码选项”。可是,你知道吗?这样做并不一定保证使你的程序得到最佳性能。
除非你拥有大量内存,不然程序的性能优化一般不会运行很快。因为这将导致程序装载速度缓慢,在内存不足的机器上特别明显,这样“优化代码选项”就可能让你的用户觉得好象比“优化大小选项”还慢。
基于以上原因,你可以考虑用 P 代码编译你的程序,特别是大型的、UI 和数据库加强的程序。本地“优化代码选项”所获得的性能并不一定可以弥补程序增长大小后带来的问题。
要决定你到底适合那种编译方式,请使用 VB 企业版上的 Application Performance Explorer (APE) 。
返回

避免装载多份应用程序
你的程序可能只支持单一用户,那么怎么来避免多用户同时使用它吗?
你可以利用 App 对象的 PrevInstance 属性来轻易达到你的目的。
我们可以在程序打开时加入以下代码来验证:
If App.PrevInstance Then
MsgBox ("程序已经运行,不能再次装载。"), vbExclamation
Unload Me
End If
返回

启动时禁止装入 Add-Ins
启动VB时, Add-Ins 将加载。如果Add-Ins中有错误的话,每次都可能产生错误。 为了启动时禁止装入 Add-Ins, 在启动VB前,编辑 Windows 目录中的 VBAddin.INI 文件。找到以下的语句:

AppWizard.Wizard=1

将 1 改为 0 。
返回

快速查找属性
在属性窗口中,在打入字符时,按住 Ctrl+Shift。属性窗口将自动翻滚到以该字符开头的地方。
返回

在字符串中使用双引号
使用 Chr$(34) 连接是个办法,用 "" 更简单。如: MyName = "我的名字是 ""Blackcat""。"
返回

混合字符串的长度
在中文环境下,每个字被当做两个 Byte :
Len("汉1") = 2
LenB("汉1") = 4
但在许多情况下,我们希望中文字长度为 2,英文字符为 1。可用以下的函数:
LenB(StrConv("汉1"), vbFormUnicode))
返回

取得应用所在的目录
使用 App.Path 可以得到应用所在的目录。不过得注意,当在根目录下时,Path 的返回值最右字符为 “\” ,如“c:\”,而如果不在根目录,则最右字符非 “\”,如“c:\vb5”。所以在使用 Path 做连接时,应使用以下的代码:

Dim FileName as string
Dim fullpath As String
If Right(App.Path, 1) = "\" Then
fullpath = App.Path + FileName
Else
fullpath = App.Path + "\" + FileName
End If
或者:
pth$ = app.Path & IIf(Len(app.Path) > 3, "\", "")
返回

快速交换整数
可用以下的代码快速交换两个整数(Interger):
a = a xor b
b = a xor b
a = a xor b

没有评论: