开发一个ocx控件,属性页中加了一个IP ADDRESS控件,如何把它与某个属性名联系起来呢?
edit,checkbox等有值属性的控件都没问题,但是IP ADDRESS没有对应的值属性,只有控件属性,可以创建一个CIpAddressCtrl对象,但没有了属性名选项. 可以如下面这样:
DDP_Check(pDX, IDC_CK_MULTISEL, m_bMultiSel, _T("MultiSelect") );
DDX_Check(pDX, IDC_CK_MULTISEL, m_bMultiSel);

解决方案 »

  1.   

    IP ADDRESS控件只有
    DDX_Control(pDX, IDC_IPADDRESS_DNSIP, m_edtDnsIP);
    初始值要自己加的(在初始化中):
    BYTE nFiled1 = 0;
    BYTE nFiled2 = 0;
    BYTE nFiled3 = 0;
    BYTE nFiled4 = 0; m_edtDnsIP.SetAddress(nFiled1,nFiled2,nFiled3,nFiled4);
      

  2.   

    IP地址控件没有相应的函数. 不过你可以自己写个:
    void AFXAPI DDX_IP(CDataExchange* pDX, int nIDC, DWORD& value)
    {
    HWND hWndCtrl = pDX->PrepareCtrl(nIDC);
    if (pDX->m_bSaveAndValidate)
    {
    ::SendMessage(hWndCtrl, IPM_GETADDRESS, 0, (LPARAM)&value);
    }
    else
    {
    ::SendMessage(hWndCtrl, IPM_SETADDRESS, 0, (LPARAM)value);
    }
    }
    void AFXAPI DDX_IP(CDataExchange* pDX, int nIDC, CString& value)
    {
    HWND hWndCtrl = pDX->PrepareCtrl(nIDC);
    if (pDX->m_bSaveAndValidate)
    {
    DWORD dw = 0;
    ::SendMessage(hWndCtrl, IPM_GETADDRESS, 0, (LPARAM)&dw);
    value.Format(_T("%d.%d.%d.%d"), 
    FIRST_IPADDRESS(dw),
    SECOND_IPADDRESS(dw),
    THIRD_IPADDRESS(dw),
    FOURTH_IPADDRESS(dw));
    }
    else
    {
    BYTE b1,b2,b3,b4;
    b1 = b2 = b3 = b4 = 0;
    LPCTSTR  p = value;
    b1 =_ttoi(p);
    while(*p != 0 && *p != '.') ++p;
    if(*p != 0) ++p;
    b2 = _ttoi(p);
    while(*p != 0 && *p != '.') ++p;
    if(*p != 0) ++p;
    b3 = _ttoi(p);
    while(*p != 0 && *p != '.') ++p;
    if(*p != 0) ++p;
    b4 = _ttoi(p);
    ::SendMessage(hWndCtrl, IPM_SETADDRESS, 0, MAKEIPADDRESS(b1,b2,b3,b4));
    }
    }DDP 函数 用 DDP_Text就可以了. 适合 串和 DWORD
      

  3.   

    补充一下: 要DDP_Text 有效果,还有重要的一点:
    响应此控件的 通知:IPN_FIELDCHANGEDvoid CXXXXXPropPage::OnFieldchangedIp(NMHDR* pNMHDR, LRESULT* pResult) 
    {
    // TODO: Add your control notification handler code here
    SetControlStatus(IDC_IP, TRUE);
    SetModifiedFlag(TRUE);
    *pResult = 0;
    }