你好,欢迎来到电脑编程技巧与维护杂志社! 杂志社简介广告服务读者反馈编程社区  
合订本订阅
 
 
您的位置:杂志经典 / 网络与通信
PowerBuilder中调用公用控件动态链接库实现IP地址控件
 

 要:本文通过调用包含WINDOWS系统公共控件的公用控件动态链接库COMCTL32.DLL,在POWERBUILDER中实现IP地址控件的设置,并通过一个简单的应用程序给出检测实例。

关键字:  公用控件动态链接库、IP地址控件、用户对象

 

POWERBUILDER(以下简称PB)是一个用来进行客户/服务器开发的完全可视化开发环境,采用面向对象技术,图形化的应用开发环境,是数据库的前端开发工具,可以用一种可视的直观的方式来创建应用程序的用户界面和数据库接口。PB采用的是目前流行的图形化的界面和可视化的编程方法,通过引入独具特色的数据窗口对象,使得程序员可以可视化地完成对数据库的操作。PB提供了较为丰富的控件,特别是7.0版新增了ProgressBarTrackBar等控件,但仍有不少Windows公共控件没有利用起来,如IP AddressStatusBar等。文本将就如何使用IP地址控件展开讨论,并给出一个测试IP控件的实例供大家参考。

一、引出问题

WINDOWS系统的公共控件都存放在公用控件动态链接库(命名为COMCTL32.DLL)中,该DLL负责WINDOWS使用的所有控制。WINDOWS95首先使用该库,版本号为4.0IE3.x升级它为4.70IE4.0的版本为4.71,现在IE6.0中的版本在6.x.xMICROSOFT封装了很多函数在该动态链接库中。随着WINDOWS版本的升高,用户Win32界面控制和通用界面控制结合在 COMCTL32.Dll版本6.0中。这里提醒大家,COMCTL32.DLL版本6.0 无法在早于WINDOWS XPWINDOWS 上使用。

1COMCTL32.DLL演化

自己的软件支持自己的产品,微软在它的编程软件VISUAL STUDIO系列中,已经将IPAddress控件封装到软件中,用户可以直接调用该控件,如图2所示:

2Visual C++ 6.0中的IP控件

二、PB中实现IP控件

PB中调用包含公共控件的WINDOWS动态链接库,一般是通过将其封装在外部控件用户对象中来实现的,方便以后在布局视图中将它作为用户对象控件布置在窗口或可视用户对象上。在这里我们通过建立两个USER OBJECT调用Dll文件。

2.1 IP地址控件基本函数对象(nvo_comctl_ipaddress

3IP地址控件基本函数

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 包含07.

//          field 2 包含815.

//          field 1包含1623.

//          field 0包含2431. 

//          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

4IP地址控件可视化对象

创建这个用户对象,主要是方便用户在实际工程中调用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

通过PBInsert菜单,选择“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.bplApplicationopen()事件中,写下如下程序:

//创建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

  推荐精品文章

·2024年2月目录 
·2024年1月目录
·2023年12月目录
·2023年11月目录
·2023年10月目录
·2023年9月目录 
·2023年8月目录 
·2023年7月目录
·2023年6月目录 
·2023年5月目录
·2023年4月目录 
·2023年3月目录 
·2023年2月目录 
·2023年1月目录 

  联系方式
TEL:010-82561037
Fax: 010-82561614
QQ: 100164630
Mail:gaojian@comprg.com.cn

  友情链接
 
Copyright 2001-2010, www.comprg.com.cn, All Rights Reserved
京ICP备14022230号-1,电话/传真:010-82561037 82561614 ,Mail:gaojian@comprg.com.cn
地址:北京市海淀区远大路20号宝蓝大厦E座704,邮编:100089