MFC之IP控件(IP地址与CString的互相转化)

在VS中,新建好工程后,点击工具箱---》IP Address Control ,就可以拖出来一个IP专属的控件啦

1.获得IP地址:

(1)法一

先获得控件的指针:

CIPAddressCtrl * pIP=(CIPAddressCtrl*)GetDlgItem(IDC_IPADDRESS);
BYTE nf1,nf2,nf3,nf4;
pIP->GetAddress(nf1,nf2,nf3,nf4);
CString str;
str.Format("%d.%d.%d.%d",nf1,nf2,nf3,nf4);//这里的nf得到的值是IP值了
MessageBox(str);

(2)法二

 DWORD dw;
 pIP->GetAddress(dw);
 CString str;
 WORD hiWord=HIWORD(dw);
 WORD loWord=LOWORD(dw);
 BYTE nf1=HIBYTE(hiWord);//如果不逆序的话,你最终输出的IP是反着的
 BYTE nf2=LOBYTE(hiWord);
 BYTE nf3=HIBYTE(loWord);
 BYTE nf4=LOBYTE(loWord);
 str.Format("%d.%d.%d.%d",nf1,nf2,nf3,nf4);
 MessageBox(str);

eg://将IPAddressCtrl中的IP地址获得并转换成CString型 

unsigned  char   *pIP; 
CString  strIP; 
DWORD  dwIP; 
m_ipAddr.GetAddress(dwIP); 
pIP  =   (unsigned   char*)&dwIP; 
strIP.Format("%u.%u.%u.%u",*(pIP+3),   *(pIP+2),  *(pIP+1),   *pIP);

2.设置IP地址

(1)法一

void SetAddress(BYTE nField0, BYTE nField1,BYTE nField2, BYTE nField3);

void SetAddress(DWORD dwAddress);

eg1:

pIP->SetAddress(127,0,0,1);
pIP->SetAddress((DWORD)0x7F000001);//这两行的效果都是一样的

eg2://将CString型IP地址在IPAddressCtrl中显示

CString  strIP="192.168.0.10"; 
DWORD  dwIP; 
dwIP  =   inet_addr(strIP); 
unsigned  char   *pIP   =  (unsigned   char*)&dwIP; 
m_ipAddr.SetAddress(*pIP,   *(pIP+1),  *(pIP+2),   *(pIP+3));

(2)法二

void SetFieldRange(int nField, BYTE nLower,BYTE nUpper);

设置每一个域的范围:nField是0到3的值,表示域的下标;nLower和nUpper的范围都是0到255,可以超出范围,但控件也还是默认设置回0到255的。

eg:

pIP->SetFieldRange(0,5,127);//设置每一个域的范围,第一个参数是域的下标,第二和第三个是范围
pIP->SetFieldRange(1,5,127);//当输入比5少时,如0,当失去输入焦点时,它会重置为5
pIP->SetFieldRange(2,5,127);//当输入比127大时,如128,它会自动变回127
pIP->SetFieldRange(3,5,127);

或者直接简单地使用SetWindowText、GetWindowText方法,但是一般你界面做的都是用户自己输入IP再获得并在程序中转换,或者你读取本机IP之类的再显示在窗体中,所以这两个方法一般很少用,最好还是掌握上面的用法。

//CIPAddressCtrl的值转换成CString

CString strIP="192.168.1.184";
m_IPAddr.SetWindowText(strIP);
CString strIP;
m_IPAddr.GetWindowText(strIP);

//CString转换成CIPAddressCtrl

CString strIP="192.168.1.184";
DWORD dwAddress= ntohl( inet_addr(strIP));
m_IPAddr.SetAddress(dwAddress);

//ntohl():将u_short类型的TCP/IP网络字节顺序格式IP地址转换为主机字节顺序

//inet_addr():将点分法IP地址字符串转换为in_addr结构体中的IP地址格式

我第一次用的时候就是用的上面这种方法,将IP地址如"127.0.0.1"通过ntohl()和inet_addr()转换并存到IP控件的DWORD类型的变量中。

补充:如果用到IP地址,你最好用它特有的CIPAddressCtrl控件,当然了,你也可以用编辑框,但这样的话,你不可避免地要判断用户输入的IP是否合法。

判断IP地址是否合法的标准如下:

  • 字符串中必须包含3个符号“.”;
  • 被符号“.”分隔的4个字符串的长度必须小于或等于3;
  • 被符号“.”分隔的4个字符串必须可以转换成整数;
  • 被符号“.”分隔的4个字符串转换成的整数不得大于255
bool IsValidIP(char *ip)
{
         std::string sip=ip;
         int pos=(int)sip.find_first_of(“.“);//查找第1个符号“.”的位置
         if(pos==0)//如果没有找到,则返回false
                   return false;
         std::string s1=sip.substr(0,pos);//s1是IP地址中的第1个数字
         sip=sip.substr(pos+1,sip.length()-pos);
         if(s1.length()>3)
                   return false;
         for(int i=0;i<(int)s1.length();i++)//判断是否每个字符都是数字
         {
                   intc=s1.c_str()[i];
                   if(!isdigit(c))
                            return false;
         }
         inta=atoi(s1.c_str());//判断是否在1~255之间
         if(a<1|| a>255)
                   return false;
         pos=(int)sip.find_first_of(“.”);
         std::strings2=sip.substr(0,pos); //s2是IP地址中的第2个数字
         sip=sip.substr(pos+1,sip.length()-pos);
         if(s2.length()>3)
                   return false;
         for(int i=0;i<(int)s2.length();i++)//判断是否每个字符都是数字
         {
                   int c=s2.c_str()[i];
                   if(!isdigit(c))
                            return false;
         }
         a=atoi(s2.c_str());
         if(a>255)//判断是否在0~255之间
                   return false;
         pos=(int)sip.find_first_of(“.”);
         std::string s3=sip.substr(0,pos); //s3是IP地址中的第3个数字
         sip=sip.substr(pos+1,sip.length()-pos);
         if(s3.length()>3)
                   return false;
         for(int i=0;i<(int)s3.length();i++)//判断是否每个字符都是数字
         {
                   int c=s3.c_str()[i];
                   if(!isdigit(c))
                            return false;
         }
         a=atoi(s3.c_str());
         if(a>255)//判断是否在0~255之间
                   return false;
         pos=(int)sip.find_first_of(“.”);
         std::strings4=sip.substr(0,pos); //s4是IP地址中的第4个数字
         sip=sip.substr(pos+1,sip.length()-pos);
         if(s4.length()>3)
                   return false;
         for(int i=0;i<(int)s4.length();i++)//判断是否每个字符都是数字
         {
                   int c=s4.c_str()[i];
                   if(!isdigit(c))
                            return false;
         }
         a=atoi(s4.c_str());
         if(a>254)//判断是否在0~254之间
                   return false;
         //通过上面所有检测后,确定该字符串为合法IP地址
         return true;
}

猜你喜欢

转载自blog.csdn.net/mikasoi/article/details/81592408