在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地址。具体情况可以参考示例程序。
|
相关推荐
使用IP地址控件显示和设置IP地址,很实用,经常会用到哦
该实例简单明了的演示了MFC里的CIPAddressCtrl(IP地址控件)的用法。
CIPAddressCtrl控件派生类一直不怎么好改变背景色,但有一种方法可以让其改变,请参考源码。
CWnd 自绘实现CIPAddressCtrlCWnd 自绘实现CIPAddressCtrl
CIPAddressCtrl类:提供了IP地址控件的功能 CImageList类:管理大小相同的图标或位图集 CMenu类:封装应用程序菜单栏和弹出式菜单 CPen类:封装了Windows图形设备接口(GDI)中的画笔对象 CPoint类:操作CPoint和POINT...
CIPAddressCtrl类:提供了IP地址控件的功能 CImageList类:管理大小相同的图标或位图集 CMenu类:封装应用程序菜单栏和弹出式菜单 CPen类:封装了Windows图形设备接口(GDI)中的画笔对象 CPoint类:操作CPoint和...
一个完整的网络聊天室源程序,用VC++6.0开发。
ipaddresscontrollib介绍Microsoft为什么不在Visual Studio .NET的常规工具箱中包含IP地址控件? 最近,我在C#应用程序中需要类似于MFC CIPAddressCtrl类的内容,并且被迫自己滚动。 我尝试使用C#模仿...
CIPAddressCtrl IP地址控件。类似于编缉框,该控件接收Internet 协议格式的地址 afxcmn.h CList afxtempl.h CListBox 列表框对象 afxwin.h CListCtrl 列表视通用控件 afxcmn.h ClistView 简化CListCtrl的使用,...
第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 产生子...
为控件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))->IsBlank()) { MessageBox("IP 地址不能为空", "错误", MB_ICONHAND); return ; } //创建客户端套接字 m_psockClient = new CClientSocket...
CIPAddressCtrl* pIPAddress = ((CIPAddressCtrl*)GetDlgItem(IDC_IPADDRESS_SEND)); if (pIPAddress->IsBlank()) { MessageBox(L"请先输入对方IP地址!"); return; } DWORD dwIP; pIPAddress->GetAddress(dwIP); ...
//自行添加的程序代码,目的是在初始化对话框的时候就自动显示出本地的ip地址 if(AfxSocketInit(NULL)==0) { AfxMessageBox("CSocket 初始化失败!"); } BYTE f0,f1,f2,f3; CString name; CClientSocket::...