MFC如何从另一个类获得CString到CRegSettings类

MFC how to get CString from another Class to CRegSettings class

本文关键字:CString CRegSettings MFC 另一个      更新时间:2023-10-16

我有一个关于保存编辑文本注册表的问题。我在主类保存到注册表文本数据,我做了另一个注册表类调用CRegSettings所以这个类做enum每次当我点击按钮MyItem 0, MyItem 1 .

我的问题是我不能得到CString文本到这个CRegSettings类,这个类没有DoDataExchange所以当我这样做的时候,它变成了错误"CMySettingsItem::DoDataExchange':递归在所有控制路径"所以它不起作用,我不能得到CString从主类到这个类,有人知道怎么做吗?谢谢。

这是我的代码。

Main.cpp

// CNewConnectionDlg dialog
IMPLEMENT_DYNAMIC(CNewConnectionDlg, CDialog)

CNewConnectionDlg::CNewConnectionDlg(CWnd* pParent /*=NULL*/)
: CDialog(CNewConnectionDlg::IDD, pParent)
    , m_csIp(_T("localhost"))
    , m_csPort(_T("22"))
    , m_csUsername(_T("Username"))
    , m_csPassword(_T("Password"))
{
}
class CMySettingsItem : public CRegSettings
{
public:
    DWORD Id;
    CString m_Password;
    CString Password;

    BEGIN_REG_MAP(CMySettingsItem)
        REG_ITEM(Id, 1)
        REG_ITEM(Password, m_Password)
    END_REG_MAP()
protected:
    virtual void DoDataExchange(CDataExchange* pDX);
};
// Sample application configuration
class CMySettings : public CRegSettings
{
public:
    DWORD RootId; // DWORD option
    CString RootName; // String option
    std::string FullName;
    // list of options (CMySettingsItem)
    CSimpleArray<CMySettingsItem> Profile;  // ATL CSimpleArray
    //std::list<CMySettingsItem> ProfileList;   // STL list
    CMySettingsItem SubItem; // Subitem test
    BEGIN_REG_MAP(CMySettings)
        REG_ITEM(RootId, 1)
        REG_ITEM(RootName, "Profile")
        REG_ITEM_STL(FullName, "Profile")
        REG_ITEM_SIMPLE_ARRAY(Profile)
        //REG_ITEM_LIST(ProfileList)
    END_REG_MAP()
};
void CMySettingsItem::DoDataExchange(CDataExchange* pDX)
{
    CMySettingsItem::DoDataExchange(pDX);
    DDX_Text(pDX, IDC_PASSWORD, m_Password);

}
CNewConnectionDlg::~CNewConnectionDlg()
{   
    AfxGetApp()->WriteProfileString("Settings", "UserName", m_csUsername);
    AfxGetApp()->WriteProfileString("Settings", "IP",       m_csIp);
    AfxGetApp()->WriteProfileString("Settings", "Port",     m_csPort);
    AfxGetApp()->WriteProfileString("Settings", "Password", m_csPassword);


    CMySettings configuration(HKEY_CURRENT_USER, "Software\MyItem\Item");
    // Load configuration
    if(configuration.Load() != ERROR_SUCCESS)
        printf("failed to loadn");
    // Use loaded configuration
    configuration.RootId++;
    CMySettingsItem item;
    item.Id = configuration.RootId;
    configuration.Profile.Add(item); // CSimpleArray
    //configuration.ProfileList.push_back(item); // list
    // Save new configuration
    if(configuration.Save() != ERROR_SUCCESS)
        printf("failed to saven");

}

void CNewConnectionDlg::DoDataExchange(CDataExchange* pDX)
{
    CDialog::DoDataExchange(pDX);
    DDX_Text(pDX, IDC_IP, m_csIp);
    DDV_MaxChars(pDX, m_csIp, 255);
    DDX_Text(pDX, IDC_PORT, m_csPort);
    DDV_MaxChars(pDX, m_csPort, 6);
    DDX_Text(pDX, IDC_USERNAME, m_csUsername);
    DDV_MaxChars(pDX, m_csUsername, 20);
    DDX_Text(pDX, IDC_PASSWORD, m_csPassword);
    DDV_MaxChars(pDX, m_csPassword, 255);
}

BEGIN_MESSAGE_MAP(CNewConnectionDlg, CDialog)
    ON_EN_CHANGE(IDC_PASSWORD, &CNewConnectionDlg::OnEnChangePassword)
    ON_EN_CHANGE(IDC_USERNAME, &CNewConnectionDlg::OnEnChangeUsername)
END_MESSAGE_MAP()
void CNewConnectionDlg::OnEnChangePassword()
{
}

void CNewConnectionDlg::OnEnChangeUsername()
{
}

和头

Main.h

#pragma once
#include "InnerDlg.h"
#include <afxtempl.h>
class CNewConnectionDlg : public CDialog
{
    DECLARE_DYNAMIC(CNewConnectionDlg)
public:
    CNewConnectionDlg(CWnd* pParent = NULL);   // standard constructor
    virtual ~CNewConnectionDlg();
     CNewConnectionDlg(const CString sSection, const CString sArrayName);
    // Dialog Data
    enum { IDD = IDD_NEWCONNECTION };

public:
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
protected:
    DECLARE_MESSAGE_MAP()
public:
    // The server ip or name
    CString m_csIp;
    // The negotiating port on the server
    CString m_csPort;
    // Username for the server
    CString m_csUsername;
    // Password for the server
    CString m_csPassword;

    afx_msg void OnEnChangePassword();
    afx_msg void OnEnChangeUsername();
};

DoDataExchange仅用于用户界面类,例如基于cdialog的类。它用于将屏幕上的用户界面元素与该对象的成员变量连接起来。因此,您的数据位于m_csIp, m_csPort, m_csUsername和m_csPassword成员中。您只需要将其分配给CMySettingsItem实例的相关成员。

例如:

item.m_Password = m_csPassword;