`
huozheleisi
  • 浏览: 1238296 次
文章分类
社区版块
存档分类
最新评论

IP地址控件CIPAddressCtrl类的使用

 
阅读更多

在VC++中,如果想要输入IP地址可使用IP地址控件,该控件是一个与编辑控件类似的控件,可用于输入IP地址。

在对话框中放入此控件后,可以为控件定义一个 CIPAddressCtrl类 的变量对它进行控制。

CIPAddressCtrl类 的主要成员函数有:

void ClearAddress();
清除IP地址控件中的内容。

BOOL IsBlank();
如果IP地址控件的所有域均为空,返回非0值;否则返回0。

void SetAddress(BYTE nField0,BYTE nField1,BYTE nField2,BYTE nField3);
void SetAddress(DWORD dwAddress);
设置IP地址控件中的地址值。
第一种形式是用4个0~255的整数分别设置IP地址各个域的值。
第二种形式是用1个长整数设置IP地址值。

int GetAddress(BYTE& nField0,BYTE& nField1,BYTE& nField2,BYTE& nField3);
int GetAddress(DWORD& dwAddress);
获取IP地址控件中的地址值。
第一种形式是把IP地址的4个域填充到用4个引用中。
第二种形式是把IP地址填充到1个长整数的引用中。
返回值:IP地址控件中非空域的数量。

void SetFieldFocus(WORD nField);
把焦点设置在指定的域中。nField取值为0~3,如果大于3,则焦点设置到第一个空域中,若所有域均非空,则焦点设置在第一个域中。

void SetFieldRange(int nField,BYTE nLower,BYTE nUpper);
设置指定域中数值的取值范围。
nField:域索引,取值0~3;
nLower:域的下限;
nUpper:域的上限。

下面的例子摹仿为计算机设置IP地址的对话框看一下IP地址控件的用法。

对话框建立后,创建一个CSetIPDialog类来控制该对话框。

为对话框中的各控件添加相应的控制变量。

SetIPDialog.h:

//{{AFX_DATA(CSetIPDialog)
enum { IDD = IDD_SETIP_DIALOG };
CIPAddressCtrl m_IPAddressCtrl3;
CIPAddressCtrl m_IPAddressCtrl2;
CIPAddressCtrl m_IPAddressCtrl1;
CStatic m_IPStatic3;
CStatic m_IPStatic2;
CStatic m_IPStatic1;
int IP_From;
//}}AFX_DATA

SetIPDialog.cpp:

void CSetIPDialog::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CSetIPDialog)
DDX_Control(pDX, IDC_IPADDRESS3, m_IPAddressCtrl3);
DDX_Control(pDX, IDC_IPADDRESS2, m_IPAddressCtrl2);
DDX_Control(pDX, IDC_IPADDRESS1, m_IPAddressCtrl1);
DDX_Control(pDX, IDC_IP_STATIC3, m_IPStatic3);
DDX_Control(pDX, IDC_IP_STATIC2, m_IPStatic2);
DDX_Control(pDX, IDC_IP_STATIC1, m_IPStatic1);
DDX_Radio(pDX, IDC_IPFROM_RADIO1, IP_From);
//}}AFX_DATA_MAP
}

m_IPAddressCtrl1对应输入IP地址的控件;

m_IPAddressCtrl2对应输入子网掩码的控件;

m_IPAddressCtrl3对应输入默认网关的控件;

变量IP_From对应于单选按钮的位置,当IP_From==0时,表示IP地址是自动获取的,此时,各IP地址控件为灰色显示,不能进行设置。当IP_From==1时,可以设置IP地址。函数EnableIP()可根据IP_From的值设置各IP地址控件的可用性:

void CSetIPDialog::EnableIP()
{
BOOL show = (IP_From==1);
m_IPStatic1.EnableWindow( show );
m_IPStatic2.EnableWindow( show );
m_IPStatic3.EnableWindow( show );
m_IPAddressCtrl1.EnableWindow( show );
m_IPAddressCtrl2.EnableWindow( show );
m_IPAddressCtrl3.EnableWindow( show );
}

用ClassWizard添加单选按钮的响应函数:

//消息函数:自动获取(单选按钮)
void CSetIPDialog::OnIPFromRadio1()
{
IP_From = 0;
m_IPAddressCtrl1.ClearAddress();
m_IPAddressCtrl2.ClearAddress();
m_IPAddressCtrl3.ClearAddress();
EnableIP();
}

//消息函数:手工配置(单选按钮)
void CSetIPDialog::OnIPFromRadio2()
{
IP_From = 1;
EnableIP();
m_IPAddressCtrl1.SetFieldFocus( 0 );
}

当选中“自动获取”的单选按钮时,用ClearAddress()函数清除各IP地址控件的内容,然后把控件设置为灰色。

当选中“手工配置”的单选按钮时,让各IP地址控件可用,并且把输入焦点设置第1个IP地址控件的第0个域中。

子网掩码的输入:

按照习惯,当输入了IP地址后,只要单击输入子网掩码的IP地址控件就可以自动生成默认的子网掩码。为了实现这一点,可以用添加一个新类CSubnetMaskCtrl,基类为CIPAddressCtrl。

在该类中加入一个变量CIPAddressCtrl* p_IPAddressCtrl;

该变量是指向输入IP地址的控件的指针,用于获取控件中输入的IP地址。

在CSubnetMaskCtrl中添加一个消息函数OnSetfocus(),当子网掩码控件获得输入焦点时会执行此函数。

(注:此函数响应的是EN_SETFOCUS消息,在ClassWizard中没有此消息,所以只能手工添加。)

SubnetMaskCtrl.h:

protected:
//{{AFX_MSG(CSubnetMaskCtrl)
// NOTE - the ClassWizard will add and remove member functions here.
//}}AFX_MSG
afx_msg void OnSetfocus();
DECLARE_MESSAGE_MAP()

SubnetMaskCtrl.cpp:

BEGIN_MESSAGE_MAP(CSubnetMaskCtrl, CIPAddressCtrl)
//{{AFX_MSG_MAP(CSubnetMaskCtrl)
// NOTE - the ClassWizard will add and remove mapping macros here.
//}}AFX_MSG_MAP
ON_CONTROL_REFLECT(EN_SETFOCUS, OnSetfocus)
END_MESSAGE_MAP()

void CSubnetMaskCtrl::OnSetfocus()
{
if( p_IPAddressCtrl && IsBlank() )
{
BYTE field0, field1, field2, field3;
p_IPAddressCtrl->GetAddress( field0, field1, field2, field3 );
if( field0>=1 && field0<=127 )
SetAddress( 255, 0, 0, 0 );
else if( field0>=128 && field0<=191 )
SetAddress( 255, 255, 0, 0 );
else if( field0>=192 && field0<=223 )
SetAddress( 255, 255, 255, 0 );
}
}

在函数中,如果子网掩码为空,就通过p_IPAddressCtrl指针获取用户输入的IP地址,然后根据IP地址的第1个数的取值设置本控件中的子网掩码默认值。

回到CSetIPDialog对话框,把用于输入子网掩码的IP地址控件的类型改为CSubnetMaskCtrl。

SetIPDialog.h:

//{{AFX_DATA(CSetIPDialog)
enum { IDD = IDD_SETIP_DIALOG };
CIPAddressCtrl m_IPAddressCtrl3;
CSubnetMaskCtrl m_IPAddressCtrl2;
CIPAddressCtrl m_IPAddressCtrl1;
CStatic m_IPStatic3;
CStatic m_IPStatic2;
CStatic m_IPStatic1;
int IP_From;
//}}AFX_DATA

用ClassWizard添加对话框的初始化函数。

BOOL CSetIPDialog::OnInitDialog()
{
CDialog::OnInitDialog();

m_IPAddressCtrl2.p_IPAddressCtrl = &m_IPAddressCtrl1;

return TRUE;
}

在这里把输入IP地址的控件地址传送给子网掩码控件。

经过以上设置,该对话框就可以用来输入IP地址、子网掩码、默认网关等参数了,至于输入值的保存,可根据实际应用另行设置。

在实例中,我定义了一个名为CPC的类存放由对话框设置的IP地址。具体情况可以参考示例程序。

http://221.199.150.103/jsj/Html/vc/wen/vcwen15.htm
分享到:
评论

相关推荐

    使用IP地址控件显示和设置IP地址

    使用IP地址控件显示和设置IP地址,很实用,经常会用到哦

    IP地址输入控件的用法

    该实例简单明了的演示了MFC里的CIPAddressCtrl(IP地址控件)的用法。

    可改变背景色的CIPAddressCtrl派生类源码

    CIPAddressCtrl控件派生类一直不怎么好改变背景色,但有一种方法可以让其改变,请参考源码。

    CWnd 自绘实现CIPAddressCtrl

    CWnd 自绘实现CIPAddressCtrlCWnd 自绘实现CIPAddressCtrl

    部分MFC和API函数

    CIPAddressCtrl类:提供了IP地址控件的功能 CImageList类:管理大小相同的图标或位图集 CMenu类:封装应用程序菜单栏和弹出式菜单 CPen类:封装了Windows图形设备接口(GDI)中的画笔对象 CPoint类:操作CPoint和POINT...

    常用MFC和API函数

    CIPAddressCtrl类:提供了IP地址控件的功能 CImageList类:管理大小相同的图标或位图集 CMenu类:封装应用程序菜单栏和弹出式菜单 CPen类:封装了Windows图形设备接口(GDI)中的画笔对象 CPoint类:操作CPoint和...

    用MFC控件,进行网络编程(2)

    一个完整的网络聊天室源程序,用VC++6.0开发。

    ipaddresscontrollib:自动从code.google.compipaddresscontrollib导出

    ipaddresscontrollib介绍Microsoft为什么不在Visual Studio .NET的常规工具箱中包含IP地址控件? 最近,我在C#应用程序中需要类似于MFC CIPAddressCtrl类的内容,并且被迫自己滚动。 我尝试使用C#模仿...

    MFC类库详解中文版(chm)

    CIPAddressCtrl IP地址控件。类似于编缉框,该控件接收Internet 协议格式的地址 afxcmn.h CList afxtempl.h CListBox 列表框对象 afxwin.h CListCtrl 列表视通用控件 afxcmn.h ClistView 简化CListCtrl的使用,...

    新一代 Visual C++2005程序设计 part2

    第17章 使用ActiveX控件 439 17.1 ActiveX控件的由来 439 17.2 使用ActiveX控件 440 17.3 设计ActiveX容器 442 第18章 进程、线程与内存 447 18.1 Win32的内存管理 447 18.2 Process简介 451 18.2.1 产生子...

    基于MFC的聊天室

    为控件IDC_IPADDRESS1 增加Control变量 CIPAddressCtrl m_remoteIP 为控件IDC_EDIT_RECV 增加Value变量 CString m_strRecv 为控件IDC_EDIT_SEND 增加Value变量 CString m_strSend 步骤4. 在stdafx.h增加以下六行...

    点对点文件传输程序(传输文件夹内的内容)

    if(((CIPAddressCtrl*)GetDlgItem(IDC_IPADDRESS))-&gt;IsBlank()) { MessageBox("IP 地址不能为空", "错误", MB_ICONHAND); return ; } //创建客户端套接字 m_psockClient = new CClientSocket...

    基于VC++的简单聊天程序

    CIPAddressCtrl* pIPAddress = ((CIPAddressCtrl*)GetDlgItem(IDC_IPADDRESS_SEND)); if (pIPAddress-&gt;IsBlank()) { MessageBox(L"请先输入对方IP地址!"); return; } DWORD dwIP; pIPAddress-&gt;GetAddress(dwIP); ...

    VC编写的聊天程序

    //自行添加的程序代码,目的是在初始化对话框的时候就自动显示出本地的ip地址 if(AfxSocketInit(NULL)==0) { AfxMessageBox("CSocket 初始化失败!"); } BYTE f0,f1,f2,f3; CString name; CClientSocket::...

Global site tag (gtag.js) - Google Analytics