IP地址控件 (SIPAddressCtrl)¶
Warning
The current page still doesn't have a translation for this language.
You can read it through google translate.
SOUI中的IP地址输入控件,提供了标准的IP地址输入界面,支持IPv4地址的输入和验证。
基本信息¶
- 类名:
SIPAddressCtrl
- 控件标签:
ipaddressctrl
- 基类:
SWindow
- 功能:提供IPv4地址的输入和验证功能
属性说明¶
该控件在 Ctrl.xml 中没有定义特殊属性,继承自 SWindow 的通用属性。
使用示例¶
基础IP地址控件¶
<!-- 基础IP地址控件 -->
<ipaddressctrl pos="10,10,200,35" name="ip_basic"/>
只读IP地址控件¶
<!-- 只读IP地址控件 -->
<ipaddressctrl pos="10,45,200,70" name="ip_readonly"/>
自定义样式的IP地址控件¶
<!-- 自定义样式的IP地址控件 -->
<ipaddressctrl pos="10,80,200,105" name="ip_custom"
colorText="#000000" colorBkgnd="#FFFFFF"/>
代码操作¶
// 查找IP地址控件
SIPAddressCtrl *pIPCtrl = FindChildByName2<SIPAddressCtrl>(L"ip_basic");
// 设置IP地址
DWORD dwIP = 0;
inet_pton(AF_INET, "192.168.1.1", &dwIP);
pIPCtrl->SetAddress(dwIP);
// 获取IP地址
DWORD dwCurrentIP = 0;
pIPCtrl->GetAddress(dwCurrentIP);
// 清空IP地址
pIPCtrl->ClearAddress();
// 设置字段焦点
pIPCtrl->SetFieldFocus(0);
事件处理¶
IP地址控件支持以下事件:
事件名 | EventID | 说明 |
---|---|---|
EVT_IPADDRESS_CHANGED | EventIPAddressChanged::EventID | IP地址改变事件 |
// 事件处理示例
EVENT_MAP_BEGIN()
EVENT_NAME_HANDLER(L"ip_basic", EventIPAddressChanged::EventID, OnIPAddressChanged)
EVENT_MAP_END()
void OnIPAddressChanged(IEvtArgs *pEvt)
{
EventIPAddressChanged *pRealEvt = sobj_cast<EventIPAddressChanged>(pEvt);
DWORD dwIP = pRealEvt->dwIP;
// 处理IP地址改变事件
}
最佳实践¶
- 输入验证:IP地址控件自带验证功能,确保输入的是有效的IPv4地址
- 样式统一:通过通用属性保持与其他输入控件的样式一致性
- 事件处理:正确处理 IP 地址改变事件,及时响应用户输入
常见问题¶
Q: IP地址格式不正确怎么办?¶
A: 控件自带格式验证,无效输入会被拒绝或显示错误状态。
Q: 如何获取有效的IP地址?¶
A: 通过 GetAddress 方法获取 DWORD 格式的 IP 地址。
Q: 如何清空IP地址?¶
A: 调用 ClearAddress 方法清空所有字段。
代码示例解析¶
让我们看一个更复杂的IP地址控件示例:
// 头文件包含
#include <core/SWindow.h>
#include <control/SIPAddressCtrl.h>
class CMainDlg : public SHostWnd
{
protected:
// IP地址控件相关变量
SIPAddressCtrl *m_pIPCtrl;
void OnInit()
{
// 获取IP地址控件
m_pIPCtrl = FindChildByName2<SIPAddressCtrl>(L"ip_demo");
if(m_pIPCtrl)
{
// 设置初始IP
DWORD dwIP = 0;
inet_pton(AF_INET, "192.168.1.1", &dwIP);
m_pIPCtrl->SetAddress(dwIP);
// 订阅IP变化事件
m_pIPCtrl->GetEventSet()->subscribeEvent(
EventIPAddressChanged::EventID,
Subscriber(&CMainDlg::OnIPAddressChanged, this));
}
}
// IP地址变化事件处理
bool OnIPAddressChanged(EventIPAddressChanged *pEvt)
{
if(!pEvt) return true;
SIPAddressCtrl *pIPCtrl =
sobj_cast<SIPAddressCtrl>(pEvt->sender);
if(!pIPCtrl) return true;
DWORD dwIP = 0;
if(pIPCtrl->GetAddress(&dwIP))
{
// 转换为字符串形式
char szIP[16] = {0};
inet_ntop(AF_INET, &dwIP, szIP, sizeof(szIP));
// 验证IP地址格式
bool bValidIP = IsValidIPAddress(szIP);
// 更新界面显示
SStatic *pText = FindChildByName2<SStatic>(L"text_ip");
if(pText)
{
SStringT strInfo;
if(bValidIP)
{
strInfo.Format(L"当前IP:%s",
S_CA2W(szIP, CP_UTF8));
pText->SetAttribute(L"colorText", L"#000000");
}
else
{
strInfo = L"无效的IP地址";
pText->SetAttribute(L"colorText", L"#FF0000");
}
pText->SetWindowText(strInfo);
}
// 保存有效的IP地址
if(bValidIP)
{
SaveIPAddress(szIP);
}
}
return true;
}
// 验证IP地址格式
bool IsValidIPAddress(const char *szIP)
{
if(!szIP) return false;
struct sockaddr_in sa;
return inet_pton(AF_INET, szIP, &(sa.sin_addr)) == 1;
}
// 保存IP地址
void SaveIPAddress(const char *szIP)
{
// TODO: 实现IP地址保存逻辑
}
};
这个示例展示了: 1. 如何初始化IP地址控件 2. 如何处理IP地址变化事件 3. 如何验证IP地址格式 4. 如何与其他控件交互