Skip to content

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地址改变事件
}

最佳实践

  1. 输入验证:IP地址控件自带验证功能,确保输入的是有效的IPv4地址
  2. 样式统一:通过通用属性保持与其他输入控件的样式一致性
  3. 事件处理:正确处理 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. 如何与其他控件交互