前言
Visual Basic 6 (下文简写VB6)易用,简便,是编程入门首选,虽然是上个世纪的产物,被微软抛弃,近20年来从未更新过,依然被大家所喜爱。
虽然有好多人以VB6为跳板,转用其它编程,但对VB6依旧念念不忘,也有好多人一直在使用着VB6。
但是VB6属于高度封装型语言,当你很熟悉VB编程后,就会感觉被VB6深深的束缚中,无法施展和自由发挥你应有的编程才华。
如何才能用我们熟悉的VB语言编写,又能毫无约束的畅快淋漓的进行Windows编程呢,那就是 PowerBASIC(下文简写PB) 。
PowerBASIC简介
美国PowerBASIC公司从1996年来历经10个版本发展,生成EXE文件小巧精湛,执行效率及高,代码运行速度超快,完美本地代码,不依赖运行库,标准DLL生成,与VB6完美对接......
为什么选择PowerBASIC?
假如VB6是小学中学,那么大学我们用什么?在众多的编程工具中,继承VB语法最好的就是PB了。
1,学习成本很低,与VB6语法相似度达95%以上,可以快速上手,读完本文你就可以用PB写软件了。
2,所写的DLL与VB6兼容性最好,可以写DLL扩展VB6写的软件,成为VB6副手也是非常有价值的。
3,小巧精湛、绿色环保,性能、速度可以匹敌 C、C++ 等语言,开发效率高等。
必须树立Windows编程的概念,扭转VB6带来的思维模式。
VB6是以控件为中心的概念,其实是VB6的高度封装,最后都会转变成Windows编程原始模式,PB直接使用Windows编程原始模式(当然,很多高阶编程都是这样,如 C 语言),所以对处理窗口和控件上与vb6截然不同,想要更深层次了解,请购买Windows编程书籍,虽然书里都是用C介绍,但PB同样可用。
简单的说,Windows编程原始模式,就是直接使用API,自己处理消息流程,虽然麻烦,但是全面而又精确控制,使我们做的软件能达到新的高度。所有的API都可以直接使用,如同自己的函数一样,API可以查询微软的MSDN。
必要的可视化编程环境
vb6是集可视化编程环境和语言为一体的编程工具,而PB只是纯语言,只有代码,当然,高手们喜欢纯洁,可以只用PB,而我们则需要一个类似vb6的可视化编程环境,那就是 FireFly 软件,具体软件和相关帮助和工具,已经被我打包好,可以进群( Basic编程爱好者 78458582 ) 中下载,后面所有提到的内容都是基于 FireFly 中写的PB,FireFly 也是一家美国公司开发,给我们快速使用PB带来了极大的便利,如果没有它,想从vb6过度到PB,没个把月的时间学习,休想用PB写出一个应用来,也可能因原始Win编程太复杂而放弃PB,而有了它,过程只需看我写的本指引。
对窗口和控件的操作
控件其实也是窗口,我们可以按同一类型考虑,窗口操作,这恐怕是VB6与PB的最大不同,VB6只需要控件名加个点,就可以对窗口属性修改,获取窗口的值,VB6在背后要将转换成WIN消息来处理,而PB是直接使用消息处理,窗口及控件各自有自己的消息,这在微软的MSDN上可以查到。FireFly 为我们建立了常规控件属性可视化设置,类似VB6操作,如果用代码修改,FireFly 建立了函数库,
常用的都在其中,我们调用函数来修改属性,其实还有更多的,这就要查微软的MSDN查了,自己发消息。
VB6用控件名来指定操作什么控件,PB用窗口句柄来区别操作什么控件,就是VB6中的 Me.hWnd ,这就是窗口句柄。
FireFly中有个【句柄和ID】,所有窗口和控件的句柄都在里面,可以直接双击,变量名会到代码处。
函数库里的函数,可以直接在代码中调用,生成EXE文件时,只有被使用到的函数才会被编译到EXE文件,所以我们自己写的通用函数都加到这里,以后写软件就方便多了,又不会增加EXE体积。
例题:VB6> Me.Caption = "我的名称" PB> FF_Control_SetText( HWND_FORM1, "我的名称")
VB6> aa=Me.Caption PB>aa=FF_Control_GetText( HWND_FORM1)
显示窗体 VB6> hwnd=Form1.Show(父窗口对象) PB> hwnd=Form1_Show(父窗口hwnd)
模态显示 VB6> hwnd=Form1.Show(1,父窗口对象) PB> hwnd=Form1_Show(父窗口hwnd,%TRUE)
关闭窗口 VB6> Unload Form1 PB> FF_CloseForm HWND_FORM1, %FALSE
VB6与PB的代码语法区别
两者差别很少,大多数从VB中复制到PB里就可以使用,小部分要稍微调整。PB比VB多了好多函数,数据类型,新增部分查PB帮助,这里只说不同的情况。PB 不能用汉字当变量名和函数名。
函数与过程:
所有的函数和过程,在PB中是全局共享的,VB中是分私有和公有,所以在 Function 和 Sub 前要加东西,PB则不需要。
在VB中,有类模块、模块、窗口模块,因为VB是用“类”来各自包装它们,而PB没有任何包装,大家可以理解为,PB只有一个模块,所有代码都处在一个模块中,不管你新建了多少窗口,多少模块,都处在同一个中,可以任意调用其中的函数使用。
字符类型:
VB只有 Unicode(每个字符的两个字节)如 Dim A As String
PB有2种,ANSI(每个字符的一个字节,中文占2字)和Unicode 格式的字符串,如 Dim A As String ,B As wString
平常使用没区别,但用上 Left(字符)、Instr()、Mid 等 函数时就出问题了,所以VB中的 As String 等同PB中的 As wString
PB中还有与C语言兼容的 DIM C As Asciiz *100 等等,惊喜多多,可以查看PB帮助。
变量声明:
全局变量,在过程、函数之外用 Global A as Long ,类似VB中的 Public 用法
数组需要 Global A() as Long 然后过程中 ReDim a(10) ,不可以直接 a(10)
可以用 Local a as Long 来替代VB中的 DIM a as long ,因为 Local a,b,c as Long 连续声明变量类型,但数组只能用 Dim a(10)
Type 中不可以有动态数组,和变长字符串,
常量:
PB中,数字常量用 %aaa=1234 字符常量用 $aaa="ddd" : $$="宽字符"
字符串处理函数:
在PB中,所有返回是字符串的函数,其后必须有个 $ ,如:MID$() Left$ ,而VB是可有可无的。
连接字符串时,VB可以是数字,因为后台会调用转换成字符,而PB必须你自己先转换成字符,如 $a=str$(1234) & "aa"
VB中的 Replace(替换字符)函数,变成PB中更加高效率的语句: Replace "查找字符" With "替换成" In 字符串变量
PB 没有 Split 函数,需要自己写一个
Function StrSplit( SourceStr As String, StrArray() As String,delimeter As String) As Long Local nCount As Long If SourceStr = "" Then Function=-1 Exit Function End If ReDim StrArray( ParseCount(SourceStr, delimeter)-1 ) As String Parse SourceStr, StrArray(), delimeter nCount =UBound(StrArray())+1 Function = nCount End Function
日期处理函数:
PB没有VB中方便的 DateAdd DateDiff FormatDate 的函数,只有一个日期类 Local d1 As IPowerTime ,需要自写函数,本人以写好,包含在函数库中,大家可以查看,里面的实用函数。
类:
VB用“类”包装了,模块、类模块、窗口模块,还有控件,身为高阶编程的PB,当然也有“类”。VB中的类模块,PB中的类,用法上是一样的,但PB函数是全局的,所以为了不同于普通函数和过程,及变量声明,所以用“类”里用到的函数和过程用了其它关键词,更多可查看PB帮助文档。
Function aaa(a As Dword ,b As Dword ) As Dword Dim Stuff As MyInterface '调用类用方法 Let Stuff = Class "MyClass" Function= Stuff.BumpIt(77) '使用类 End Function Class MyClass Instance Counter As Long '类的全局变量定义 Class Method Create() ' 类被创建时 End Method Class Method Destroy() ' 类被销毁时 End Method Interface MyInterface Inherit IUnknown ' 继承的基类 Method BumpIt(Inc As Long) As Long '类的函数 Dim a As Long '函数内的代码,写法和普通的一样 Temp& = Counter + Inc Incr Counter Method = Temp& End Method End Interface End Class
图标与图像
先在图像库中,加入图像、图标,然后各个控件中就可以设置图标或者图像了,如果代码要使用图像,就用API加载资源,然后画画,
这方法是所有WIN编程通用的,可以网上参考C语言。图像库还可以加入非图像文件,可以读取二进制自己任意处理。
例题:
位图句柄=LoadImage(app.hInstance,"资源里的名称", %IMAGE_BITMAP, w, h, %LR_DEFAULTCOLOR)
DrawState hDC,0,0,位图句柄,0,x,y,w,h,%DST_BITMAP
还有重要一点,PB虽然提供了绘图函数,但其内部机制不太好,大家都弃用,所以我们直接用API来绘图,不管任何语言,API是通用的。
事件:
事件都以消息的形式,常用的都在下拉控件中列出,更多的在自定义中,所有非自定义的事件也会出现在自定义里,就是说,所有事件消息都出现在自定义中。
还有特殊函数,控制着软件全局,一般用不着,但是必要时,特别有用,这样我们写软件的人就能掌控着100%的软件控制权,任我们自由发辉。
定时器:
VB可以停止定时器控件,PB用API来销毁 KillTimer( hWndForm,wTimerID ) 重新使用,用新建 SetTimer(m_hWnd,wTimerID,时间,%NULL)
掌握高阶编程必要的新东西
指针:
指针这名词,让人云里雾里,正规书上所解释的,让新手们更加看不懂,我理解为指针就是指向变量在内存中的地址那个针,在VB中,指针就一个作用,获取变量在内存中位置(内存地址),而PBx中有2个作用。
一:获取内存地址 VB和PB都有的函数:StrPtr(字符串变量) VarPtr(任意变量) PB中多了一个: CodePtr(函数或过程名称)
二:盗用别的变量 这是最有意思的事,也是高阶编程中必修课,会用后,会产生意想不到的效果。
例题:
dim a as long '被盗用的变量,可以是任意过程,线程,只要是同处一个进程中的变量都可以盗取 dim b as long ptr '要盗用什么变量类型,这里用 long 举例,也可以是自定义变量 b=VarPtr(a) '盗用 a 变量,当然也可以指定内存中任意地址 '如果直接用 b 变量,不管盗用什么类型,它只是个 长整数 类型,盗用的使用方法为: c=@b '变量前面要加个“@”,使用上和 “a”变量无区别,@b 就是 a 还可以用数组,就是 c=@b[0] ,此时不管“a”是否是数组,如果不是 @b[1] 将是 “a”变量后面内存的内容,使用上要小心, 当然,如果 “a”变量是数组,那是没问题了。
多线程:
在PB中,使用多线程非常方便,同常编程理念是,将耗时间的代码处理,交给多线程来处理,避免卡界面,影响用户体验。
Function Myaaa() As Long '我的函数 Local hThread,lResult As Dword '线程用的变量 Thread Create MyThread(0) To hThread '创建线程,此时就立即运行线程里的代码了。 Do '等待线程完成,如果不需要等待完成,可以删除 DO Thread Status hThread To lResult If lResult&<>&H103 Then Exit Do ' "线程被终止" '线程正常运行时,返回&H103 FF_DoEvents Loop Thread Close hThread To lResult '立即清除线程ID,如果不需要监控线程就立即清除,只是清ID,不会终止线程 End Function '-------------------------------------------------------------------------- Thread Function MyThread (ByVal Taram As Long) As Long '线程 '只能用一个参数,这里,你只能修改线程名和参数名,其它不可以改 线程里的代码,线程里还可以创建气他线程,从父线程里,只能传一个变量,当想要传更多内容咋办,那就要用到上面所说的“指针”来盗用变量的方法,被盗者变量千万不可用过程变量,因为过程结束后,会自动销毁了变量,此时你使用盗它,软件就崩溃了, 可以用全局或者自己申请变量空间,用完后,在线程中再销毁。 End Function
软件中包含更多帮助
看到此,你就可以用本来VB的知识来写出软件来了,但想要进步,使用更多好东西,得到更多新技术,这就要看软件中提供的大量帮助。
当然,只看了这么点,你只了解冰山一角,还只是停留在VB阶段,通过不停的学习,慢慢的你会知道VB提供的东西真的太少太少。
更多软件使用技巧,代码例题,可以进QQ群( Basic编程爱好者 78458582 ) 交流。
暂时能想到的就这些,以后想到什么再补充,更多东西请关注本论坛。