PureBasic心得
使用PureBasic也有一段时间了,国内关于这个东西的资源不多,有个中文社区http://www.purebasic.cn,但是人气一般;幸运的是PureBasic的帮助文档写得非常不错,是俺见过的效率最高的文档,所以摸索一段时间下来,也能弄个7788。当然它的官方论坛也是内容比较丰富的。
PureBasic不是免费的,但是价格非常实惠,79欧包括了windows、linux在内的四个版本,还有后续的无限升级,相对其他开发工具来说,没有什么企业版、个人版的区别。只是国内没有代理商,中文社区的站长算是个非官方的代理。
开始研究PureBasic,是因为它的一个特性,就是直接调用WindowAPI,无需声明,只要加一个“_”(SetWindowLong_)就可以了(当然要完整版才有,demo版不提供)。后来随着渐渐的了解,发现这真是个好工具,具体的功能介绍网上有得是,说说俺平时用它干什么吧
1、为PowerBuilder写DLL:
别看都简称PB,可是确实完全两个不同的东西,PowerBuilder开发MIS系统的效率人所共知,但遗憾的是好多系统方面的功能必须依靠API或者其他语言编写的DLL才能实现,毕竟人家专业不是干这个的,所以需要另外一门辅助语言支持一下。
网上流行的方式都是用VC或DELPHI编写DLL,但是方法都比较复杂,经常遇到PASCAL调用和C调用的问题,还有就是数据类型不匹配,甚至Unicode造成的乱码。使用PureBasic编写DLL可谓极为方便,简单介绍一下:
既然能写DLL,当然这门语言的基础特性就包括了指针、内存操作、数据类型转换、PASCAL和C两种调用方式,这些都不细说了,看一个简单的例子吧(昨天入住博客园的时候,看见Summerheart老大的文章,用VC写了一个获取IP的DLL,小弟现场临摹一下,老兄请勿见怪):
可以选是否unicode编译,PowerBuilder10以后默认使用unicode
调用方式:在PowerBuilder里声明:
Function string getip() Library "getip_u.dll"
如果不采用unicode编译,需要在后面加ALAIS,帮助里有
小弟半路出家,基本功较差,代码还有可以优化的地方,不过意思是表达出来了。
看看这个例子,只有20行,即可显示全部有连接状态的网卡的ip地址,开发起来非常简洁,俺没有像Summerheart老大那样使用引用传递参数,一方面是因为函数可以返回字符串,另一方面是因为引用传递在PowerBuilder里限制较多。
简单分析一下:
第1行的.s,声明了函数会返回字符串;第3行是初始化网络环境;剩下的就是获取IP了,简单吧
例子就举这一个,其实PureBasic可以干好多VC的事情,并且代码量要少得多(俺是个懒人),比如md5、jpeg解码编码等。
2、自己做一些简单的win32应用程序
PureBasic做出来的程序是全绿色的,不需要任何环境文件的支持,它自己有一套窗体和控件(自带窗体编辑器,功能比较全,使用起来稍微有点别扭),还可以直接使用WINAPI,更变态的是,支持rc文件,可以用resed等工具画对话框,当然也要通过WINAPI调用。
再来个小例子,打开窗口,载入JPG图片,用鼠标在上面移动,可以看到一个可随鼠标移动的框框:
呵呵,这段代码是从原来的MFC程序迁移过来的,有些地方走了捷径,不过功能实现上没什么问题。
这段里可以看到callback的应用,winapi的应用和基于PureBasic自身功能的应用,当年用mfc做的时候,还要用gdiplus,头痛死了
3、这个东西本身也很好玩
PureBasic作为过程语言,不支持OOP,也就不支持com、activex,但是它偏偏支持Interface之类的功能,所以研究它本身也很有意思。
举例来说,c本身也不支持com,但是有高人搞出了DispachHelp,因为PureBasic可以看做C的BASIC实现,所以又有高人研究出了PureDispachHelp,于是俺就可以使用COM了。
PureBasic还有许多特性,简直就是为了俺们这些仰视C++又敬而远之的闲散人员设计的,呵呵,要不是因为它,俺也不会去学习C++
心得就这么多,总的感觉是:PureBasic不像VC那样,功能强大,但什么都得自己弄,也不想VB、PB那样,自身擅长的领域没有对手,出了自己的领域,什么都要靠别人。它有自身的特点,非常适合作为第二语言。
PureBasic不是免费的,但是价格非常实惠,79欧包括了windows、linux在内的四个版本,还有后续的无限升级,相对其他开发工具来说,没有什么企业版、个人版的区别。只是国内没有代理商,中文社区的站长算是个非官方的代理。
开始研究PureBasic,是因为它的一个特性,就是直接调用WindowAPI,无需声明,只要加一个“_”(SetWindowLong_)就可以了(当然要完整版才有,demo版不提供)。后来随着渐渐的了解,发现这真是个好工具,具体的功能介绍网上有得是,说说俺平时用它干什么吧
1、为PowerBuilder写DLL:
别看都简称PB,可是确实完全两个不同的东西,PowerBuilder开发MIS系统的效率人所共知,但遗憾的是好多系统方面的功能必须依靠API或者其他语言编写的DLL才能实现,毕竟人家专业不是干这个的,所以需要另外一门辅助语言支持一下。
网上流行的方式都是用VC或DELPHI编写DLL,但是方法都比较复杂,经常遇到PASCAL调用和C调用的问题,还有就是数据类型不匹配,甚至Unicode造成的乱码。使用PureBasic编写DLL可谓极为方便,简单介绍一下:
既然能写DLL,当然这门语言的基础特性就包括了指针、内存操作、数据类型转换、PASCAL和C两种调用方式,这些都不细说了,看一个简单的例子吧(昨天入住博客园的时候,看见Summerheart老大的文章,用VC写了一个获取IP的DLL,小弟现场临摹一下,老兄请勿见怪):
1
ProcedureDLL.s getip()
2
Protected result$="",ip_num=0
3
If InitNetwork()
4
If ExamineIPAddresses()
5
ip_num=NextIPAddress()
6
If ip_num
7
result$+IPString(ip_num);第一个IP地址
8
Repeat
9
ip_num=NextIPAddress()
10
If ip_num
11
result$+";"+IPString(ip_num);后续IP地址
12
Else
13
Break
14
EndIf
15
ForEver
16
EndIf
17
EndIf
18
EndIf
19
ProcedureReturn result$
20
EndProcedure
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
2
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
3
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
4
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
5
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
6
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
7
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
8
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
9
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
10
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
11
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
12
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
13
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
14
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
15
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
16
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
17
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
18
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
19
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
20
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
可以选是否unicode编译,PowerBuilder10以后默认使用unicode
调用方式:在PowerBuilder里声明:
Function string getip() Library "getip_u.dll"
如果不采用unicode编译,需要在后面加ALAIS,帮助里有
小弟半路出家,基本功较差,代码还有可以优化的地方,不过意思是表达出来了。
看看这个例子,只有20行,即可显示全部有连接状态的网卡的ip地址,开发起来非常简洁,俺没有像Summerheart老大那样使用引用传递参数,一方面是因为函数可以返回字符串,另一方面是因为引用传递在PowerBuilder里限制较多。
简单分析一下:
第1行的.s,声明了函数会返回字符串;第3行是初始化网络环境;剩下的就是获取IP了,简单吧
例子就举这一个,其实PureBasic可以干好多VC的事情,并且代码量要少得多(俺是个懒人),比如md5、jpeg解码编码等。
2、自己做一些简单的win32应用程序
PureBasic做出来的程序是全绿色的,不需要任何环境文件的支持,它自己有一套窗体和控件(自带窗体编辑器,功能比较全,使用起来稍微有点别扭),还可以直接使用WINAPI,更变态的是,支持rc文件,可以用resed等工具画对话框,当然也要通过WINAPI调用。
再来个小例子,打开窗口,载入JPG图片,用鼠标在上面移动,可以看到一个可随鼠标移动的框框:
1
;- Window Constants
2
Enumeration
3
#Window_0
4
EndEnumeration
5![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
6
;- Gadget Constants
7
Enumeration
8
#ctn_0
9
#Image_0
10
EndEnumeration
11![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
12
;- Image Plugins
13
UseJPEGImageDecoder()
14![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
15
;- Image Globals
16
Global Image0
17![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
18
;- Catch Images
19
Image0 = CatchImage(0, ?Image0)
20![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
21
;- Images
22
DataSection
23
Image0:
24
IncludeBinary "d:\back.JPG"
25
EndDataSection
26![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
27
Procedure Open_Window_0()
28
If OpenWindow(#Window_0, 258, 111, 410, 310,"ABC", #PB_Window_SystemMenu | #PB_Window_TitleBar )
29
If CreateGadgetList(WindowID(#Window_0))
30
ContainerGadget(#ctn_0,5,5,403,303,#PB_Container_Double)
31
ImageGadget(#Image_0, 0, 0, 400, 300, Image0)
32
CloseGadgetList()
33
EndIf
34
EndIf
35
EndProcedure
36![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
37
Global rcOldClip,oldproc,bDrawFlag,lastx=-1,lasty=-1
38![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
39
Procedure callback_img(hwnd, uMsg, wParam, lParam)
40
Protected x=lParam&$FFFF,y=(lParam>>16)&$FFFF
41
Select uMsg
42
Case #WM_PAINT
43
bDrawFlag=#False
44
lastx=lasty=-1
45
Case #WM_MOUSEMOVE
46
If bDrawFlag
47
hdc=GetDC_(hwnd);获取控件DC
48
hPen=CreatePen_(#PS_SOLID, 3, RGB(255,0,0));画笔
49
hBrush=GetStockObject_(#NULL_BRUSH);透明画刷
50
SelectObject_(hdc, hPen)
51
SelectObject_(hdc, hBrush)
52
SetROP2_(hdc,#R2_NOTXORPEN)
53
54
If lastx>=0
55
Rectangle_(hdc,lastx-50,lasty-50,lastx+50,lasty+50);覆盖上次画过的
56
EndIf
57
58
Rectangle_(hdc,x-50,y-50,x+50,y+50)
59
lastx=x:lasty=y
60
61
ReleaseDC_(hwnd,hdc)
62
EndIf
63
Case #WM_LBUTTONDOWN
64
bDrawFlag=#True
65
66
rcClip.RECT
67
68
GetWindowRect_(hwnd,@rcClip)
69
rcClip\left+51
70
rcClip\right-51
71
rcClip\top+51
72
rcClip\bottom-51
73
ClipCursor_(@rcClip)
74
75
Case #WM_RBUTTONDOWN
76
bDrawFlag=#False
77
ClipCursor_(@rcOldClip)
78
79
EndSelect
80
81
ProcedureReturn CallWindowProc_(oldproc, hwnd, uMsg, wParam, lParam)
82
83
EndProcedure
84![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
85
Open_Window_0()
86![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
87
;/init window
88
GetClipCursor_(@rcOldClip)
89![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
90
;/set callback
91
oldproc = SetWindowLong_(GadgetID(#Image_0), #GWL_WNDPROC, @callback_img())
92![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
93
Repeat ; Start of the event loop
94
Until WaitWindowEvent() = #PB_Event_CloseWindow ; End of the event loop
95
End
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
2
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
3
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
4
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
5
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
6
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
7
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
8
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
9
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
10
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
11
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
12
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
13
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
14
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
15
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
16
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
17
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
18
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
19
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
20
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
21
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
22
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
23
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
24
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
25
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
26
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
27
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
28
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
29
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
30
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
31
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
32
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
33
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
34
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
35
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
36
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
37
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
38
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
39
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
40
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
41
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
42
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
43
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
44
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
45
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
46
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
47
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
48
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
49
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
50
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
51
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
52
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
53
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
54
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
55
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
56
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
57
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
58
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
59
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
60
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
61
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
62
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
63
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
64
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
65
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
66
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
67
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
68
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
69
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
70
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
71
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
72
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
73
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
74
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
75
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
76
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
77
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
78
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
79
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
80
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
81
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
82
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
83
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
84
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
85
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
86
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
87
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
88
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
89
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
90
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
91
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
92
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
93
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
94
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
95
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
呵呵,这段代码是从原来的MFC程序迁移过来的,有些地方走了捷径,不过功能实现上没什么问题。
这段里可以看到callback的应用,winapi的应用和基于PureBasic自身功能的应用,当年用mfc做的时候,还要用gdiplus,头痛死了
3、这个东西本身也很好玩
PureBasic作为过程语言,不支持OOP,也就不支持com、activex,但是它偏偏支持Interface之类的功能,所以研究它本身也很有意思。
举例来说,c本身也不支持com,但是有高人搞出了DispachHelp,因为PureBasic可以看做C的BASIC实现,所以又有高人研究出了PureDispachHelp,于是俺就可以使用COM了。
PureBasic还有许多特性,简直就是为了俺们这些仰视C++又敬而远之的闲散人员设计的,呵呵,要不是因为它,俺也不会去学习C++
心得就这么多,总的感觉是:PureBasic不像VC那样,功能强大,但什么都得自己弄,也不想VB、PB那样,自身擅长的领域没有对手,出了自己的领域,什么都要靠别人。它有自身的特点,非常适合作为第二语言。