摘 要:本文通过调用包含WINDOWS系统公共控件的公用控件动态链接库COMCTL32.DLL,在POWERBUILDER中实现IP地址控件的设置,并通过一个简单的应用程序给出检测实例。
关键字: 公用控件动态链接库、IP地址控件、用户对象
POWERBUILDER(以下简称PB)是一个用来进行客户/服务器开发的完全可视化开发环境,采用面向对象技术,图形化的应用开发环境,是数据库的前端开发工具,可以用一种可视的直观的方式来创建应用程序的用户界面和数据库接口。PB采用的是目前流行的图形化的界面和可视化的编程方法,通过引入独具特色的数据窗口对象,使得程序员可以可视化地完成对数据库的操作。PB提供了较为丰富的控件,特别是7.0版新增了ProgressBar、TrackBar等控件,但仍有不少Windows公共控件没有利用起来,如IP Address、StatusBar等。文本将就如何使用IP地址控件展开讨论,并给出一个测试IP控件的实例供大家参考。
一、引出问题
WINDOWS系统的公共控件都存放在公用控件动态链接库(命名为COMCTL32.DLL)中,该DLL负责WINDOWS使用的所有控制。WINDOWS95首先使用该库,版本号为4.0。IE3.x升级它为4.70,IE4.0的版本为4.71,现在IE6.0中的版本在6.x.x。MICROSOFT封装了很多函数在该动态链接库中。随着WINDOWS版本的升高,用户Win32界面控制和通用界面控制结合在 COMCTL32.Dll版本6.0中。这里提醒大家,COMCTL32.DLL版本6.0 无法在早于WINDOWS XP的WINDOWS 上使用。
图1:COMCTL32.DLL演化
自己的软件支持自己的产品,微软在它的编程软件VISUAL STUDIO系列中,已经将IPAddress控件封装到软件中,用户可以直接调用该控件,如图2所示:
图2:Visual C++ 6.0中的IP控件
二、PB中实现IP控件
PB中调用包含公共控件的WINDOWS动态链接库,一般是通过将其封装在外部控件用户对象中来实现的,方便以后在布局视图中将它作为用户对象控件布置在窗口或可视用户对象上。在这里我们通过建立两个USER OBJECT调用Dll文件。
2.1 IP地址控件基本函数对象(nvo_comctl_ipaddress)
图3:IP地址控件基本函数
nvo_comctl_ipaddress中通过函数设置了ip控件的接口。下面将几个比较重要的函数介绍给大家。
2.1.1 of_create(long alparent,long alwidth,long alheight,long alx,long aly) return long
// 利用API函数CreateWindowEX创建IPAddress控件对象
Constant long WS_CHILD= 1073741824
Constant long WS_VISIBLE = 268435456
long llHandle
long llLeft, llTop, llRight, llBottom
IF IsWindow( This.ilHandle ) THEN RETURN This.ilHandle
// 创建IPAddress
llHandle = CreateWindowExA( &
0, /* 没有扩展模式*/ &
WC_IPADDRESS, /* 注册Windows类 */ &
"", /* 没有windows名称 */ &
WS_CHILD + WS_VISIBLE, &
0, 0, 0, 0, /* 窗口位置 */ &
alParent, /* 父类窗口*/ &
ID_IPADDRESS, /* 控件ID */ &
Handle(GetApplication()), /*应用程序句柄 */ &
0) /* 指向Windows创建数据区*/
// 检测窗口是否创建成功
IF IsWindow(llHandle) THEN
// 保存窗口句柄
This.ilHandle = llHandle
END IF
RETURN llHandle // 返回CreateWindowEX函数结果
***********************************************************************
2.1.2 of_dec2bin(unsignedlong alnbr) returns string
//将十进制转化为二进制
string lsBinary
DO WHILE (alNbr > 0)
lsBinary = String( Mod( alNbr, 2 ) ) + lsBinary
alNbr = alNbr / 2
LOOP
RETURN lsBinary
***********************************************************************
2.1.3 of_getaddress(ref integer aifirst,ref integer aisecond,ref integer aithird,ref integer aifourth) returns boolean
//获取IPAddress控件值
// field 3 包含0到7位.
// field 2 包含8到15位.
// field 1包含16到23位.
// field 0包含24到31位.
// 0 会被视为空白处理
long llRetVal
boolean lbGetAddress = FALSE
ulong llAddress
string lsBinary
IF IsWindow( This.ilHandle ) THEN
llRetVal = SendMessageLong( This.ilHandle, IPM_GETADDRESS, 0, llAddress )
//将地址转化成二进制字符串
lsBinary = This.of_Dec2Bin( llAddress )
lsBinary = Fill( '0', 32 - Len(lsBinary) ) + lsBinary
aiFirst = This.of_Bin2Dec( Mid( lsBinary, 1, 8 ) )
aiSecond = This.of_Bin2Dec( Mid( lsBinary, 9, 8 ) )
aiThird = This.of_Bin2Dec( Mid( lsBinary, 17, 8 ) )
aiFourth = This.of_Bin2Dec( Mid( lsBinary, 25, 8 ) )
lbGetAddress = TRUE
END IF
RETURN lbGetAddress
***********************************************************************
2.1.4 of_initcommoncontrol() returns long
// INTERNET 公共控件初始化,注册windows类
INITCOMMONCONTROLS lICC
lICC.dwSize = 2 * 4
lICC.dwICC = ICC_INTERNET_CLASSES
// 初始化数据公共控件
InitCommonControlsEx( lICC )
RETURN 0
***********************************************************************
2.1.5 Of_getobject(ref nvo_comctl_ipaddress auoipaddress) return boolean
//获取IPAddress控件句柄
auoIPAddress = This.iuoIPAddress
RETURN IsValid( auoIPAddress )
***********************************************************************
2.3 IP地址控件可视化对象(uo_comctl_ipaddress)
图4:IP地址控件可视化对象
创建这个用户对象,主要是方便用户在实际工程中调用IPAddress控件。在该对象的变量中声明nvo_comctl_ipaddress对象的可视化对象iuoIPAddress,语句为:
Protected nvo_comctl_ipaddress iuoIPAddress
在该对象的属性列表中设置如下:
LibraryName = comctl32.dll
ClassName = sysipaddress32
三、PB编制的IP地址实例
这样,我们所需要的调用Window公共控件的两个用户对象就创建好了,下面我们建立一个窗口测试,下面是整个测试程序的创建过程。
3.1 创建一个应用程序iptest.bpl(如果是PowerBuilder8.0以上首先需要创建同名工程iptest.pbw)。
3.2 引入刚才创建的用户对象:IP地址控件基本函数对象(nvo_comctl_ipaddress)和IP地址控件可视化对象(uo_comctl_ipaddress)。
3.3 创建窗口w_Iptest用于插入IP控件。
(1)插入一个StaticText控件st_1: st_1.text = 输入IP地址:
(2)插入用户对象: uo_comctl_ipaddress
通过PB的Insert菜单,选择“Control”子菜单,然后选择最下面的“User Object…”,最后在对话框中选择uo_comctl_ipaddress对象。
(3)插入一个CommandButton控件cb_1:
cb_1.text = 显示IP地址
在cb_1.clicked()事件中写入以下脚本:
//初始化IPAddress控件
nvo_comctl_ipaddress luoIPAddress
//设置4个整型变量存放IP地址
integer liFirst, liSecond, liThird, liFourth
//调用IPAddress控件的接口函数of_GetObject()判断是否可获取IP值
IF uo_IPAddress.of_GetObject( luoIPAddress ) THEN
//调用IPAddress控件的接口函数of_ GetAddress ()获取IP值
luoIPAddress.of_GetAddress( liFirst, liSecond, liThird, liFourth )
st_1.Text = String( liFirst ) + "." + &
String( liSecond ) + "." + &
String( liThird ) + "." + &
String( liFourth )
END IF
RETURN 0
***********************************************************************
3.4 在iptest.bpl的Application的open()事件中,写下如下程序:
//创建IP地址控件基本函数对象实例luoIPAddress
nvo_comctl_ipaddress luoIPAddress
// 对该实例进行初始化
luoIPAddress.of_InitCommonControls()
Open( w_IPtest )
RETURN
***********************************************************************
整个测试程序就基本配置完成了,运行一下,结果如图4所示:
图5:测试IP控件实例
四、小结
通过上面的IP控件设计和实例验证,希望对读者在PB中实现IP地址控件的开发有帮助,更进一步讲,希望能给读者以下启示:
同样是开发软件,微软的不一定最完善,但肯定最人性化,方便用户使用。因此,如果仅仅是为了实现某项功能,能用微软软件简单实现的,尽量不要用其他软件开发。
对于和Window底层调用关系比较密切的开发项目,尽量用微软的软件编制。或者用微软软件制作与底层交互的程序后编译成DLL文件,然后在其它软件中调用。
当然微软的也不一定是最好用的,比如在制作数据库系统中,PB就比VC好用的多,如果在这类开发项目中需要和Windows底层打交道,最好调用Windows自带的Dll动态链接库,而不是通过开发软件编制实现,那样会事倍功半。
Windows的公用控件动态链接库COMCTL32.DLL中基本包含了Windows系统中所能见到的绝大部分控件,如果要在开发项目中使用这类控件,多研究研究这个动态链接库。
参考文献
1. Charles Petzold (美). Windows程序设计. 北京大学出版社,1999
2. 博嘉科技. Windows API for 2000/XP实例精解. 电子工业出版社,2002
3. 用Windows公共控件增强PB应用的界面.HTTP://WWW.SYBASE.COM.CN
|